解説

Windows XP SP2で採用されたDEPの仕組み

元麻布春男
2004/09/03
解説タイトル

 2004年9月2日にダウンロード・センターとWindows Updateによる提供が開始された「Windows XP SP2」には、数々のセキュリティ強化機能が実装されている。そのうち、ハードウェアによるサポートを必要とするのが「データ実行防止(DEP:Data Execute Prevention)」と呼ばれる機能だ。マイクロソフトでは、DEPを「コンピュータのセキュリティを強化するための基盤技術の1つ」と説明していることからも、機能の重要性がうかがえる。そこで、ここではDEPの仕組みと機能のメリット/デメリットについて解説する。

DEPの動作原理

 この機能をサポートするプロセッサは、ページ単位*1でそのページからのコード実行を禁止するかどうかの属性を付与するメカニズムと、禁止されたページからのコード実行の試みに対してアクセス違反の例外処理を行い、プロセスを終了させる機能を備える。メモリ・ページからの実行許可/不許可を示す属性が、ページ変換テーブルのNo eXecute(NX) bitによって示されることから、当初はこの機能そのものは「NX」とも呼ばれていた。乱暴にいえば、4Kbytesのページ単位でメモリを実行可能と不可能にマークする技術がNX bitであり、NX bitを利用したソフトウェアのインフラストラクチャがDEPということになる。

*1 ここでいう「ページ」とは、仮想記憶を司るメモリ管理ユニットがメイン・メモリを細分して管理する際の単位のこと。x86プロセッサの場合、ページのサイズは通常4Kbytesである。

 NX bitのあるページ変換テーブルは、x86プロセッサ(およびそれを拡張したAMD64/EM64Tプロセッサ)のPAEモード(Physical Address Extension=物理アドレス拡張モード。詳細は後述)のものであるため、このモードのサポートが必須だが、64bitプロセッサでなければならない、ということではない。現在、NX bitを正式にサポートするプロセッサは、AMD Opteron/Athlon 64、IntelのItanium 2と、64bitプロセッサばかりである。だが、2004年7月28日にAMDが発表した64bitモードを持たないSempron(Mobile SempronとデスクトップPC向けのSempron 3100+)でも、NX bitがサポートされている(AMDでは、NX bitを「Enhanced Virus Protection」と呼んでいる)。また、IntelもPentium 4やPentium M、Celeronといったプロセッサで、64bit拡張技術(EM64T)の有無にかかわりなくNX bitをサポートすることを明言している。このほか、TransmetaもEfficeonでのサポートを表明している。

 なお、本来PAEはx86プロセッサの物理メモリ・アドレスを36bit(64Gbytes)まで拡張する技術だが、既存のデバイス・ドライバとの互換性という観点から、Windows XP SP2ならびにWindows Server 2003 SP1では物理メモリ・アドレスは32bitに限定されている(Windows Server 2003のEnterprise EditionとData Center Editionでは36bitまで拡張可)。

 DEPによる保護で最も効果が期待されているのが、バッファ・オーバーフロー/バッファ・オーバーランと呼ばれる脆弱性に対してだ。多くのコンピュータ・ウイルスやワームがコンピュータを攻撃する際に利用するものとして知られている。バッファ・オーバーフローは、その名前のとおり、プログラムが用意したバッファより多くのデータを書き込むことで、本来なら書き換えられてはならないメモリ領域まで書き換え、それにより任意のコード(悪意あるコード)を実行するように仕掛ける、というものである。下図は、AMDがWinHEC 2004で例示したバッファ・オーバーフローによるシンプルな攻撃例である。同様のプレゼンテーション資料は、AMDのホームページでも「Enhanced Virus Protection in AMD Opteron and Athlon 64 Processors」で見ることが可能だ(図は、このプレゼンテーション資料の7ページ目)。


バッファ・オーバーフローによる攻撃例
AMDがWinHEC 2004で例示した図を基に書き起こしたもの。スタック上には、関数からの戻りアドレスやローカル変数、バッファ変数領域などが連続して確保されている。通常はバッファの最後を超えてデータを書き込まないようにプログラムが作られているはずであるが、そのチェックを忘れていると、入力されたデータをすべてバッファにコピーしようとしてしまう。バッファ・オーバーフロー攻撃とは、本来は書き換えができない領域までデータを書き込むことで、ウイルスのコードを送り込み、さらにリターン・アドレスを書き換えて、ウイルスを実行させる攻撃方法である。

 DEPは、冒頭に述べたようなメカニズムにより、実行コードが置かれていると明示的に示されていないメモリ領域からのコード実行を禁止することで、バッファ・オーバーフローによるリスクを軽減するものだ。

 このDEPによる保護は、Windows XP SP2(32bit版Windows XP)以外に2005年にリリースが予定されているWindows Server 2003 SP1、それをベースにしたWindows XP x64 Editionでもサポートされる。32bit版ではスタックの保護が主眼となるが、64bit版ではスタック、ページ・プール、セッション・プールなどDEPによる保護の適用範囲が拡大される。これは64bit版が新しいシステムであり、既存のソフトウェア(特にカーネル・モードで動作するデバイス・ドライバ類)との互換性に配慮する必要がほとんどないためと考えられる。

DEPの問題点と回避策

 基本的にスタックやヒープなどのデータ領域からコードが実行されることは、既存の32bitアプリケーションでもそれほど多くはない。しかし、これまでは禁じられていなかったこともあって、まったく事例がないというわけではない。実際、Paint Shop Pro 8のインストーラは、DEPを有効にしていると、以下のような画面が表示されて、インストールが中断してしまう。

