80x86系マイクロプロセッサが持つメモリ保護機能の一つ。エグゼキュート・ディスエーブル・ビット(Execute Disable Bit)ともいう。
NXビット機能は、「実行禁止」とマーキングされたメモリ領域からの実行を禁止するための機能である。
そもそもバッファオーバフロー脆弱性を利用した攻撃は、その機構から、悪意のあるコードはスタック領域などに置かれることになる。しかし、本来スタックはプログラムが置かれる場所ではない。
結論として、スタック領域にあるコードを実行不可に出来れば、ウイルスやワームのたぐいは実行できなくなる、という単純な理屈による。
もしNXビット機能が有効の時に実行禁止領域のコードを実行しようとすると、ページフォールト例外(#PF、Page Fault)が発生するため、OS側でそれを察知して当該プロセスを停止させることが可能となる。
NXビットはPAEのページングテーブル中にあり、ページング機能の一つとして実装されていて、これはページ毎に設定できるようになっている。
PAE(Physical Address Extension、物理アドレス拡張)とは、物理メモリのアドレッシングに使用できるビット数を、32ビットから36ビットに拡張する機能である。一般的なWindowsではこの機能は使われておらず、Windows Server 2003などで対応している。
このPAEはページングテーブルと呼ばれるテーブルを持っており、NXビットは、このテーブルの情報を拡張するという形で実装された。
PAEで使われる各ページは4Kiバイトであり、つまりNXビットは4Kiバイト単位で設定できる。
新しい機能であるため、OSレベルで対応していなければNX機能は利用できない。
代表的なところでは、次のOSが対応する。
なお、WindowsではNXビットへの対応を、データ実行防止(DEP)機能と呼んでいる。
副作用として、意図的にバッファ領域に実行コードを格納したり、自己書き換えを利用するプログラムがその保護機能のため動作しなくなるという問題がある。
近年のメモリ保護機能のあるOSではユーザプログラムがコード領域のメモリを書き換えることができないため、このテクニックを利用することはできないが、古いプログラムを利用する場合はNXビット機能を利用する前によく検証を取らなければならないと考えられる。