stringtranslate.com

Anillo de protección

Anillos de privilegios para x86 disponibles en modo protegido

En informática , los dominios de protección jerárquica , [1] [2] a menudo llamados anillos de protección , son mecanismos para proteger los datos y la funcionalidad contra fallas (mejorando la tolerancia a fallas ) y comportamiento malicioso (proporcionando seguridad informática ).

Los sistemas operativos informáticos proporcionan diferentes niveles de acceso a los recursos. Un anillo de protección es uno de dos o más niveles jerárquicos o capas de privilegios dentro de la arquitectura de un sistema informático . Esto generalmente se aplica mediante hardware mediante algunas arquitecturas de CPU que proporcionan diferentes modos de CPU a nivel de hardware o microcódigo . Los anillos están organizados en una jerarquía desde los más privilegiados (los más confiables, generalmente numerados con cero) hasta los menos privilegiados (los menos confiables, generalmente con el número de anillo más alto). En la mayoría de los sistemas operativos, el Anillo 0 es el nivel con más privilegios e interactúa más directamente con el hardware físico, como ciertas funciones de la CPU (por ejemplo, los registros de control) y los controladores de E/S. Con la creciente prevalencia de la virtualización , muchas CPU han agregado otro nivel (conceptualmente anillo -1) para el hipervisor .

Se proporcionan mecanismos especiales para permitir que un anillo exterior acceda a los recursos de un anillo interior de una manera predefinida, en lugar de permitir un uso arbitrario. Cerrar correctamente el acceso entre anillos puede mejorar la seguridad al impedir que los programas de un anillo o nivel de privilegio hagan un mal uso de los recursos destinados a programas de otro. Por ejemplo, se debe evitar que el software espía que se ejecuta como programa de usuario en Ring 3 encienda una cámara web sin informar al usuario, ya que el acceso al hardware debe ser una función de Ring 1 reservada para los controladores de dispositivos . Los programas como los navegadores web que se ejecutan en anillos con números más altos deben solicitar acceso a la red, un recurso restringido a un anillo con números más bajos.

Implementaciones

Los múltiples anillos de protección estuvieron entre los conceptos más revolucionarios introducidos por el sistema operativo Multics , un predecesor altamente seguro de la actual familia de sistemas operativos Unix . La computadora central GE 645 tenía cierto control de acceso al hardware, incluidos los mismos dos modos que tenían las otras máquinas de la serie GE-600, y permisos a nivel de segmento en su unidad de administración de memoria ("Unidad anexa"), pero eso no fue suficiente para proporcionar soporte completo para anillos en hardware, por lo que Multics los admitió capturando transiciones de anillos en software; [3] su sucesor, el Honeywell 6180 , los implementó en hardware, con soporte para ocho anillos; [4] Los anillos de protección en Multics estaban separados de los modos de CPU; El código en todos los anillos excepto el anillo 0, y algunos códigos de anillo 0, se ejecutaron en modo esclavo. [5]

Sin embargo, la mayoría de los sistemas de propósito general utilizan sólo dos anillos, incluso si el hardware en el que se ejecutan proporciona más modos de CPU que eso. Por ejemplo, Windows 7 y Windows Server 2008 (y sus predecesores) usan solo dos anillos, donde el anillo 0 corresponde al modo kernel y el anillo 3 al modo usuario , [6] porque las versiones anteriores de Windows NT se ejecutaban en procesadores que solo admitían dos protecciones. niveles. [7]