DEPを有効にした状態でPaint Shop Pro 8のインストール
DEPを有効にした状態で、Paint Shop Pro 8のインストールを行おうとすると、この画面が表示され、インストール作業が中断する。[設定の変更]ボタンをクリックするとAの画面が開く。 →
 
DEPの設定画面
DEPが働いた「Paint Shop Pro」が[次に選択するものを除くすべてのプログラムおよびサービスについて DEP を有効にする]に追加される。このプログラムが不正なものでない場合は、プログラム名をチェックすることで次回からDEPが除外される。

 Paint Shop Pro 8以外にも、下表のようにDEPを有効にしていると障害が生じる例がいくつか報告されている。

技術情報番号 タイトル
873176 Windows XP Service Pack 2 ベースのコンピュータに Paint Shop Pro 8 をインストールできない
878474 Your computer repeatedly restarts after you install Windows XP Service Pack 2
875351 Windows XP Service Pack 2 で "データ実行防止" というエラー メッセージが表示される
873158 Windows XP Service Pack 2 でデータ実行防止機能を有効にすると、ヘルプとサポート センターが起動しなくなる
873155 Windows XP Service Pack 2 で Norton CleanSweep のスマートスイープ機能を有効にすると、デスクトップが正常に表示されず、エラー メッセージ "アプリケーションを正しく初期化できませんでした (0xc00000005)" が表示される
表区切り
DEPで生じる障害に関するサポート技術情報

 このような過去のアプリケーションとの互換性を維持したり、不具合の発生を回避したりするため、Windows XP SP2ではDEPの有効/無効が設定可能となっている。アプリケーション単位でDEPの有効と無効を設定するには、システムのプロパティにある[詳細設定]タブ−[パフォーマンス]−[設定]ボタンで開く[パフォーマンス オプション]ダイアログ−[データ実行防止]タブで行う。個別のアプリケーションではなく、システム全体でDEPを無効にする場合は、起動ドライブにあるboot.ini内のスイッチでコントロールすることが可能だ。

 Windows XP SP2は、CPUIDでNX bitのサポートを確認すると、インストーラによってboot.iniに/noexecute=OptInというスイッチを付与する(デフォルト)。DEPを無効にするには、この/noexecuteスイッチを削除する(ブランクにする)か、/executeスイッチに書き換える。このスイッチ設定によるDEP保護の違いは下表に示したとおりである。32bit版のみ/executeスイッチを設定した場合、カーネル・モードでもDEPを無効にすることが可能だ。これは、DEPを有効にすると動作しないデバイス・ドライバに配慮したものではないかと思われる。

 一方64bit版では、スイッチでコントロール可能なのは32bitのユーザー・モードに対するDEPのみで、64bitユーザーとカーネルに対してはDEPを無効にすることができない。既存のソフトウェアとの互換性を配慮する必要があるのが32bitユーザー・モードだけであり、新しいデバイス・ドライバ、新しいアプリケーションを必要とする64bitモード(AMDのLongモード、IntelのIA-32eモード)では最初からDEPと互換性のあるドライバとアプリケーションを提供することが求められているというわけだ。

    スイッチなし /execute /noexecute
32bit版Windows XP カーネル 有効 無効 有効
ユーザー 無効 無効 有効
64bit版Windows 32bitユーザー 無効 無効 有効
64bitユーザー 有効 有効 有効
カーネル 有効 有効 有効
表区切り
boot.iniのスイッチとDEPの動作モード

 前述のようにDEPは、利用できるプラットフォームが現在のところ限定されており、既存のアプリケーションとの互換性の問題も少なからず存在する。しかしDEPをサポートすることで、コンピュータの安全性は高まることは間違いない。とはいえ、誤解してはならないのは、だからといってウイルス対策ソフトウェアやファイアウォール・ソフトウェアといったほかのセキュリティ手段が不要になるわけではないことだ。ここまで解説したように、DEPはあくまでもバッファ・オーバーフローによる不正なコードの実行のリスクを軽減するものであり、DEPによってすべてのウイルスやワームを防止できるわけではない。ウイルスやワームの攻撃手段はさまざまであり、年々巧妙さを増している。定期的なシステムのアップデートに加え、ウイルス対策ソフトウェアやファイアウォール・ソフトウェアの利用は、安全なコンピューティングに欠かせないことは覚えておこう。記事の終わり

  関連記事 
運用:ネットワーク管理者のための Windows XP SP2レビュー
 
  関連リンク
Enhanced Virus Protection in AMD Opteron and Athlon 64 Processors
 
目次ページへ  「System Insiderの解説」


System Insider フォーラム 新着記事
  • Intelと互換プロセッサとの戦いの歴史を振り返る (2017/6/28)
     Intelのx86が誕生して約40年たつという。x86プロセッサは、互換プロセッサとの戦いでもあった。その歴史を簡単に振り返ってみよう
  • 第204回 人工知能がFPGAに恋する理由 (2017/5/25)
     最近、人工知能(AI)のアクセラレータとしてFPGAを活用する動きがある。なぜCPUやGPUに加えて、FPGAが人工知能に活用されるのだろうか。その理由は?
  • IoT実用化への号砲は鳴った (2017/4/27)
     スタートの号砲が鳴ったようだ。多くのベンダーからIoTを使った実証実験の発表が相次いでいる。あと半年もすれば、実用化へのゴールも見えてくるのだろうか?
  • スパコンの新しい潮流は人工知能にあり? (2017/3/29)
     スパコン関連の発表が続いている。多くが「人工知能」をターゲットにしているようだ。人工知能向けのスパコンとはどのようなものなのか、最近の発表から見ていこう
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

System Insider 記事ランキング

本日 月間