2004年9月2日に「Windows XP SP2」の日本語版の提供が始まった。既報の通り,このWindows XP SP2には「DEP」(Data Execution Prevention)というセキュリティ機能が盛り込まれた。(詳しくは2004年9月7日の記者の眼『Windows XP SP2のデータ実行防止機能「DEP」を調べた』を参照)。バッファ・オーバーフローなどのセキュリティ・ホールを悪用して,侵入者がプログラムを送り込み実行することを防止する機能である。

 一方Linuxにも,DEPに相当するセキュリティ機能を備えるものがある。Windows XP SP2の「ハードウエアDEP」(後述)が,対応する機能「NX」を備えるプロセッサでしか使えないのに対し,Linuxの実装はすべてのx86互換プロセッサに対応するなど優れた点がある。しかし残念なことに,この機能を標準で備えるLinuxディストリビューションは少ない。

 Windows XP SP2は,DEPとは別に,プログラムの実行時にバッファ・オーバーフローによる攻撃を検知する仕組みも標準装備する。Linuxでも同様の機能は実現できるが,こちらもやはり「標準」で備えるものは少ない。

 Linuxはサーバー向けに利用されることの多いOSである。少くともWindows XP SP2並みの対策は,標準で施しておくべきだと考える。

バッファ・オーバーフローを悪用する不正侵入を防止

 WindowsとLinuxのセキュリテイ対策の違いを理解するために,Windows XP SP2のDEPの仕組みから整理してみよう。

 DEPには,プロセッサのハードウエアに依存する「ハードウエアDEP」と,ソフトウエア的に動作する「ソフトウエアDEP」の2種類がある。

 このうちハードウエアDEPは,米Advanced MicroDevices社(AMD)が販売するAthlon64やOpteron,Sempronプロセッサに搭載されるメモリー・ページの非実行属性を使って,データ記憶領域でのプログラム実行を禁止する機能である。このメモリー・ページの非実行属性は,そのフラグ名を取って「NX」(No Execution)などと呼ばれる。

 ハードウエアDEPの採用により,Windows XP SP2では,バッファ・オーバーフローを悪用した不正侵入の一部を防御できる。バッファ・オーバーフローとは,プログラムが用意する一時記憶領域(バッファ)のサイズを超えた入力で発生する「バッファあふれ」のことである。

 バッファ・オーバーフローを悪用する手口の代表が,不正プログラムを含んだ多量のコードを送り込んで関数の「戻りアドレス」を書き換える手法だ。戻りアドレスをうまく設定すると,送り込んだ不正プログラムを関数の終了時に稼働できる。もしもサーバーの入力部分でバッファ・オーバーフローが生じれば,リモートからシェルを起動されて簡単に不正侵入を許す。

 このような攻撃シナリオが成立するのは,C/C++プログラムでの「スタック」と呼ばれる先入れ後出し型の記憶領域の利用特性による。C/C++では,関数中で使用するローカル変数や,関数の実行終了時にどの部分から(呼び出し元の)プログラムを再開するかを示した戻りアドレスをスタックに記録する。変数(バッファ)と戻りアドレスを共にスタックに格納するため,変数の最大サイズを超えてデータが書き込まれると戻りアドレスまで書き換えられる危険がある。

プロセッサに追加された新属性を利用

 この攻撃シナリオを妨害する方法の一つが,スタックやヒープ領域(注:プログラムにより動的に確保される一時記憶領域)などのデータ記憶領域でのプログラム実行の禁止である。こうすれば,いくら戻りアドレスを書き換えても,バッファに送り込んだ不正なコードを実行できなくなる。現在では,ほとんどのプロセッサが,特定のメモリー・ページにプログラムの実行を禁止する属性を設定できる。そこで,多くのOSがこの属性を利用する対策を採用している。

 ところが,x86互換プロセッサでは,メモリー・ページに実行許可属性と読み出し許可属性を独立して設定できない。そのため,あるメモリー・ページで読み出しを許可すると,そのページでは同時にプログラムも実行可能になるのである。これではデータ記憶領域でのプログラム実行を禁止できない。

 この状況は,AMD社がOpteronプロセッサを出荷したことで変化した。同社のAMD64アーキテクチャを採用するプロセッサでは,前述したNXという属性が新規に追加されたのである。同属性は今後,米Intel社のプロセッサにも追加される見込みだ。まずは,2004年9月末に出荷されるLGA775対応のPentium4やCeleron Dプロセッサなどが同属性をサポートする。また,米Transmeta社のEfficeonプロセッサや,台湾VIA Technologies社のx86互換プロセッサもサポートを表明している。

 Windowsだけでなく,LinuxもNXを使ったセキュリティ機構を備える。