Muchas arquitecturas de CPU modernas (incluida la popular arquitectura Intel x86 ) incluyen alguna forma de protección de anillo, aunque el sistema operativo Windows NT , como Unix, no utiliza esta característica por completo. OS/2 lo hace hasta cierto punto, utilizando tres anillos: [8] anillo 0 para código del núcleo y controladores de dispositivo, anillo 2 para código privilegiado (programas de usuario con permisos de acceso de E/S) y anillo 3 para código sin privilegios (casi todos los usuarios). programas). En DOS , el kernel, los controladores y las aplicaciones normalmente se ejecutan en el anillo 3 (sin embargo, esto es exclusivo del caso en el que se utilizan controladores en modo protegido o extensores de DOS; como sistema operativo en modo real, el sistema se ejecuta efectivamente sin protección). mientras que 386 administradores de memoria como EMM386 se ejecutan en el anillo 0. Además de esto, EMM386 3.xx de DR-DOS puede ejecutar opcionalmente algunos módulos (como DPMS ) en el anillo 1. OpenVMS utiliza cuatro modos llamados (en orden de privilegios decrecientes) Kernel, Executive, Supervisor y User.

Un interés renovado en esta estructura de diseño llegó con la proliferación del software Xen VMM , la discusión en curso sobre monolíticos versus micronúcleos (particularmente en los grupos de noticias de Usenet y foros web ), la estructura de diseño Ring-1 de Microsoft como parte de su iniciativa NGSCB y Hipervisores basados ​​en virtualización x86 como Intel VT-x (anteriormente Vanderpool).

El sistema Multics original tenía ocho anillos, pero muchos sistemas modernos tienen menos. El hardware permanece consciente del timbre actual del hilo de instrucciones en ejecución en todo momento, con la ayuda de un registro de máquina especial. En algunos sistemas, a las áreas de memoria virtual se les asignan números de anillo en el hardware. Un ejemplo es el Data General Eclipse MV/8000 , en el que los tres bits superiores del contador de programa (PC) servían como registro de anillo. Por lo tanto, el código que se ejecuta con la PC virtual configurada en 0xE200000, por ejemplo, estaría automáticamente en el anillo 7, y llamar a una subrutina en una sección diferente de la memoria provocaría automáticamente una transferencia de anillo.

El hardware restringe severamente las formas en que se puede pasar el control de un anillo a otro y también impone restricciones sobre los tipos de acceso a la memoria que se pueden realizar entre anillos. Usando x86 como ejemplo, hay una estructura de puerta especial [ se necesita aclaración ] a la que hace referencia la instrucción de llamada que transfiere el control de forma segura [ se necesita aclaración ] hacia puntos de entrada predefinidos en anillos de nivel inferior (más confiables); Esto funciona como una llamada de supervisor en muchos sistemas operativos que utilizan la arquitectura en anillo. Las restricciones de hardware están diseñadas para limitar las oportunidades de violaciones de seguridad accidentales o maliciosas. Además, al anillo más privilegiado se le pueden otorgar capacidades especiales (como direccionamiento de memoria real que pasa por alto el hardware de memoria virtual).

La arquitectura ARM versión 7 implementa tres niveles de privilegios: aplicación (PL0), sistema operativo (PL1) e hipervisor (PL2). Inusualmente, el nivel 0 (PL0) es el nivel menos privilegiado, mientras que el nivel 2 es el nivel más privilegiado. [9] ARM versión 8 implementa cuatro niveles de excepción: aplicación (EL0), sistema operativo (EL1), hipervisor (EL2) y monitor/firmware seguro (EL3), para AArch64 [10] : D1-2454  y AArch32. [10] : G1-6013 

La protección de anillo se puede combinar con los modos de procesador (modo maestro/núcleo/privilegiado/supervisor frente a modo esclavo/sin privilegios/usuario) en algunos sistemas. Los sistemas operativos que se ejecutan en hardware que admita ambas pueden utilizar ambas formas de protección o sólo una.

El uso eficaz de la arquitectura en anillo requiere una estrecha cooperación entre el hardware y el sistema operativo. [ ¿ por qué? ] Los sistemas operativos diseñados para funcionar en múltiples plataformas de hardware pueden hacer un uso limitado de los anillos si no están presentes en todas las plataformas compatibles. A menudo, el modelo de seguridad se simplifica a "núcleo" y "usuario", incluso si el hardware proporciona una granularidad más fina a través de los anillos.

Modos

Modo supervisor

