El bit NX (no-execute) es una tecnología utilizada en las CPU para segregar áreas de un espacio de direcciones virtuales para almacenar datos o instrucciones del procesador. Un sistema operativo con soporte para el bit NX puede marcar ciertas áreas de un espacio de direcciones como no ejecutables. El procesador se negará a ejecutar cualquier código que resida en estas áreas del espacio de direcciones. La técnica general, conocida como protección del espacio ejecutable , también llamada Write XOR Execute , se utiliza para evitar que ciertos tipos de software malicioso se apoderen de las computadoras insertando su código en el área de almacenamiento de datos de otro programa y ejecutando su propio código desde dentro de esta sección; una clase de tales ataques se conoce como ataque de desbordamiento de búfer .
El término bit NX se originó con Advanced Micro Devices (AMD), como un término de marketing. Intel comercializa la característica como el bit XD (deshabilitar ejecución). La arquitectura MIPS se refiere a la característica como bit XI (inhibir ejecución). La arquitectura ARM se refiere a la característica, que se introdujo en ARMv6 , como XN (nunca ejecutar). [1] El término bit NX en sí mismo a veces se usa para describir tecnologías similares en otros procesadores.
Los procesadores x86 , desde el 80286 , incluían una capacidad similar implementada a nivel de segmento . Sin embargo, casi todos los sistemas operativos para los procesadores x86 80386 y posteriores implementan el modelo de memoria plana , por lo que no pueden utilizar esta capacidad. No había ninguna bandera "Ejecutable" en la entrada de la tabla de páginas (descriptor de página) en esos procesadores, hasta que, para que esta capacidad estuviera disponible para los sistemas operativos que utilizaban el modelo de memoria plana, AMD agregó un bit "no-execute" o NX a la entrada de la tabla de páginas en su arquitectura AMD64 , proporcionando un mecanismo que puede controlar la ejecución por página en lugar de por segmento completo.
Intel implementó una característica similar en su procesador Itanium ( Merced ) —con arquitectura IA-64— en 2001, pero no la llevó a las familias de procesadores x86 más populares ( Pentium , Celeron , Xeon , etc.). En la arquitectura x86 fue implementada por primera vez por AMD, como el bit NX , para su uso en su línea de procesadores AMD64 , como el Athlon 64 y el Opteron . [2]
Después de la decisión de AMD de incluir esta funcionalidad en su conjunto de instrucciones AMD64, Intel implementó la característica similar del bit XD en los procesadores x86 comenzando con los procesadores Pentium 4 basados en iteraciones posteriores del núcleo Prescott. [3] El bit NX se refiere específicamente al bit número 63 (es decir, el bit más significativo) de una entrada de 64 bits en la tabla de páginas . Si este bit se establece en 0, entonces se puede ejecutar código desde esa página; si se establece en 1, no se puede ejecutar código desde esa página y se asume que todo lo que reside allí son datos. Solo está disponible con los formatos de tabla de páginas de modo largo (modo de 64 bits) o de extensión de dirección física (PAE) heredados, pero no con el formato de tabla de páginas de 32 bits original de x86 porque las entradas de la tabla de páginas en ese formato carecen del bit 64 utilizado para deshabilitar y habilitar la ejecución.
Windows XP SP2 y versiones posteriores admiten la prevención de ejecución de datos (DEP).
En ARMv6 , se introdujo un nuevo formato de entrada de tabla de páginas; incluye un bit de "ejecutar nunca". [1] Para ARMv8-A , descriptores de bloque y página VMSAv8-64 y descriptores de bloque y página de descriptor largo VMSAv8-32, para traducciones de etapa 1 tienen bits de "ejecutar nunca" para modos privilegiados y no privilegiados, y los descriptores de bloque y página para traducciones de etapa 2 tienen un solo bit de "ejecutar nunca" (dos bits debido a la característica ARMv8.2-TTS2UXN); los descriptores de tabla de traducción de descriptor corto VMSAv8-32 en el nivel 1 tienen bits de "ejecutar nunca" para modos privilegiados y no privilegiados y en el nivel 2 tienen un solo bit de "ejecutar nunca". [4]
A partir de la cuarta edición del manual de arquitectura Alpha, DEC (ahora HP) Alpha tiene un bit de error de ejecución en las entradas de la tabla de páginas con OpenVMS , Tru64 UNIX y Alpha Linux PALcode . [5]
La MMU de referencia SPARC para Sun SPARC versión 8 tiene valores de permiso de Solo lectura, Lectura/Escritura, Lectura/Ejecución y Lectura/Escritura/Ejecución en las entradas de la tabla de páginas, [6] aunque no todos los procesadores SPARC tienen una MMU de referencia SPARC.
Una MMU de la versión 9 de SPARC puede proporcionar, pero no está obligada a proporcionar, cualquier combinación de permisos de lectura/escritura/ejecución. [7] Una entrada de tabla de traducción en un búfer de almacenamiento de traducción en Oracle SPARC Architecture 2011, borrador D1.0.0 tiene bits ejecutables y escribibles separados. [8]
Las entradas de la tabla de páginas para las tablas de páginas con hash de IBM PowerPC tienen un bit de página de no ejecución. [9] Las entradas de la tabla de páginas para las tablas de páginas de árbol de base en Power ISA tienen bits de permiso separados que otorgan acceso de lectura/escritura y ejecución. [10]
Las entradas del buffer de traducción (TLB) y las entradas de la tabla de páginas en PA-RISC 1.1 y PA-RISC 2.0 admiten páginas de solo lectura, lectura/escritura, lectura/ejecución y lectura/escritura/ejecución. [11] [12]
Las entradas TLB en Itanium admiten páginas de solo lectura, lectura/escritura, lectura/ejecución y lectura/escritura/ejecución. [13]
A partir de la duodécima edición de los Principios de funcionamiento de z/Architecture , los procesadores z/Architecture pueden soportar la función de protección de ejecución de instrucciones, que agrega un bit en las entradas de la tabla de páginas que controla si se pueden ejecutar las instrucciones de una región, segmento o página determinados. [14]
Se han añadido los bits APX y XN (nunca ejecutar) en VMSAv6 [Arquitectura del sistema de memoria virtual]