NX-Bit – No-eXecute
El NX-Bit (No-eXecute Bit o Bit de No Ejecución) es una característica de seguridad a nivel de hardware implementada en la unidad de gestión de memoria (MMU) de los procesadores modernos. Su propósito principal es delimitar las regiones de memoria virtual que contienen código ejecutable frente a aquellas destinadas exclusivamente al almacenamiento de datos, evitando la ejecución de código no autorizado o malicioso.
Mecanismo de Funcionamiento
En las arquitecturas de memoria paginada, la MMU utiliza entradas en las tablas de páginas para traducir direcciones virtuales a físicas y gestionar los permisos de acceso. El NX-bit utiliza el bit más significativo (bit 63) de cada entrada en la tabla de páginas para marcar una página concreta como no ejecutable:
Página con NX = 0: La CPU puede leer, escribir (según los permisos R/W) y ejecutar instrucciones alojadas en esa dirección de memoria.
Página con NX = 1: La CPU permite operaciones de lectura y escritura, pero si el puntero de instrucciones (RIP/EIP) intenta saltar a esa región para ejecutar código, la MMU genera una excepción de fallo de página por violación de protección (Protection Fault), abortando de inmediato el proceso.
+---------------------------------------------------------------+
| Entrada de Tabla de Páginas (PTE - 64 bits) |
+-----+---------------------------------------------------+-----+
| NX | Dirección de Marco Físico (Physical Frame) | R/W |
| (63)| | (1) |
+-----+---------------------------------------------------+-----+
|
+---> 0: Ejecución permitida (Código / .text)
+---> 1: Ejecución denegada (Pila / Heap / Datos) --> ¡Excepción por Hardware!
Nomenclatura según el Fabricante
Aunque la especificación técnica y la funcionalidad son idénticas, los fabricantes de hardware utilizan diferentes denominaciones comerciales:
AMD: NX-Bit (No-eXecute), introducido originalmente en la arquitectura AMD64 (x86-64).
Intel: XD-Bit (Execute Disable), integrado a partir de las revisiones de la arquitectura IA-32 y EMT64 (Pentium 4 Prescott).
ARM: XN-Bit (eXecute Never), utilizado en arquitecturas ARMv6 y posteriores.
Mitigación de Vulnerabilidades de Seguridad
El uso del NX-bit es la base sobre la que los sistemas operativos implementan la técnica DEP (Data Execution Prevention o Prevención de Ejecución de Datos) y la protección W^X (Write XOR Execute).
Su aplicación es fundamental para neutralizar vectores de ataque comunes:
Desbordamiento de Búfer en la Pila (*Stack Buffer Overflow*): Impide que un atacante inyecte código binario malicioso (shellcode) en la pila (stack) y redirija la ejecución hacia él.
Corrupción del Heap (*Heap Exploitation*): Bloquea la ejecución de código alojado en bloques de memoria dinámica asignados dinámicamente (vía
malloc/mmap).
Soporte en el Kernel de Linux
El kernel de Linux habilita el soporte para el NX-bit por defecto en kernels compilados con la opción CONFIG_PAGE_TABLE_ISOLATION o soporte x86-64/PAE.
Mediante el pseudosistema de archivos /proc/cpuinfo, es posible verificar si la CPU actual dispone de esta capacidad examinando la lista de atributos (flags):
$ grep -E -o '(nx|nx_bit)' /proc/cpuinfo | head -n 1
nx