W ^ X ("escribir xo ejecutar", pronunciado W xor X ) es una característica de seguridad en sistemas operativos y máquinas virtuales . Es una memoria política de protección de modo que cada página en un proceso de 's o kernel ' s espacio de direcciones puede ser escribible o ejecutable, pero no ambos. Sin dicha protección, un programa puede escribir (como datos "W") instrucciones de CPU en un área de memoria destinada a datos y luego ejecutar (como ejecutable "X"; o leer-ejecutar "RX") esas instrucciones. Esto puede resultar peligroso si el autor de la memoria es malintencionado. W ^ X es la terminología similar a Unix para un uso estricto del concepto general de protección del espacio ejecutable , controlado a través de la mprotect
llamada al sistema.
W ^ X es relativamente simple en procesadores que soporte permisos de página de grano fino, tales como Sun 's SPARC y SPARC64 AMD ' s AMD64 , Hewlett-Packard 's PA-RISC , (originalmente de HP Digital Equipment Corporation ' s) alfa , y ARM .
W ^ X también se ha aplicado a los permisos de escritura / ejecución del sistema de archivos para mitigar las vulnerabilidades de escritura de archivos (como en la memoria) y la persistencia del atacante. [1] Hacer cumplir restricciones en los permisos de archivos también puede cerrar las brechas en la aplicación de W ^ X causadas por archivos mapeados en memoria. [2] [3] Prohibir completamente el uso de código nativo arbitrario también puede mitigar las vulnerabilidades del kernel y de la CPU no expuestas a través del código existente en la computadora. [4]
Compatibilidad
Algunos de los primeros procesadores Intel 64 carecían del bit NX requerido para W ^ X, pero esto apareció en chips posteriores. En procesadores más limitados como Intel i386 , W ^ X requiere usar el límite del segmento de código CS como una " línea en la arena ", un punto en el espacio de direcciones por encima del cual no se permite la ejecución y se encuentran los datos, y por debajo del cual está permitido y se colocan páginas ejecutables. Este esquema se utilizó en Exec Shield . [5]
Los cambios en el vinculador generalmente se requieren para separar los datos del código (como trampolines que son necesarios para las funciones del vinculador y de tiempo de ejecución de la biblioteca ). El interruptor que permite la mezcla se suele llamar en sistemas similares a Unix [6]execstack
W ^ X también puede plantear un problema menor para la compilación justo a tiempo , que implica que un intérprete genere código de máquina sobre la marcha y luego lo ejecute. La solución simple utilizada por la mayoría, incluido Firefox , implica simplemente hacer que la página sea ejecutable después de que el intérprete haya terminado de escribir el código de máquina, usándolo VirtualProtect
en Windows o mprotect
en Unix-like. La otra solución implica mapear la misma región de memoria a dos páginas, una con RW y la otra con RX. [7] No hay un consenso simple sobre qué solución es más segura: los partidarios del último enfoque creen que permitir que se ejecute una página que alguna vez se ha escrito anula el punto de W ^ X (existe una política de SELinux para controlar tales operaciones llamadas allow_execmod
) y que la aleatorización del diseño del espacio de direcciones haría que sea seguro colocar ambas páginas en el mismo proceso. Los partidarios del primer enfoque creen que el segundo enfoque solo es seguro cuando las dos páginas se asignan a dos procesos separados, y la comunicación entre procesos sería más costosa que llamar mprotect
.
Historia
W ^ X se implementó por primera vez en OpenBSD 3.3, lanzado en mayo de 2003. En 2004, Microsoft introdujo una característica similar llamada DEP ( Prevención de ejecución de datos ) en Windows XP. Hay características similares disponibles para otros sistemas operativos, incluidos los parches PaX y Exec Shield para Linux , y la implementación de PaX de NetBSD . En Red Hat Enterprise Linux (y automáticamente CentOS ) versión 5, o con Linux Kernel 2.6.18-8, SELinux recibido los allow_execmem
, allow_execheap
y allow_execmod
las políticas que proporcionan W ^ X cuando está desactivado.
Aunque W ^ X (o DEP) solo ha protegido programas de usuario durante la mayor parte de su existencia, en 2012 Microsoft lo extendió al kernel de Windows en las arquitecturas x86 y ARM. [8] A finales de 2014 y principios de 2015, se añadió W ^ X en el kernel de OpenBSD en la arquitectura AMD64. [9] A principios de 2016, W ^ X se implementó por completo en el kernel AMD64 de NetBSD y parcialmente en el kernel i386.
A partir de Firefox 46 en 2016, la máquina virtual de Firefox para JavaScript también implementa la política W ^ X. [7]
Ver también
- Prevención de ejecución de datos (DEP)
- Protección de espacio ejecutable
Referencias
- ^ "Aplicar restricciones execve () para API> 28" .
- ^ "Noticias del núcleo de Zack" .
- ^ "SARA un nuevo LSM apilado" .
- ^ "Fortalecimiento del kernel de Linux (serie 2.0.x)" .
- ^ "i386 W ^ X" . 17 de abril de 2003 . Consultado el 19 de junio de 2014 .
- ^ - Manual de administración del sistema Linux
- ^ a b "Código W ^ X JIT habilitado en Firefox" . Consultado el 29 de abril de 2016 .
- ^ "Mejoras de mitigación de explotación en Win8" .
- ^ "Protección W ^ X para el kernel AMD64" .
enlaces externos
- Anuncio de OpenBSD-3.3, lanzamiento público de W ^ X
- Diapositivas de una presentación del desarrollador principal de OpenBSD, Theo de Raadt, que cubre W ^ X