図●NX(no-execution)ビットの動作原理
バッファ・オーバーフロー自体を防ぐことはできないが,NXビットを活用することでそこに埋め込まれた攻撃コードの実行は防げる。
 セキュリティ・ホールの中でも特に怖いのは,バッファ・オーバーフローだろう。パラメータの長さチェックが甘いプログラムに開くホールである。

 このホールを攻撃する際は,パラメータ格納用のバッファ領域を超える大きなデータを送りつける。メモリー上のデータを書き換えて不正な処理をさせるためだ。この手法が使えれば,バックドアを埋め込んだり,ウイルスに感染させることが可能である。

 バッファ・オーバーフロー攻撃に対する唯一の対策は,バグを修正するパッチ・プログラムを導入すること。しかし,すべてのパソコンにパッチを即座に適用するのはほとんど不可能だ。

 この状況が,2004年後半に登場する予定のWindows XP Service Pack 2を境に大きく変わりそうだ。バッファ・オーバフロー攻撃対策となる新しい機構「Execution Protection」が組み込まれるからである。

データの印をページテーブルに追加

 Execution ProtectionはCPUに追加される新しい機能と,それに対応するOSがあって初めて動作する。CPUでは米AMD社のAthlon 64とOpteronがすでに対応しているほか,米Intel社のクライアント向けCPUも2004年後半には対応する予定である*1

 Execution Protectionに対応するCPUでは,仮想アドレスと論理アドレスを変換する「ページテーブル」に新しいビット「NX(no-execution)」が追加されている。NXビットはデータ領域を表すフラグで,CPUはこれを参照しながら動作する。読み込もうとしているデータ領域のフラグをチェックし,有効になっている場合はデータ(不正プログラム)を読み込まない。その代わりに,例外エラーを発生する([拡大表示])。

 バッファ・オーバーフロー攻撃ではメモリー上のバッファ領域を溢れさせ,戻りアドレスなどが格納されている領域を書き換える(一般に戻りアドレスはバッファ領域の近くに書き込まれている)。うまく戻りアドレスを書き換えることができれば,この戻りアドレスをCPUが参照した際にメモリー上にある任意の場所に書かれてあるプログラムを実行させられる。一般には溢れさせたデータの中にプログラムを仕込むことで不正なプログラムを実行させる。

 そこでOS側では,バッファ用にメモリーを確保する際,その領域のNXビットをオンにするようにプログラミングしておく。プログラムにバッファ・オーバーフローのホールがある場合は,NXビットに対応していてもメモリー上にプログラムを送り込まれる。それでも,CPUは不正に埋め込まれたプログラムを実行しない。不正プログラムに差し替えられた領域のNXビットが有効だからである。

(中道 理)