# NX-Bit

Das NX-Bit (No eXecute, AMD) bzw. XD-Bit (Execute Disable, Intel) ist eine Technik von Prozessoren der x86-Familie zur Verbesserung der Sicherheit eines Computers. Sie soll verhindern, dass beliebige Daten als Programmcode ausgeführt werden und auf diese Weise Schadcode starten, wie z. B. Viren, Backdoors u. ä. Das NX-Bit wurde von AMD 2004 bei der x86-Architektur eingeführt und auch von Intel und anderen Herstellern von x86-Prozessoren übernommen. Bei Windows-Betriebssystemen (ab Windows XP SP2) wird die Technik auch als Data Execution Prevention (kurz DEP; deutsch Datenausführungsverhinderung) bezeichnet.
Ähnliche Techniken gibt es auf anderen Prozessorarchitekturen schon länger, etwa beim PowerPC von IBM und Motorola, der SPARC-Architektur von Sun und den Alpha-Prozessoren von DEC.

## Geschichte

Seit dem 80286-Prozessor von Intel besteht im sogenannten Protected Mode die Möglichkeit, einzelne Speichersegmente als ausführbar (Code-Segmente) oder nicht ausführbar (Daten-Segmente) zu kennzeichnen. Wird versucht, Code an einer Adresse in einem als nicht ausführbar markierten Speichersegment auszuführen, löst die CPU einen Hardware-Interrupt aus, welcher vom Betriebssystem abgefangen wird. Das betreffende Programm wird daraufhin abgebrochen.
Seit den 1990er Jahren nutzen moderne Betriebssysteme zwar ebenfalls den Protected Mode, jedoch verwenden sie ein sogenanntes „flaches Speichermodell“ (linearer Adressraum), in dem sämtliche Segmente den gleichen linearen Speicherbereich überdecken. Der segmentbasierte Speicherschutz ist damit ausgehebelt, eine Trennung zwischen Code- und Datensegmenten ist nicht mehr vorhanden.
Die Technik wurde daher vom Chiphersteller AMD 2004 mit dem Prozessor Athlon 64 unter dem Namen NX-Bit für den x86-Markt eingeführt und als Enhanced Virus Protection (EVP) vermarktet. Intel setzte eine vergleichbare Technik bereits bei der gemeinsam mit Hewlett-Packard entwickelten Itanium-Architektur ein und zog 2005 mit den Pentium-4- und Pentium-M-Modellen, sowie bei der 2006 eingeführten Core-Mikroarchitektur auch auf der x86-Architektur nach, allerdings unter dem Namen XD-Bit (Execute Disable). Auch Transmeta und VIA/Centaur übernahmen die Technik in deren x86-Prozessoren.

## Funktionsweise

64-Bit-Eintrag im Seitenverzeichnis (Page directory entry) :
| Bits: | 63 | 62 … 52 | 62 … 52 | 62 … 52 | 62 … 52 | 62 … 52 | 62 … 52 | 62 … 52 | 62 … 52 | 62 … 52 | 62 … 52 | 62 … 52 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 | 51 … 32 |
| Inhalt: | NX | reserved | reserved | reserved | reserved | reserved | reserved | reserved | reserved | reserved | reserved | reserved | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse | Bit 51 … 32 der Basisadresse |
| Bits: | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 31 … 12 | 11 … 9 | 11 … 9 | 11 … 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Inhalt: | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | Bit 31 … 12 der Basisadresse | AVL | AVL | AVL | ig | 0 | ig | A | PCD | PWT | U/S | R/W | P |
Heutige Betriebssysteme verlassen sich beim Speicherschutz ausschließlich auf seitenbasiertes Speichermanagement. Dieses gestattet bei der 32-Bit-x86-Architektur IA-32 zwar die Unterscheidung zwischen Seiten, die „nur lesbar“ und welchen, die „les- und schreibbar“ sind (siehe Bit 1 („R/W“) im Seitentabelleneintrag), jedoch ist dort keine Unterscheidung zwischen (Daten) „Lesen“ und (Code) „Ausführen“ vorgesehen. AMD hat für das NX-Bit das Bit 63 in den 64-Bit-Seitentabellen und -verzeichnissen verwendet. 64-Bit-Seitentabellen und -verzeichnisse werden nur im 64-Bit-Modus und im 32-Bit-Modus mit aktivierter Physical-Address Extension (PAE) verwendet.
Das NX-Bit wird vom Betriebssystem, sofern es dieses unterstützt, für den Stack und andere Datensegmente im Arbeitsspeicher gesetzt, so dass diese nicht mehr ausführbar sind. Versucht ein Programm nun, aufgrund eines Bugs oder einer Infektion mit Schadcode diese so markierten Speicherseiten auszuführen, fängt die CPU dies ab und meldet dies über einen Hardware-Interrupt an das Betriebssystem, welches daraufhin das betroffene Programm beendet.
Durch dieses Vorgehen wird das Von-Neumann-Prinzip, Daten und Programm in einem gemeinsamen Speicher abzulegen, teilweise verletzt. Allerdings wird nur der Ausführung von Code in Datensegmenten (z. B. in einem Stack oder Heap) vorgebeugt. Der Pufferüberlauf an sich wird nicht unterbunden. Wenn dabei ein Sprung in eine Codepage ausgelöst wird, ist die No-Execute-Technik wirkungslos. Des Weiteren lässt sich trotz dieser Technik beliebiger Code beispielsweise durch ein „return into libc“ ausführen.

