■Windows Server 2003 Service Pack1には,Windows XP SP2と同様に,データ実行防止機能が実装される。これは,メモリーのデータ領域でのプログラム実行を阻止することで,コンピュータ・ウイルスなどによる攻撃を防ぐ機能である。
■データ実行防止機能には,大きく分けてハードウエアによるものと,ソフトウエアによるものの2つがある。ハードによるデータ実行防止機能は,Athlon 64など特定のCPUを搭載したコンピュータだけで有効である。

(山口 哲弘)


 Windows Server 2003 Service Pack 1(SP1)には,Windows XP SP2と同様に,データ実行防止(Data Execution Prevention=DEP)機能が実装される。これは,バッファ・オーバーフロー(またはバッファ・オーバーラン)攻撃による不正プログラムの実行を阻止する仕組みである。

 BlasterやSasserなどのように,世間を騒がしたコンピュータ・ウイルス(ワーム)の中には,ネットワークに接続しただけで感染してしまうものがある。そのようなウイルスは,バッファ・オーバーフローと呼ぶプログラムの欠陥を突いて攻撃するが,DEPはこのような攻撃を防止する。

 DEPには,AMD64対応CPUの拡張ウイルス防止機能やIntel製CPUのExecute Disable Bit機能などを利用したハードウエアによるものと,ソフトウエアによるものがある。本連載の最終回は,データ実行防止機能について説明する。

標準ですべてのプログラムが対象になる
 DEPには,いくつかのオプションが用意されている。DEPの仕組みの前に,まずはDEPに関する設定について説明しよう。

 Windows Server 2003 SP1のDEPは,標準ですべてのプログラムが対象になる。Windows XP SP2では,重要なWindowsのプログラムおよびサービスについてのみ有効だったのに比べると,その影響範囲は広い。


△ 図をクリックすると拡大されます
図1●データ実行防止の設定画面
 DEPの適用範囲は,[システムのプロパティ]−[詳細設定]−[パフォーマンス]ダイアログ・ボックスの[データ実行防止]画面で変更できる(図1)。選択肢は,(1)[重要なWindowsのプログラムおよびサービスについてのみ有効にする]と,(2)[次に選択するものを除くすべてのプログラムおよびサービスについてDEPを有効にする]——の2つである。Windows Server 2003 SP1のデフォルト設定は(2)である。

 (1)を選ぶと,DEPの有効範囲がWindowsのシステム・プログラムに限定される。ユーザー・プログラムにDEPは効かない。DEPの適用範囲となる「Windowsのシステム・プログラム」は,sysmain.sdbファイル内に列挙されている。主にWindowsディレクトリ内の実行ファイルが対象になっているが,すべてではない。例えばInternet Explorerは対象外である。


△ 図をクリックすると拡大されます
図2●データ実行防止の例外リスト
 一方,(2)を選ぶと,すべてのプログラムがDEPの対象になる。ただし,DEPによって不具合が出る場合は,そのプログラムをダイアログ下側にある例外リストに登録すると,そのプログラムだけをDEPの対象外にできる(図2)。例外リストに登録するには,[データ実行防止]画面の[追加]ボタンをクリックし,実行ファイルを指定する。

 例外リストはレジストリ内に保存されており,そのキーはHKEY_LOCAL_MACHINE\
SOFTWARE\Microsoft\Windows NT\
CurrentVersion\AppCompatFlags\Layersである。インストール・プログラムなどでアプリケーションを例外リストに登録するには,そのプログラムのフル・パスを名前とした文字列型(REG_SZ)の値を作る。データとして「DisableNXShowUI」を設定すると,そのプログラムはDEPの対象にならない。ちなみに値に「EnableNXShowUI」を設定すると,例外リストには表示されるがチェック・ボックスがクリアされて,DEPの対象になる(図3)。


△ 図をクリックすると拡大されます
図3●データ実行防止の例外リストを格納するレジストリ

DEPのオプションは全部で4つ


