運用
ネットワーク管理者のための
Windows XP SP2レビュー(後編)

7.データ実行保護機能(DEP)

デジタルアドバンテージ
2004/09/02

 MS BlasterやSlammerなど、Windows OSシステムの脆弱性を攻撃するウイルスやワームが過去に広く蔓延したことがあるが、これらは、バッファ・オーバーフローやスタック・オーバーフローなどの脆弱性を利用して自分自身のコードを実行していた。バッファ・オーバーフローとは、あらかじめ用意されたバッファのサイズを超えるような巨大なデータを送り込むことであり、例えばInternet Explorerのアドレス・バーや文字列入力フィールドなどに、数Kbytesとか数十Kbytesものデータを入力することである。

 通常は、用意されたバッファ・サイズ以上のデータ入力は受け付けないようになっているはずであるが、プログラムのコードにミスがあると、バッファのサイズを超えるような大きなデータでも受け付けてしまい、ほかのデータ領域やスタック領域、関数の戻りアドレス・データなどを上書きしてしまうことがある。このバグ(脆弱性)を利用すると、任意のプログラム・コードをシステムに送り込み、さらに関数からの戻りアドレスを細工するなどして、任意のコードを実行させることができる。

 このような脆弱性を防ぐための対策としてXP SP2で新たに導入されたのが「データ実行防止(Data Execution Prevention。以下DEP)」という機能である。DEPが有効になっていると、本来コードが置かれることはないスタック領域やヒープ領域中に置かれたコードは(デフォルトでは)実行できなくなり、実行しようとすると、プログラムが強制終了させられる。これにより、バッファ・オーバーフローによる攻撃を阻止することができる。CPUから見たプログラムのアドレス空間は、コード領域とデータ領域(静的データ、ヒープ、スタックなど)に分かれているが、XP SP2ではコード領域以外でのプログラムの実行を禁止することにより、システムの安全性を高めるようにしている。

DEPによる不正なコードの実行防止

 XP SP2におけるDEPには、ハードウェアDEPとソフトウェアDEPの2種類があり、利用するプラットフォームやCPUタイプに応じて次のようになっている。

プラットフォーム 利用できるDEP機能 ハードウェアDEPの適用領域
Athlon64/Opteron ハードウェアDEP/ソフトウェアDEP スタック領域のみ
上記以外のx86 CPU ソフトウェアDEP
Athlon64/Opteron/Itanium+64bit版のWindows XP/Windows Server 2003(現在ベータ版) ハードウェアDEP/ソフトウェアDEP スタック領域とページ・プール/セッション・プール・データ領域
プラットフォームによるDEP機能の違い

 ハードウェアDEPは現在のところ、AMDのAthlon64/Opteronプロセッサ(もしくはItaniumプロセッサ)でのみ利用できる。これらのプロセッサでは、仮想記憶のためのメモリ管理用ページ・テーブル中に、「実行不可」という属性を付けることができる。コード領域以外のアドレス空間を実行不可にすることにより、不正なコードの実行を防いでいる。

 これに対して、ソフトウェアDEPはどのプロセッサでも利用できるが、不正なコードの実行を防ぐことはできず、その機能は非常に限定的である。ソフトウェアDEPを有効にすると、Windows OSの持つ「SafeSEH(安全な例外ハンドラ)」機能を利用する場合の処理に一部変更が加えられる。これにより、例えば例外ハンドラ(エラー発生時に呼び出される特別な処理ルーチン)として不正なルーチンを登録、上書きしてしまうという脆弱性を防ぐ効果がある。

DEPによる実行防止の例

 以下に、ハードウェアDEP機能による不正なプログラムの実行防止の例を示す。

※DEPサンプル・プログラム

#include <stdio.h>

/* sample code
0000: 31C0 XOR EAX,EAX ; EAX ← 0
0002: 40   INC EAX     ; EAX = EAX+1
0003: C3   RET  ; リターン */


int main(void)
{
  /* sample code on stack */
  char code[] = { 0x31, 0xc0, 0x40, 0xc3 };
  int (*pfunc)(void) = (int (*)(void))&code[0];
  int ret;

  printf("&code[0] = 0x%08lx\n", &code[0]);

  ret = (*pfunc)(); // call pfunc

  printf("ret = 0x%08lx\n", ret);
}

 このプログラムでは、スタック上のcode[]という配列にプログラムのコード(値1を返すコード)を用意し、それを呼び出しているだけである。このプログラムをAthlon64ではないCPU上で実行すると、次のような結果が得られる。

C:\>deptest            … deptestの実行
&code[0] = 0x0012fee0  … code[]の先頭アドレス
ret = 0x00000001       … 関数の実行結果

C:\>

 スタック上に置かれたコードが実行され、結果が表示されている。

 だがこのプログラムをAthlon64 CPUのWindows XP SP2コンピュータ上で実行すると、次のようにスタック上のコードを呼び出した時点でDEPによってプログラムの実行が終了させられる。