## Betriebssysteme

Auf 64-Bit-x86-Systemen (x64: auch oft „x86_64“ oder „amd64“ bezeichnet) ist das NX-Bit in jedem Fall nutzbar. Auf 32-Bit-x86-Betriebssystemen (IA-32, meist „x86“ oder „i386“) ist technisch das NX-Bit nur nutzbar, wenn auch PAE aktiviert ist. Bei älteren Betriebssystemen muss PAE noch manuell vom Benutzer aktiviert werden, etwa unter Windows 2000. Auch der Linux-Kernel kann auf IA-32 sowohl mit als auch ohne PAE konfiguriert werden; die Voreinstellung wurde jedoch Mitte der 2000er Jahre bald aktiviertes PAE bei den 32-Bit-Varianten von Windows, Mac OS X und Linux, und somit auch die Unterstützung für das NX- bzw. XD-Bit. OS/2 bzw. dessen Nachfolger ArcaOS (vormals eComStation) hingegen nutzt PAE aus Gründen der Kompatibilität mit Treibern und Anwendungssoftware nicht. (Mit ArcaOS 5.1 von 2023 kam zwar PAE-Unterstützung hinzu, damit ist jedoch nur eine RAM-Disk nutzbar.)

### Windows

Das Betriebssystem Windows von Microsoft unterstützt DEP ab Windows XP SP 2, sofern der jeweilige Prozessor die Möglichkeit bietet. Ab Windows Vista sind die Einstellungen dem Benutzer sichtbar (Systemeigenschaften → Erweitert → Leistung → Einstellungen → Datenausführungsverhinderung). Windows 8 und neuere Windows-Versionen können auf Prozessoren ohne NX-Bit nicht gestartet werden.

### Linux

Für Linux wurde vom bei Red Hat angestellten Entwickler Ingo Molnar ein Patch zur Unterstützung des NX-Bit für den Linux-Kernel der 2.6er-Reihe entwickelt, der für Kernel 2.6.6 in Red Hat Linux zur Verfügung gestellt wurde. Im offiziellen Linux-Kernel ist der Patch ab Version 2.6.8 enthalten.

### macOS

Das Betriebssystem für Computer von Apple, macOS (früher „Mac OS X“ und „OS X“), unterstützt das NX-Bit seit der ersten Intel-Version (für Intel-Macs) 10.4.4 „Tiger“.

## CPUs mit NX-Bit

Prozessoren mit dem NX-Bit-Feature lassen sich per Software an einem gesetzten 11. Bit im Extended Feature Enable Register erkennen. Dieses „model specific register“ lässt sich nur von privilegierter Software (Systemsoftware), also beispielsweise vom Betriebssystemkern, auslesen.

### AMD

* AMD Athlon 64 und Nachfolger
* AMD Opteron
* AMD Phenom und Nachfolger
* AMD Sempron (ab Paris)
* AMD Turion 64 und Nachfolger
* AMD Ryzen und Nachfolger

### Intel

* Intel Atom
* Intel Celeron (ab Conroe-L-Kern)
* Intel Celeron D
* Intel Celeron M (ab Dothan-Kern)
* Intel Core Solo, Duo und Nachfolger
* Intel Pentium 4 (ab Prescott-F/J-Typ)
* Intel Pentium D
* Intel Pentium Dual-Core
* Intel Pentium Extreme Edition
* Intel Pentium M (ab Dothan, FSB533 alle Modelle, FSB400 nur Modelle mit CPU-ID 06D8h)
* Intel Xeon (ab Pentium D Kern)

### Übrige

* Transmeta Efficeon
* VIA C7
* VIA Nano