△ 図をクリックすると拡大されます
図4●Windows Server 2003の起動オプション
 DEPに関する設定は,[データ実行防止]画面で選択できる2つだけではない。実際には,全部で4つのオプションがある。それらのオプションは,C:\boot.iniに書かれるWindows Server 2003の起動パラメータ「/NoExecute=」で指定する(図4

 指定可能なオプションは,
(1)「/NoExecute=OptIn」,
(2)「/NoExecute=OptOut」,
(3)「/NoExecute=AlwaysOff」,(4)「/NoExecute=AlwaysOn」
——の4種類である(表1)。これらのオプションは大文字と小文字を区別しない。

表1●DEPに関するWindows Server 2003の起動オプション
オプション内 容
OptIn データ実行防止機能の有効範囲をWindowsのシステム・プログラムだけに限定する。AMD64システムなどでは物理アドレス拡張モードで起動し,ハードウエアDEPも有効になる
OptOut
(デフォルト)
すべてのプログラムに対してデータ実行防止機能を有効にする。ただし,除外リストに登録したプログラムは対象としない。AMD64システムなどでは物理アドレス拡張モードで起動し,ハードウエアDEPも有効になる
AlwaysOn 例外リストに書かれていても内容を無視し,すべてのプログラムをデータ実行防止機能の対象にする。AMD64システムなどでは物理アドレス拡張モードで起動し,ハードウエアDEPも有効になる
AlwaysOff データ実行防止機能を無効にする。AMD64システムでも,物理アドレス拡張モードで起動しない

 (1)は[データ実行防止]画面の[重要なWindowsのプログラムおよびサービスについてのみ有効にする]オプションに相当する。(2)は同様に,[次に選択するものを除くすべてのプログラムおよびサービスについてDEPを有効にする]オプションに相当する(デフォルト)。

 (3)はDEPを完全に無効にする。(4)はDEPを例外なく有効にする。これら2つのオプションは[データ実行防止]画面では設定できず,直接boot.iniファイルを編集したときだけ有効である。


△ 図をクリックすると拡大されます
図5●物理アドレス拡張モードをオフにして起動したときのDEPの設定画面
 後で詳しく説明するが,Athlon 64やOpteronなどのCPUを搭載しハードウエアDEPに対応するマシンで,ハードウエアDEPを有効にするには物理アドレス拡張(PAE)モードで起動する必要がある。だが中には,PAEモードで起動しようとすると,起動しなくなる機種がある。実際,Windows XP SP2では,そのようなトラブルが発生している。この場合,[データ実行防止]画面で設定を変えても,結局PAEモードで起動することになり,トラブルは解決しない。boot.iniファイルを編集して,起動オプションに「/NoExecute=AlwaysOff」を指定しなければならない。なお,boot.iniファイルを編集して「/NoExecute=AlwaysOff」または「/NoExecute=AlwaysOn」を指定したときは,[データ実行防止]画面でオプションを変更できなくなる(図5

不正なプログラムの実行を阻止するテータ実行防止機能
 次に,DEPの仕組みについて説明する。DEPには,冒頭で触れたように,ハードウエアによるものとソフトウエアによるものの2種類がある。

 このうちハードウエアDEPは,あらかじめメモリーに対してプログラム領域またはデータ領域といった目印を付けておき,データ領域でプログラムが実行されようとしたときに例外(実行時エラー)を発生する機能である。この機能はNX(NoExecute)とも呼ばれ,OpteronやAthlon 64などAMD64アーキテクチャのCPUが備える「拡張ウイルス防止機能(Enhanced Virus Protection=EVP)」や,モデル・ナンバーの末尾に「J」が付いたPentium 4などが備えるExecute Disable Bit(EDB)機能などを利用した処理である。ちなみにEVPとEDBは,CPUメーカーの名称が異なるだけで同じ機能である。トランスメタやVIA Technologiesも同様の機能を自社製のx86互換プロセッサに実装することを発表している。だが,Pentium IIIやCeleronなど,NX機能を備えていない既存のCPUを使ったコンピュータでは利用できない。

 それに対してソフトウエアDEPはすべてのCPUで有効だが,不正なプログラムからシステムを保護するアプローチがハードウエアDEPとは異なる。ソフトウエアDEPは,プログラムが備えている例外ハンドラが安全であることを確認する。この処理は,すべてのバッファ・オーバーフロー攻撃を防げるわけではないが,一部のコンピュータ・ウイルスが自分自身のカモフラージュのために使っている攻撃方法に対しても効果がある。

 では,ハードウエアDEPとソフトウエアDEPについて,それぞれ詳しく説明しよう。

スタック上のデータを書き換えるバッファ・オーバーフロー攻撃
 ハードウエアDEPが防止するバッファ・オーバーフロー攻撃とは,不正なプログラムを含んだ大量のデータをプログラムに送りつけて,プログラムがデータ領域に用意したバッファをあふれさせる攻撃方法である。こうすると,送りつけたデータ内に含ませた不正なプログラムを実行させることができる。その仕組みは次の通りだ。

 Pentium 4やAthlonなどx86アーキテクチャのプロセッサでは,1つの連続したメモリー領域(主記憶)をプログラム・コードの格納領域とデータの格納領域に分けて利用する。データ格納領域は用途によって,さらにヒープと呼ぶOSの管理下にあるメモリー領域と,スタックと呼ぶデータの一時格納領域に分かれる。ヒープ領域とスタック領域は,データ格納用という点では同じだが,使用方法や用途など,いくつか異なる点がある。

 ヒープ領域を使うには,OSのAPI(アプリケーション・プログラミング・インターフェース)を使って必要な容量を確保する必要がある。そしてヒープ領域のデータには,そのデータが格納されるアドレスを指定してアクセスする。


△ 図をクリックすると拡大されます
図6●スタック領域データにアクセスする仕組み
 それに対してスタック領域は,そのプログラムをコンパイルしたときに容量が決められており,その範囲内ならばいつでも自由に利用できる。そしてスタック領域のデータにアクセスするとき,通常はアドレスを指定しない。スタックに格納,あるいは読み出す順番だけが問題になる。スタックでは,あたかも机の上に本を積むように,先入れ後出しでデータが操作される。実際にデータを格納するアドレスはESPレジスタに格納されており,通常はCPUが自動的に管理する(図6)。

 スタックにデータを格納するとESPレジスタの値がデータの大きさだけ小さくなり,スタックからデータを読み出すとESPレジスタの値がデータの大きさだけ大きくなる。つまり,データをスタック領域に格納する場合はアドレスの上位から下位に向かって書き込まれ,読み出す場合はアドレスの下位から上位に向かって読み出されるわけだ。例えばA,B,Cという3つのデータをスタックに格納すると,アドレスの下位から上位に向かってC,B,Aという順にデータが並ぶことになる。この状態のときにスタックからデータを読み出すと,C,B,Aという順に取り出せる。
(次のページへ続く)