stringtranslate.com

Prevención de acceso al modo supervisor

La prevención de acceso en modo supervisor ( SMAP ) es una característica de algunas implementaciones de CPU , como la microarquitectura Intel Broadwell , que permite que los programas en modo supervisor configuren opcionalmente asignaciones de memoria en el espacio de usuario de modo que el acceso a esas asignaciones desde el modo supervisor provoque una trampa. Esto hace que sea más difícil para los programas maliciosos "engañar" al núcleo para que use instrucciones o datos de un programa en el espacio de usuario. [1] [2]

Historia

La prevención de acceso en modo supervisor está diseñada para complementar la prevención de ejecución en modo supervisor (SMEP), que se presentó anteriormente. La SMEP se puede utilizar para evitar que el modo supervisor ejecute código de espacio de usuario de forma involuntaria. SMAP extiende esta protección a las lecturas y escrituras. [2]

Beneficios

Sin la Prevención de Acceso al Modo Supervisor, el código supervisor normalmente tiene acceso completo de lectura y escritura a las asignaciones de memoria del espacio de usuario (o tiene la capacidad de obtener acceso completo). Esto ha llevado al desarrollo de varios exploits de seguridad, incluidos los exploits de escalada de privilegios , que funcionan haciendo que el núcleo acceda a la memoria del espacio de usuario cuando no tenía intención de hacerlo. [3] Los sistemas operativos pueden bloquear estos exploits utilizando SMAP para forzar accesos no deseados a la memoria del espacio de usuario para activar errores de página . Además, SMAP puede exponer código de núcleo defectuoso que no sigue los procedimientos previstos para acceder a la memoria del espacio de usuario. [1]

Sin embargo, el uso de SMAP en un sistema operativo puede generar un tamaño de kernel más grande y accesos más lentos a la memoria del espacio de usuario desde el código supervisor, porque SMAP debe deshabilitarse temporalmente cada vez que el código supervisor intenta acceder a la memoria del espacio de usuario. [4]

Detalles técnicos

Los procesadores indican soporte para la Prevención de acceso al modo Supervisor a través de la hoja CPUID de Funciones extendidas .

SMAP se habilita cuando la paginación de memoria está activa y el bit SMAP en el registro de control CR4 está configurado. SMAP se puede deshabilitar temporalmente para accesos explícitos a la memoria configurando el indicador EFLAGS.AC (verificación de alineación). Las instrucciones stac(Establecer indicador AC) y clac(Borrar indicador AC) se pueden utilizar para configurar o borrar fácilmente el indicador. [5]

Cuando el bit SMAP en CR4 está activado, las lecturas y escrituras explícitas de memoria en páginas de modo usuario realizadas por código que se ejecuta con un nivel de privilegio menor a 3 siempre generarán un error de página si el indicador EFLAGS.AC no está activado. Las lecturas y escrituras implícitas (como las realizadas en tablas de descriptores ) en páginas de modo usuario siempre generarán un error de página si SMAP está habilitado, independientemente del valor de EFLAGS.AC. [5]

Compatibilidad con sistemas operativos

El soporte del kernel de Linux para la Prevención de acceso en modo supervisor fue implementado por H. Peter Anvin . [1] Se fusionó con el kernel principal de Linux 3.7 (lanzado en diciembre de 2012) y está habilitado de manera predeterminada para los procesadores que admiten la función. [4]

FreeBSD admite la prevención de ejecución en modo supervisor desde 2012 [6] y la prevención de acceso en modo supervisor desde 2018. [7]

OpenBSD ha soportado la Prevención de Acceso al Modo Supervisor y la Prevención de Ejecución del Modo Supervisor relacionada desde 2012, [8] siendo OpenBSD 5.3 la primera versión con soporte para la función habilitada. [9]

Maxime Villard implementó el soporte de NetBSD para la Prevención de Ejecución en Modo Supervisor (SMEP) en diciembre de 2015. [10] Maxime Villard también implementó el soporte para la Prevención de Acceso en Modo Supervisor (SMAP) en agosto de 2017. [11] NetBSD 8.0 fue la primera versión con ambas funciones admitidas y habilitadas. [12]

Jérôme Duval implementó el soporte de Haiku para la prevención de ejecución del modo supervisor (SMEP) en enero de 2018. [13]

macOS tiene soporte para SMAP al menos desde macOS 10.13 lanzado en 2017. [14]

Véase también

Referencias

  1. ^ abc Corbet, Jonathan (26 de septiembre de 2012). "Prevención de acceso en modo supervisor". LWN.net . Consultado el 4 de agosto de 2017 .
  2. ^ ab Mulnix, David (22 de mayo de 2015). "Descripción técnica de la familia de productos del procesador Intel Xeon D: Protección de acceso en modo supervisor (SMAP) 4". Intel . Consultado el 4 de agosto de 2017 .
  3. ^ Corbet, Jonathan (2009-07-20). "Diversión con punteros NULL, parte 1". LWN.net . Consultado el 2017-08-04 .
  4. ^ de Larabel, Michael (2012-10-02). "Intel SMAP llega para intentar mejorar la seguridad de Linux". Phoronix . Consultado el 4 de agosto de 2017 .
  5. ^ ab "Manual del desarrollador de software de arquitecturas Intel 64 e IA-32, volumen 3A: Guía de programación del sistema, parte 1" (PDF) . Intel. Julio de 2017 . Consultado el 4 de agosto de 2017 .
  6. ^ Belousov, Konstantin (1 de noviembre de 2012). «Revisión 242433» . Consultado el 19 de enero de 2018 .
  7. ^ Belousov, Konstantin (29 de julio de 2018). «Revisión 336876» . Consultado el 30 de julio de 2018 .
  8. ^ Henderson, Stuart (26 de marzo de 2017). "Re: ¿OpenBSD tiene implementación de SMEP y SMAP? ¿O MPX?" . Consultado el 4 de agosto de 2017 a través de marc.info .
  9. ^ "OpenBSD 5.3". OpenBSD . 2013-05-01 . Consultado el 2017-08-04 .
  10. ^ "Cambios significativos de NetBSD 7.0 a 8.0". NetBSD . 2017-10-12 . Consultado el 2018-01-09 .
  11. ^ Maxime Villard (23 de agosto de 2017). «amd64: compatibilidad con smap» . Consultado el 9 de enero de 2018 .
  12. ^ "Anuncio de NetBSD 8.0 (17 de julio de 2018)". NetBSD . 17 de julio de 2018 . Consultado el 29 de julio de 2018 .
  13. ^ "kernel: soporte para Intel SMAP y SMEP en x86_64". Haiku (sistema operativo) . 2018-01-30 . Consultado el 2018-09-04 .
  14. ^ "/osfmk/x86_64/idt64.s.auto.html". Apple Inc. 25 de septiembre de 2017. Consultado el 19 de septiembre de 2018 .