DEPによる実行の防止
サンプル・プログラムをAthlon64 CPUのWindows XP SP2コンピュータ上で実行したところ。このようにDEPによってプログラムの実行が阻止され、終了する。スタック上のバッファ・オーバーフロー攻撃を使ったウイルスの活動などを止めることができる。
  コマンド・プロンプト上でプログラムを実行したところ。この行は通常のプログラムによる出力だが、その次の行の結果は表示されず、代わりに「データ実行防止」のダイアログが表示される。
  スタック上のプログラムを実行しようとすると、このようなダイアログが表示され、強制終了させられたプログラムの名前が表示される。
  DEPの設定を変更して、DEPを無効にしたり、このプログラムに対してDEPを適用させないように設定したりするにはこれをクリックする。いったん例外としてプログラムを登録すると、以後はDEPによるチェックは働かなくなる。
  これをクリックするとダイアログが閉じる。

 このように、DEPが有効になっているとスタック上に置かれたコードを実行しようとしただけでプログラムが終了させられる。

 だが場合によっては、わざとこのようなプログラムになっている場合もあるだろう。例えばあるプログラムを変換してCPUの命令コードを直接生成し、それを実行したいといった場合である。またCPUの違いや環境の違いなどに応じて、プログラムのコード列を直接変更し、最適化して実行する場合もあるだろう。高速化が求められるマルチメディアのデータ処理などでよく使われる手法である。従来はこのようなプログラムでも何の問題もなく実行することができたが、DEPが有効になっていると、データやスタック領域にプログラム・コードを置いてそれを実行することはできなくなる。

 このような場合、XP SP2では2つの解決方法がある。

 1つは、プログラム・コードを変更してXP SP2に対応させる方法である。スタック上やヒープ上にコードを置く場合、「実行可能な領域」としてメモリ領域を確保し、処理をする。この方法は、プログラマにとっては負担が増えるが、不正なコードへの感染や実行を防ぐという意味で見ると、十分価値のある投資である。今後のWindows OSにおけるプログラムでは、このような正しいマナーを守ったプログラムだけが実行できるようになる予定となっている。さらにXP SP2でDEP機能をオンにすると、カーネル・モードで動作するデバイス・ドライバにはすべてこの機能が働き、不正な実行はすべて阻止されることになる。そのためXP SP2では、認定されたデバイス・ドライバの重要性が増すことになる。設計のよくない("できの悪い")デバイス・ドライバや、ベータ版のデバイス・ドライバなどでは、DEP機能によって実行できなくなるものも出てくるだろう。カーネル・モードのDEP機能は、「デバイス・ドライバごと」といった、選択的にオフにすることができないので、どうしてもこのようなデバイス・ドライバを使いたければ、DEP機能そのものをすべて無効にする必要がある。カーネル・モードでシステム・エラーが発生すると、OSそのものが再起動することになるからだ。DEP機能に対応したアプリケーションは、実行ファイル中に特別なフラグをセットしておくことにより、以下のDEPダイアログの設定にかかわらず常にDEP機能を有効にした状態で実行されるようになる。

 もう1つの対処方法は、ある特定のプログラムに対してDEP処理を無効にすることである。DEPに違反するプログラムが見つかると、XP SP2では先の画面のようなダイアログが表示される。ここでユーザーが指定すれば(次の画面参照)、そのプログラム(実行ファイル名で識別されている)に対しては例外的にDEP機能を無効にすることができる。この方法は、従来のプログラムがそのまま利用できるというメリットがあるが、バッファ・オーバーフローの脆弱性などを使ったウイルス・コードに感染する可能性があるので、注意が必要である。DEPによるエラーが検出されたからといって、無条件にDEPの非適用リストに追加するのではなく、アプリケーション・ベンダからの指示などがあった場合にのみ追加するのが望ましいだろう。

DEP機能の設定ダイアログ
DEP機能をシステム全体で使うか、それとも限定的な用途でのみ使用するかを設定するダイアログ。[マイコンピュータ]を右クリックしてポップアップ・メニューから[システムのプロパティ]を表示させ、[詳細設定]タブにある[パフォーマンス]の[設定]ボタンを押すとこれが表示される。XP SP2では新たに[データ実行防止(DEP)]というタブが増設されている。
  DEP機能の設定タブ。
  Windowsシステム(デバイス・ドライバも含む)および特別にインストール時などに登録されたプログラムでのみDEP機能を有効にする。XP SP2インストール時のデフォルト設定。
  Windowsシステムだけでなく、ユーザーのプログラムもDEP機能の対象とする。
  ここにリストアップされたプログラムについては、DEP機能の対象外とする。DEP機能が有効だと動作しないようなプログラムを明示的に登録するために利用する。チェック・ボックスをオフにすると、一時的にDEP機能が有効になる。
  特定のプログラムを手動でDEP機能の適用対象外リストに登録するには、これをクリックして追加する。

 なおDEP機能は、バッファ・オーバーフローそのものを防ぐものではない。バッファ・オーバーフローの脆弱性などを突いて、システムにプログラム・コードが送り込まれた後、そのコードが起動されるのを阻止するだけである。プログラムがバッファ・オーバーフローを起こしている場合はそのままプログラムを実行しても意味がないと考えられるので、DEPによるエラーを検出すると、プログラムは強制終了させられることになる。バッファ・オーバーフローを防止するには、プログラムそのものを改良することや、バッファ・オーバーフローのチェック・コードをコンパイル時に組み込むなどの措置が必要である(例:マイクロソフト社のC/C++コンパイラならば、/GSオプションを利用すると、ある程度のバッファ・オーバーフローが検出できる)。