En términos informáticos, el modo supervisor es un indicador mediado por hardware que se puede cambiar mediante código que se ejecuta en software a nivel de sistema. Las tareas o subprocesos a nivel de sistema pueden [a] tener este indicador configurado mientras se ejecutan, mientras que las aplicaciones a nivel de usuario no. Este indicador determina si sería posible ejecutar operaciones de código de máquina, como modificar registros para varias tablas de descriptores o realizar operaciones como deshabilitar interrupciones. La idea de tener dos modos diferentes para operar proviene de "más potencia conlleva más responsabilidad": se confía en que un programa en modo supervisor nunca fallará, ya que una falla puede causar que todo el sistema informático colapse.

El modo supervisor es "un modo de ejecución en algunos procesadores que permite la ejecución de todas las instrucciones, incluidas las instrucciones privilegiadas. También puede dar acceso a un espacio de direcciones diferente, al hardware de administración de memoria y a otros periféricos. Este es el modo en el que el sistema operativo normalmente corre." [11]

En un kernel monolítico , el sistema operativo se ejecuta en modo supervisor y las aplicaciones se ejecutan en modo usuario. Otros tipos de sistemas operativos , como los que tienen exokernel o microkernel , no necesariamente comparten este comportamiento.

Algunos ejemplos del mundo de la PC:

La mayoría de los procesadores tienen al menos dos modos diferentes. Los procesadores x86 tienen cuatro modos diferentes divididos en cuatro anillos diferentes. Los programas que se ejecutan en el Anillo 0 pueden hacer cualquier cosa con el sistema, y ​​el código que se ejecuta en el Anillo 3 debería poder fallar en cualquier momento sin afectar al resto del sistema informático. Los anillos 1 y 2 rara vez se utilizan, pero se pueden configurar con diferentes niveles de acceso.

En la mayoría de los sistemas existentes, cambiar del modo de usuario al modo kernel tiene un alto costo asociado en rendimiento. Se ha medido, según la solicitud básica getpid, que cuesta entre 1000 y 1500 ciclos en la mayoría de las máquinas. De estos, sólo alrededor de 100 son para el cambio real (70 del espacio del usuario al kernel y 40 atrás), el resto es "sobrecarga del kernel". [12] [13] En el micronúcleo L3 , la minimización de esta sobrecarga redujo el costo total a alrededor de 150 ciclos. [12]

Maurice Wilkes escribió: [14]

... finalmente quedó claro que la protección jerárquica que proporcionaban los anillos no coincidía estrechamente con los requisitos del programador del sistema y ofrecía poca o ninguna mejora con respecto al sistema simple de tener solo dos modos. Los anillos de protección se prestaban para una implementación eficiente en hardware, pero poco más había que decir a su favor. [...] El atractivo de la protección de grano fino se mantuvo, incluso después de que se vio que los anillos de protección no proporcionaban la respuesta... Esto nuevamente resultó ser un callejón sin salida...

Para ganar rendimiento y determinismo, algunos sistemas colocan funciones que probablemente serían vistas como lógica de aplicación, en lugar de controladores de dispositivos, en modo kernel; Se citan como ejemplos aplicaciones de seguridad ( control de acceso , cortafuegos , etc.) y monitores de sistemas operativos. Al menos un sistema de gestión de bases de datos integrado, e X treme DB Kernel Mode , se ha desarrollado específicamente para la implementación en modo kernel, para proporcionar una base de datos local para funciones de aplicaciones basadas en kernel y para eliminar los cambios de contexto que de otro modo ocurrirían cuando interactúan las funciones del kernel. con un sistema de base de datos ejecutándose en modo usuario. [15]

A veces, las funciones también se mueven a través de anillos en la otra dirección. El kernel de Linux, por ejemplo, inyecta en los procesos una sección vDSO que contiene funciones que normalmente requerirían una llamada al sistema, es decir, una transición de anillo. En lugar de realizar una llamada al sistema, estas funciones utilizan datos estáticos proporcionados por el kernel. Esto evita la necesidad de una transición de anillo y, por lo tanto, es más liviano que una llamada al sistema. La función gettimeofday se puede proporcionar de esta manera.

