NXビット
読み:エンエックス-ビット
外語:NX bit: No eXecute bit

 x86マイクロプロセッサーが持つメモリー保護機能の一つ。XDビット(エグゼキュート・ディスエーブル・ビット、Execute Disable Bit)ともいう。
目次

概要
 近年問題となっている、いわゆるバッファーオーバーフローによるワームへの感染・拡散を、ハードウェア・マイクロプロセッサーのレベルで防止するための機能である。
 これまでは、OSがバッファーオーバーフローの発生を検知していた(あるいはそもそもしていなかった、OSのバグで検知しきれなかった)ものが、マイクロプロセッサーレベルで行なえるようになった。
 この機能はAMD64アーキテクチャーで初めて実装され、後追いで、Intel製品でもPentium 4 570J(E-0ステッピングのPrescott)以降で対応した。

特徴

機能有無
 機能の有無は、EAXレジスターに0x80000001を代入してCPUID命令を実行し、EDXレジスターに得られたフラグのビット20が1かどうかで確認できる。
 AMD64プロセッサーまたはIntel 64対応プロセッサーであれば、MSRIA32_EFERのビット11 No-Execute Enable(NXE)を1にすることで、NXビットを有効化できる。

理屈
 NXビット機能は、「実行禁止」とマーキングされたメモリー領域からの実行を禁止するための機能である。
 そもそもバッファーオーバフロー脆弱性を利用した攻撃は、その機構から、悪意のあるコードはスタック領域などに置かれることになる。しかし、本来スタックはプログラムが置かれる場所ではない。
 結論として、スタック領域にあるコードを実行不可に出来れば、ウイルスやワームのたぐいは実行できなくなる、という単純な理屈による。

動作
 もしNXビット機能が有効の時に実行禁止領域のコードを実行しようとすると、ページフォールト例外(#PF、Page Fault)が発生するため、OS側でそれを察知して当該プロセスを停止させることが可能となる。
 NXビットはPAEのページングテーブル中にあり、ページング機能の一つとして実装されていて、これはページ毎に設定できるようになっている。

PAE
 PAE(Physical Address Extension、物理アドレス拡張)とは、物理メモリーのアドレッシングに使用できるビット数を、32ビットから36ビットに拡張する機能である。一般的なWindowsではこの機能は使われておらず、Windows Server 2003などで対応している。
 このPAEはページングテーブルと呼ばれるテーブルを持っており、NXビットは、このテーブルの情報を拡張するという形で実装された。
 PAEで使われる各ページは4Kiバイトであり、つまりNXビットは4Kiバイト単位で設定できる。

対応OS
 新しい機能であるため、OSレベルで対応していなければNX機能は利用できない。
 代表的なところでは、次のOSが対応する。
 なお、WindowsではNXビットへの対応を、データ実行防止(DEP)機能と呼んでいる。

副作用
 副作用として、意図的にバッファー領域に実行コードを格納したり、自己書き換えを利用するプログラムがその保護機能のため動作しなくなるという問題がある。
 近年のメモリー保護機能のあるOSではユーザープログラムがコード領域のメモリーを書き換えることができないため、このテクニックを利用することはできないが、古いプログラムを利用する場合はNXビット機能を利用する前によく検証を取らなければならないと考えられる。

再検索