DEP機能の有効/無効設定

 DEP機能には全部で4つの動作モードがある。これらの設定はc:\boot.iniファイルの/NoExecute=オプションによって設定され、システム起動時から有効になる(msconfigコマンドでboot.iniファイルの内容を確認することもできる)。そのため、モードを変更すると、システムを再起動する必要がある。

設定 意味
/NoExecute=OptIn デフォルト設定。Windows OSのすべてのシステム・ファイルと、DEPの使用が許可されたいくつかの特別なユーザー・アプリケーションでのみDEPが有効になる
/NoExecute=OptOut Windows OSのすべてのシステム・ファイルと、すべてのユーザー・アプリケーションがDEPの対象となるが、除外リストに登録されたアプリケーション・プログラムについてはDEPが適用されない
/NoExecute=AlwaysOn すべたのシステム・ファイルとユーザー・アプリケーションがDEPの対象となる。除外リストにアプリケーション・プログラムを登録することはできない
/NoExecute=AlwaysOff DEP機能をすべて無効にする
boot.iniにおけるDEP設定

 新規にWindows XP SP2をインストールすると、デフォルトでは「/NoExecute=OptIn」の状態になるが、インストール前にこのフラグが設定されていれば、その設定を引き継ぐようになっている。

 以上、XP SP2の主要な機能について見てきた。これ以外にも、新しく追加されたXP SP2の機能としては次のようなものがある。

新しいWindows Update
 Windows Updateの構成が変更され、使いやすくなった。またシステムの更新に使用するコンポーネントが従来のv4(バージョン4)からv5(バージョン5)に更新された。中断したダウンロードの再開機能やネットワーク接続の帯域幅に応じた効果的なファイル・ダウンロードなどが改良されている。

新しいグループ・ポリシー項目
 セキュリティ機能の強化に伴って、グループ・ポリシーで制御できる項目が大幅に増加している。特にInternet Explorerのセキュリティ設定に関する項目が目立って増えている。

デバイス・ドライバのセキュリティ強化
 データ実行保護(DEP)でも解説したように、XP SP2(および今後のWindows OS)では、システムの信頼性を揺るがすようなコードの実行は、著しく制限されることになる。インストールするデバイス・ドライバに対しては、デフォルトでは署名がないドライバのインストールを警告するようになるし(以前は、署名がなくても無視してインストールした)、不明なデバイスが見つかった場合には、まずWindows Updateサイトに接続して、最適なデバイスを検索するのがデフォルトとなる(以前はユーザーが指定しない限り、Windows Updateサイトを検索しない)。

デバイスのWindows Updateサイトでの検索
XP SP2では、新しいデバイス用のデバイス・ドライバを探す場合、(デフォルトでは)まずWindows Updateサイトへ接続するようになっている。これにより、信頼性の低いデバイス・ドライバ・コードの使用を抑え、システムの信頼性向上を図っている。
  常にWindows Updateサイトに接続して最新のドライバを検索する。
  Windows Updateサイトに接続するかどうかをユーザーに問い合わせる。デフォルト設定。
  Windows Updateサイトを利用しない。従来のデフォルト設定。

 これら以外にもXP SP2の機能改良点は多々あるが、それらについては機会を改めて取り上げる予定である。End of Article

  関連記事(Windows Server Insider)
  Windows XP SP2の展開に失敗しないために(Insider's Eye)
  Windows XP SP2日本語版がついに公開(Windows HotFix Briefings)
  関連リンク
  Windows XP SP2(マイクロソフト)
  HotFix Report BBS
 
 

 INDEX
  [運用]
  ネットワーク管理者のためのWindows XP SP2レビュー(前編) 
    1.XP SP2の概要とインストール
    2.ファイアウォール機能(1)
    3.ファイアウォール機能(2)
    4.ファイアウォール機能(3)
  ネットワーク管理者のためのWindows XP SP2レビュー(後編) 
    5.Internet Explorerの機能強化
    6.Outlook Expressのセキュリティ機能
  7.データ実行保護機能(DEP)

更新履歴
【2005/11/16】boot.iniファイルにおけるオプション値の記述が間違っておりました。当初公開した記事ではオプション値を「OptIn/OutOut/AlwayOn/AlwayOff」と記述しておりましたが、正しくは「OptIn/OptOut/AlwaysOn/AlwaysOff」でした。お詫びして訂正させていただきます。
 
 運用


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間