Modo hipervisor

Las CPU recientes de Intel y AMD ofrecen instrucciones de virtualización x86 para que un hipervisor controle el acceso al hardware del Anillo 0. Aunque son mutuamente incompatibles, tanto Intel VT-x (con nombre en código "Vanderpool") como AMD-V (con nombre en código "Pacifica") crean un nuevo "Anillo −1" para que un sistema operativo invitado pueda ejecutar operaciones del Anillo 0 de forma nativa sin afectar a otros. invitados o el sistema operativo anfitrión.

Para ayudar a la virtualización, VT-x y SVM insertan un nuevo nivel de privilegio debajo del Anillo 0. Ambos agregan nueve nuevas instrucciones de código de máquina que solo funcionan en el "Anillo -1", destinadas a ser utilizadas por el hipervisor. [dieciséis]

Nivel de privilegio

Un nivel de privilegio en el conjunto de instrucciones x86 controla el acceso del programa que se ejecuta actualmente en el procesador a recursos como regiones de memoria, puertos de E/S e instrucciones especiales. Hay 4 niveles de privilegios que van desde 0, que es el más privilegiado, hasta 3, que es el menos privilegiado. La mayoría de los sistemas operativos modernos usan el nivel 0 para el kernel/ejecutivo y usan el nivel 3 para los programas de aplicación. Cualquier recurso disponible para el nivel n también está disponible para los niveles 0 an, por lo que los niveles de privilegio son anillos. Cuando un proceso con menos privilegios intenta acceder a un proceso con mayores privilegios, se informa al sistema operativo una excepción de falla de protección general .

No es necesario utilizar los cuatro niveles de privilegios. Los sistemas operativos actuales con una amplia participación de mercado, incluidos Microsoft Windows , macOS , Linux , iOS y Android , utilizan principalmente un mecanismo de paginación con solo un bit para especificar el nivel de privilegio como Supervisor o Usuario (U/S Bit). Windows NT utiliza el sistema de dos niveles. [17] Los programas en modo real en 8086 se ejecutan en el nivel 0 (nivel de privilegio más alto), mientras que el modo virtual en 8086 ejecuta todos los programas en el nivel 3. [18]

Los posibles usos futuros de los múltiples niveles de privilegios admitidos por la familia x86 ISA incluyen la creación de contenedores y las máquinas virtuales . El kernel de un sistema operativo host podría usar instrucciones con acceso completo a privilegios ( modo kernel ), mientras que las aplicaciones que se ejecutan en el sistema operativo invitado en una máquina virtual o contenedor podrían usar el nivel más bajo de privilegios en modo usuario. La máquina virtual y el kernel del sistema operativo invitado podrían usar un nivel intermedio de privilegio de instrucción para invocar y virtualizar operaciones en modo kernel, como llamadas al sistema, desde el punto de vista del sistema operativo invitado. [19]

IOPL

El indicador IOPL ( nivel de privilegios de E/S ) es un indicador que se encuentra en todas las CPU x86 compatibles con IA-32 . Ocupa los bits 12 y 13 del registro FLAGS . En modo protegido y modo largo , muestra el nivel de privilegio de E/S del programa o tarea actual. El nivel de privilegio actual (CPL) (CPL0, CPL1, CPL2, CPL3) de la tarea o programa debe ser menor o igual que el IOPL para que la tarea o programa acceda a los puertos de E/S .

La IOPL se puede cambiar usando POPF(D)y IRET(D)solo cuando el nivel de privilegio actual es Anillo 0.

Además de IOPL, los permisos del puerto de E/S en el TSS también participan en la determinación de la capacidad de una tarea para acceder a un puerto de E/S.

Misceláneas

