El atributo (bit) NX-Bit ( bit no ejecutable en la terminología de AMD ) o XD-Bit ( bit ejecutable inhabilitable en la terminología de Intel ) es un bit de inhibición de ejecución agregado a las páginas ( consulte las tablas .page ( inglés ) ) para implementar la capacidad de evitar la ejecución de datos como código. Se utiliza para evitar una vulnerabilidad de desbordamiento de búfer que permite que se ejecute código arbitrario de forma local o remota en el sistema atacado. La tecnología requiere soporte de software (ver DEP ) del kernel del sistema operativo .
La tecnología NX-bit solo puede funcionar bajo las siguientes condiciones:
Algunos programas no son compatibles con la tecnología NX-bit, por lo que el BIOS ofrece una opción para desactivar la tecnología.
NX ( XD ) es un atributo (bit) de una página de memoria en las arquitecturas x86 y x86-64, agregado para proteger el sistema de errores de programas, así como de virus , caballos de Troya y otros programas maliciosos que los utilizan.
AMD llamó al bit "NX" del inglés. no ejecutar . _ _ Intel llamó al mismo bit "XD" del inglés. e x ecución d inhabilitada .
Dado que los sistemas informáticos modernos dividen la memoria en páginas que tienen ciertos atributos, los diseñadores de procesadores han agregado otro: prohibir que el código se ejecute en una página. Es decir, dicha página se puede usar para almacenar datos, pero no código de programa. Si intenta transferir el control a dicha página , se producirá una interrupción , el sistema operativo tomará el control y finalizará el programa. El atributo de protección de ejecución ha estado presente durante mucho tiempo en otros[ ¿Qué? ] arquitecturas de microprocesador; sin embargo, en los sistemas x86, dicha protección se implementó solo a nivel de los segmentos del programa, cuyo mecanismo no ha sido utilizado por los sistemas operativos modernos durante mucho tiempo. Ahora también se añade a nivel de páginas individuales.
Los programas modernos se dividen claramente en segmentos de código ("texto"), datos ("datos"), datos no inicializados ("bss"), así como un área de memoria asignada dinámicamente, que se divide en un montón ("montón") y una pila de programas ("pila"). Si el programa se escribe sin errores, el puntero de instrucción nunca irá más allá de los segmentos de código; sin embargo, como resultado de errores de software, el control puede transferirse a otras áreas de la memoria. En este caso, el procesador dejará de realizar cualquier acción programada, pero ejecutará una secuencia aleatoria de comandos, para lo cual tomará los datos almacenados en estas áreas, hasta que encuentre una secuencia no válida o intente realizar una operación que viole el integridad del sistema, que activan el sistema de protección. En ambos casos, el programa fallará. Además, el procesador puede encontrar una secuencia interpretada como instrucciones de salto a una dirección ya atravesada. En este caso, el procesador entrará en un bucle infinito y el programa se “colgará”, ocupando el 100 % del tiempo del procesador. Para evitar tales casos, se introdujo este atributo adicional: si un área de memoria determinada no está destinada a almacenar el código del programa, todas sus páginas deben marcarse con un bit NX y, en caso de que se intente transferir el control allí, el procesador lo hará. genere una excepción y el sistema operativo bloqueará inmediatamente el programa, lo que indicará que el segmento está fuera de los límites (SIGSEGV).
El motivo principal para introducir este atributo no fue tanto proporcionar una respuesta rápida a tales errores como el hecho de que, muy a menudo, los atacantes utilizaban dichos errores para obtener acceso no autorizado a las computadoras, así como para escribir virus. Ha aparecido una gran cantidad de estos virus y gusanos que aprovechan las vulnerabilidades de los programas comunes.
Uno de los escenarios de ataque es que, utilizando un desbordamiento de búfer en un programa (a menudo un demonio que proporciona algún servicio de red ), un programa malicioso especialmente escrito ( exploit ) puede escribir algún código en el área de datos del programa vulnerable de tal manera. una forma en que, como resultado de un error, este código tomará el control y realizará acciones programadas por el atacante (a menudo una solicitud para ejecutar un programa de envoltorio del sistema operativo) , con el cual el atacante tomará el control del sistema vulnerable con los derechos del propietario del programa vulnerable; muy a menudo este es root ).
Un desbordamiento de búfer a menudo ocurre cuando un desarrollador de programa asigna un área de datos determinada (búfer) de una longitud fija, creyendo que esto será suficiente, pero luego, mientras manipula los datos, no verifica que vaya más allá de sus límites. Como resultado, los datos entrantes ocuparán áreas de la memoria que no estaban destinadas para ellos, destruyendo la información disponible allí. Muy a menudo, los búferes temporales se asignan dentro de los procedimientos (subrutinas), cuya memoria se asigna en la pila del programa, que también almacena las direcciones de retorno a la subrutina que llama. Habiendo examinado cuidadosamente el código del programa, un atacante puede detectar un error de este tipo , y ahora es suficiente para él transferir dicha secuencia de datos al programa, después de procesarlo, el programa reemplazará por error la dirección de retorno en la pila con la dirección necesaria. por el atacante, quien también transfirió algún código de programa bajo la apariencia de datos. Después de completar la subrutina, el comando de retorno (RET) del procedimiento transferirá el control no al procedimiento de llamada, sino al procedimiento del atacante: se obtiene el control sobre la computadora.
Gracias al atributo NX, esto se vuelve imposible. El área de la pila está marcada con el bit NX y está prohibida cualquier ejecución de código en ella. Ahora, si transfiere el control a la pila, la protección funcionará. Aunque se puede forzar el bloqueo del programa, se vuelve muy difícil usarlo para ejecutar código arbitrario (esto requeriría que el programa elimine por error la protección NX).
Sin embargo, algunos programas utilizan la ejecución de código en la pila o montón. Tal decisión puede deberse a la optimización , la compilación dinámica o simplemente a una solución técnica original. Normalmente, los sistemas operativos brindan llamadas al sistema para solicitar memoria con una función ejecutable habilitada exactamente para este propósito, pero muchos programas más antiguos siempre consideran que toda la memoria es ejecutable. Para ejecutar dichos programas en Windows, debe deshabilitar la función NX durante toda la sesión y, para habilitarla nuevamente, se requiere reiniciar. Aunque Windows tiene un mecanismo para incluir en la lista blanca los programas para los que DEP está deshabilitado, este método no siempre funciona correctamente. . Iris es un ejemplo de tal programa .
El bit NX es el bit más significativo de una entrada en las tablas de páginas de 64 bits utilizadas por el procesador para asignar memoria en un espacio de direcciones. Las tablas de páginas de 64 bits las utilizan los sistemas operativos que se ejecutan en modo de 64 bits o con la Extensión de dirección física (PAE) habilitada. Si el sistema operativo usa tablas de 32 bits, entonces no hay forma de usar la protección de ejecución de página.
Todos los procesadores de PC modernos de Intel y AMD admiten esta tecnología. Para instalar Windows 10 , su presencia es obligatoria; de lo contrario, el instalador no le permitirá instalar el sistema.