図3●Athlon 64搭載PCでDEPを有効にすると,物理アドレス拡張モードで起動する
 ハードのDEP(AMD64の拡張ウイルス防止機能)は,x86の物理アドレス拡張(Physical Address Extensions=PAE)使用時に64ビットに拡張されるページ・テーブル・エントリ(PTE)の最上位ビットを使って,データ領域/プログラム領域のマーキングをしている。そのため,物理アドレス拡張を使わないとハードウエアのDEPは効かない。実際,AMD64アーキテクチャのCPUを備えたPCでは,「/noexecute=」オプションに「AlwaysOff」以外を指定すると,物理アドレス拡張モードで起動する(図3[拡大表示])。

 注意すべき点は,中には,物理アドレス拡張モードで起動しようとすると,起動に失敗するPCがあることだ。その場合は,物理アドレス拡張ではないモードに戻せば起動するようになるはずだが,図2の設定画面にあるオプションだと,どちらを選んでも物理アドレス拡張モードになってしまうので,対処できない。セーフ・モードで起動してから,c:\boot.iniに「/noexecute=AlwaysOff」オプションを指定する必要がある。

図4●Windows XP Service Pack 2で新設されたDEPのための設定画面
Celeronなど,AMD64以外のCPUを搭載したPCでService Pack 2を適用したWindows XPを動かしたときのものである。
 以上の4つのオプションは,ハードウエアのDEPについてはそのオプションが意味する通り機能するはずである。だが疑問が残るのはソフトウエアのDEPについてである。CeleronなどのCPUを備えたハードウエアDEPが効かないPCでも,DEPの設定画面が有効である(図4[拡大表示])。ただし,ダイアログ・ボックス下端には,「お使いのコンピュータのプロセッサでは,ハードウエアによるDEPはサポートされません。ただし,DEPソフトウエアを使うことにより,ある種類の攻撃を阻止することができます」と書かれている。

 「ハードウエアによるDEPが効かない」というくだりは正しいが,「DEPソフトウエアを使えば攻撃を阻止できる」というのに疑問が残る。「DEPソフトウエアはデフォルトでは無効だが,有効にすれば攻撃を阻止できる」とも解釈できる。だが,ソフトウエアによるDEP機能も,「/noexecute=AlwaysOff」にしない限り有効であるはずだ。さらに,Visual C++の「/GS」オプションによる処理は,Windows XP SP2に含まれる各実行ファイルに埋め込まれている。ハードウエアのDEPと異なり,ON/OFFの制御はできず,常にシステム・プログラムを対象とした「攻撃を阻止できる」はずだ。

 なお製品版のWindows XP SP2では,AMD64以外のCPUを備えたPCでも「次に選択するものを除くすべてのプログラムおよびサービスについてDEPを有効にする」のオプションが選べる。

 このオプションは,RC2ではグレーになって選べなかった。RC2時点ではソフトウエアDEPはVisual C++の「/GS」オプションによる処理を意味していたからだ。Visual C++の「/GS」オプションによる処理は,SP2で配布される実行ファイルにしか埋め込まれておらず,すべてのプログラムを対象にできない。製品版のWindows XP SP2では,ソフトウエアDEPが例外ハンドラの安全性をチェックする仕組みを意味するようになったので,すべてのプログラムを対象にできるようになったわけだ。

 ただ残念ながら,ソフトウエアによるDEPが,どの程度の攻撃に耐えられるのかは調べられなかった。実際にバッファ・オーバーフロー攻撃などを仕掛けてみれば検証できそうだが,SP2を適用したWindows XPは,既知のバッファ・オーバーフローのぜい弱性が修正されている。未知のぜい弱性があったとしても,それを知るすべはない。つまり,一個人としては,検証する手段がないのである。

(山口 哲弘=日経Windowsプロ)