NXビット
読み:エンエックス-ビット
外語:NX bit: No eXecute bit
x86
系
マイクロプロセッサー
が持つメモリー保護機能の一つ。XDビット(エグゼキュート・ディスエーブル・ビット、Execute Disable Bit)ともいう。
目次
概要
特徴
機能有無
理屈
動作
PAE
対応OS
副作用
概要
近年問題となっている、いわゆる
バッファーオーバーフロー
による
ワーム
への感染・拡散を、ハードウェア・マイクロプロセッサーのレベルで防止するための機能である。
これまでは、
OS
がバッファーオーバーフローの発生を検知していた(あるいはそもそもしていなかった、OSの
バグ
で検知しきれなかった)ものが、マイクロプロセッサーレベルで行なえるようになった。
この機能は
AMD64
アーキテクチャーで初めて実装され、後追いで、Intel製品でも
Pentium 4
570J(E-0ステッピングの
Prescott
)以降で対応した。
特徴
機能有無
機能の有無は、EAXレジスターに0x80000001を代入して
CPUID命令
を実行し、EDXレジスターに得られたフラグのビット20が1かどうかで確認できる。
AMD64プロセッサーまたはIntel 64対応プロセッサーであれば、
MSR
の
IA32_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 XP
Service Pack 2以降
Linux
kernel 2.6
なお、WindowsではNXビットへの対応を、データ実行防止(
DEP
)機能と呼んでいる。
副作用
副作用として、意図的にバッファー領域に実行コードを格納したり、
自己書き換え
を利用するプログラムがその保護機能のため動作しなくなるという問題がある。
近年のメモリー保護機能のあるOSではユーザープログラムがコード領域のメモリーを書き換えることができないため、このテクニックを利用することはできないが、古いプログラムを利用する場合はNXビット機能を利用する前によく検証を取らなければならないと考えられる。
再検索