En los sistemas x86, la virtualización de hardware x86 ( VT-x y SVM ) se denomina "anillo -1", el modo de gestión del sistema se denomina "anillo -2", el motor de gestión Intel y el procesador de seguridad de plataforma AMD a veces se denominan "anillo −3". [20]

Uso de funciones de hardware

Muchas arquitecturas de hardware de CPU proporcionan mucha más flexibilidad que la que aprovechan los sistemas operativos que normalmente ejecutan. El uso adecuado de modos complejos de CPU requiere una cooperación muy estrecha entre el sistema operativo y la CPU y, por lo tanto, tiende a vincular el sistema operativo a la arquitectura de la CPU. Cuando el sistema operativo y la CPU están diseñados específicamente el uno para el otro, esto no es un problema (aunque es posible que algunas características del hardware aún no se exploten), pero cuando el sistema operativo está diseñado para ser compatible con múltiples arquitecturas de CPU diferentes, una gran parte de El sistema operativo puede ignorar las funciones del modo CPU. Por ejemplo, la razón por la que Windows utiliza sólo dos niveles (anillo 0 y anillo 3) es que algunas arquitecturas de hardware que eran compatibles en el pasado (como PowerPC o MIPS ) implementaron sólo dos niveles de privilegio. [6]

Multics era un sistema operativo diseñado específicamente para una arquitectura de CPU especial (que a su vez fue diseñada específicamente para Multics) y aprovechaba al máximo los modos de CPU disponibles. Sin embargo, fue una excepción a la regla. Hoy en día, este alto grado de interoperabilidad entre el sistema operativo y el hardware no suele ser rentable, a pesar de las posibles ventajas para la seguridad y la estabilidad.

En última instancia, el propósito de distintos modos operativos para la CPU es brindar protección de hardware contra la corrupción accidental o deliberada del entorno del sistema (y las correspondientes violaciones de la seguridad del sistema) por parte del software. Sólo se permite la ejecución de partes "confiables" del software del sistema en el entorno sin restricciones del modo kernel, y luego, en diseños paradigmáticos, sólo cuando sea absolutamente necesario. El resto del software se ejecuta en uno o más modos de usuario. Si un procesador genera una condición de falla o excepción en modo de usuario, en la mayoría de los casos la estabilidad del sistema no se ve afectada; Si un procesador genera una condición de falla o excepción en modo kernel, la mayoría de los sistemas operativos detendrán el sistema con un error irrecuperable. Cuando existe una jerarquía de modos (seguridad basada en anillos), las fallas y excepciones en un nivel de privilegio pueden desestabilizar solo los niveles de privilegio con números más altos. Por lo tanto, una falla en el Anillo 0 (el modo kernel con el privilegio más alto) colapsará todo el sistema, pero una falla en el Anillo 2 solo afectará a los Anillos 3 y posteriores y al propio Anillo 2, como máximo.

Las transiciones entre modos quedan a discreción del subproceso en ejecución cuando la transición es de un nivel de privilegio alto a uno de privilegio bajo (como de los modos kernel a usuario), pero las transiciones de niveles de privilegio más bajos a más altos sólo pueden tener lugar a través de métodos seguros. , "puertas" controladas por hardware que se atraviesan ejecutando instrucciones especiales o cuando se reciben interrupciones externas.

Los sistemas operativos Microkernel intentan minimizar la cantidad de código que se ejecuta en modo privilegiado, por motivos de seguridad y elegancia , pero en última instancia sacrifican el rendimiento.

Ver también

Notas

  1. ^ Por ejemplo, en IBM OS/360 hasta z/OS , algunas tareas del sistema se ejecutan en la clave de estado del problema 0.

