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]
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]
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]
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]
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]