Referencias

  1. ^ Karger, Paul A.; Herbert, Andrew J. (1984). "Una arquitectura de capacidad aumentada para respaldar la seguridad reticular y la trazabilidad del acceso ". 1984 Simposio IEEE sobre seguridad y privacidad. pag. 2.doi : 10.1109 /SP.1984.10001. ISBN 0-8186-0532-4. S2CID  14788823.
  2. ^ Carpeta, W. (2001). "Diseño e implementación del kernel del agente móvil J-SEAL2". Actas del Simposio de 2001 sobre aplicaciones e Internet . págs. 35–42. doi :10.1109/SAINT.2001.905166. ISBN 0-7695-0942-8. S2CID  11066378.
  3. ^ "Una arquitectura de hardware para implementar anillos de protección". Comunicaciones de la ACM . 15 (3). Marzo de 1972 . Consultado el 27 de septiembre de 2012 .
  4. ^ "Glosario Multics - anillo" . Consultado el 27 de septiembre de 2012 .
  5. ^ La memoria virtual Multics, parte 2 (PDF) . Sistemas de información Honeywell. Junio ​​de 1972. págs. 160-161.
  6. ^ ab Russinovich, Mark E.; David A. Salomón (2005). Componentes internos de Microsoft Windows (4 ed.). Prensa de Microsoft. págs.16. ISBN 978-0-7356-1917-3.
  7. ^ Russinovich, Mark (2012). Aspectos internos de Windows Parte 1 (6ª ed.). Redmond, Washington: Microsoft Press. pag. 17.ISBN _ 978-0-7356-4873-9. La razón por la que Windows utiliza sólo dos niveles es que algunas arquitecturas de hardware que fueron compatibles en el pasado (como Compaq Alpha y Silicon Graphics MIPS ) implementaron sólo dos niveles de privilegio.
  8. ^ "Referencia del controlador de dispositivo de presentación para OS/2 - 5. Introducción a los controladores de presentación de OS/2". Archivado desde el original el 15 de junio de 2015 . Consultado el 13 de junio de 2015 .
  9. ^ Manual de referencia de arquitectura ARM Edición ARMv7-A y ARMv7-R. Arm Ltd. pag. B1-1136.
  10. ^ ab Manual de referencia de arquitectura de Arm Armv8, para arquitectura de perfil A. brazo ltd.
  11. ^ "modo supervisor". FOLDOC . 15 de febrero de 1995.
  12. ^ ab Jochen Liedtke (diciembre de 1995). "Sobre la construcción de µ-Kernel". Proc. 15º Simposio ACM sobre principios de sistemas operativos (SOSP) .
  13. ^ Ousterhout, JK (1990). ¿Por qué los sistemas operativos no son cada vez más rápidos que el hardware? . Conferencia de verano de Usenix A. naheim, CA. págs. 247-256.
  14. ^ Maurice Wilkes (abril de 1994). "Sistemas operativos en un mundo cambiante". Revisión de los sistemas operativos ACM SIGOPS . 28 (2): 9–21. doi : 10.1145/198153.198154 . ISSN  0163-5980. S2CID  254134.
  15. ^ Gorine, Andrei; Krivolapov, Alexander (mayo de 2008). "Bases de datos en modo kernel: una tecnología DBMS para aplicaciones de alto rendimiento". Diario del Dr. Dobb .
  16. ^ Dornan, Andy (1 de noviembre de 2005). "Intel VT frente a AMD Pacifica". CMP. Archivado desde el original el 30 de mayo de 2013 . Consultado el 11 de noviembre de 2012 .
  17. ^ Russinovich, Mark E.; Salomón, David A. (2005). Componentes internos de Microsoft Windows (4ª ed.). Prensa de Microsoft. pag. 16.ISBN _ 978-0-7356-1917-3.
  18. ^ Sunil Mathur. Microprocesador 8086: Arquitectura, programación e interfaz (edición de Economía del Este). Aprendizaje de PHI.
  19. ^ Anderson, Thomas; Dahlin, Michael (21 de agosto de 2014). "2.2". Sistemas operativos: principios y práctica (2ª ed.). Libros recursivos. ISBN 978-0985673529.
  20. ^ De Gelas, Johan. "Virtualización de hardware: aspectos prácticos". AnandTech . Consultado el 13 de marzo de 2021 .

Otras lecturas