データ実行防止
データ実行防止(Data Execution Prevention, DEP)は、Microsoft Windowsに搭載されているセキュリティ機能である。この機能の目的は、アプリケーションやサービスが実行不可能なメモリ領域からコードを実行することの防止である。これはある種の攻撃 (たとえばバッファオーバーフローを経由してコードを格納するもの) を防止する効果がある。DEPには2つの動作モードがある: メモリページを実行不可能とマークできるCPUのためのハードウェアDEPと、ハードウェアサポートがないCPUのためのソフトウェアDEPで、後者の防御はより限られている。ソフトウェアDEPはコードがデータページから実行されることを防がないが、代わりに他の攻撃 (SEH オーバーライト) を防止する。
DEPはWindows XP Service Pack 2で導入され、Windows XP Tablet PC Edition 2005、Windows Server 2003 Service Pack 1以降、Windows Vista、Windows Server 2008、およびそれ以降のすべてのバージョンのWindowsに含まれている。
ハードウェアDEPは互換性のあるCPU上でNXビットを有効にする。このために32ビットWindowsではPAEカーネルが自動的に使われる。64ビットカーネルではネイティブサポートされる。Windows VistaのDEPはメモリの特定の部分がデータの保持のみを目的にしているとマークし、NXもしくはXDビットの有効なプロセッサがその領域を実行不可能であると認識することによって機能する。これはバッファオーバーフロー攻撃の成功を妨げる。Windows Vistaでは、プロセスのDEPの状態、すなわち、DEPがある特定のプロセスで有効か無効かはWindows タスク マネージャーのプロセスタブに表示できる。
場合によっては、データ実行防止は正当なソフトウェアの実行を妨げるという意図しない結果をもたらすことがある。この場合、影響を受けるソフトウェアはそのメモリの一部からコードの実行を許すようフラグを立てる必要があるが、もしアプリケーションが実行可能であるとマークされたメモリ領域に渡されたデータの検証を厳密に行わないと、これ自身が攻撃の可能性につながる。
もしx86プロセッサがこの機能をハードウェアでサポートし、またシステムのBIOSがこの機能をサポートし、かつ製造業者もしくはユーザーのどちらかが機能を有効にしたなら、NXの機能はWindowsで、限られた「オプトイン」に基づいて有効にされる。この設定はWindowsシステムとバイナリファイルの限られた一部にのみ保護を提供する。完全な保護を達成するには、ユーザーは、「オプトアウト」を選んで特別に免除されていないすべてのプログラムとプロセスを対象にするか、「常に有効 (AlwaysOn)」を選んでそのような例外なしですべてを対象にする必要がある。これらは「システムのプロパティ」のインターフェースを通して構成可能である。もし機能がx86プロセッサによってサポートされていないなら、保護は提供されない。x86アーキテクチャ以外では、NXと同様のものがインテルのIA-64アーキテクチャにも存在し、Windowsによってサポートされている。
ソフトウェアDEPはNXビットとは関係ないが、マイクロソフトが「安全な構造化例外処理 (SafeSEH)」と呼んでいるものである。ソフトウェアDEP/SafeSEHは単純に例外が投げられたときチェックを行い、例外がアプリケーションの関数テーブルに登録されていることを確認する。このためプログラムは関数テーブルを含めてビルドされる必要がある。しかしながら、ソフトウェアDEPはデータページからのコードの実行を防止することと関連があるという印象を与えはするものの、それは別種の保護である。
他のオペレーティングシステムで利用可能な類似の保護機構と異なり、DEPはアドレス空間配置のランダム化 (ASLR、Windows Vistaで利用可能になった新機能) を提供しない。このためために使える可能性のあるreturn-to-libc攻撃を許すかもしれない。
この可能性は、以下のUninformedの記事"skape & Skywing"の著者によって、すでにWindowsのハードウェアDEPに対してデモンストレーションされた。これはreturn-to-libc型の攻撃に依存している。この技術は、OptIn/OptOut機構を適用する既知のサービスパック依存の位置をEIPレジスタが直接指すことに依存している。またOptOut/OptInを利用可能にするブート時オプションに依存している。もしすべてのページが厳密にDEPを適用されていれば、攻撃は成功しないであろう。PaXの文書は、なぜASLRが必要なのかさらに解説している。DEPは、コードを実行時に書き込んで実行する必要がある場合にも役に立たない。JITコンパイラがよく知られた例である。JITコンパイラは(たとえばJIT Sprayの使用により)攻撃コードの生成に使われる可能性がある。生成されたコードは実行可能であるとフラグが立てられており、そのためDEPによってトラップされない。
DEPは(通常古いソフトウェアで)ソフトウェアの問題の原因となることがある。しかし、エイジ オブ ミソロジーのような一部のアプリケーションについては問題を解決することもある2008年11月。DEPはプロセス全体に適用されるので、アプリケーションがまったく問題なくDEP有効で動作したとしても、DEP非互換の拡張機能が追加されるとDEPを無効にしなければならないことがある。
ユーザーは、VistaとWindows Server 2003 R2の一部として含まれている、マイクロソフトのServices for Unixの一部である各種コマンドラインコマンドで問題に遭遇することがある。
ほとんどの場合、これらの問題はDEPの機能を無効にすることによって解決できる。DEPはアプリケーションごとに無効にすることもできるし、重要なWindowsのプログラムとサービスを除いてすべてで無効にすることもできる。マイクロソフトはアプリケーションがDEPのエラーでクラッシュしたときに、DEPをシステム全体で無効にしないよう推奨している。代わりに、問題を起こしたソフトウェアの作者やベンダーにまず連絡して、DEPに違反しない更新バージョンを確認し、それに失敗したら、DEPを問題の起きたアプリケーションでのみ無効にすべきであるとしている。
「COMサロゲートが動作を停止しました」というエラーがときどきWindows Vistaでメディアフォルダを見ているときに発生し、dllhost.exeでDEPを無効にすることで解決する場合がある。Windows Vistaでこのエラーが起きる原因は、多くのサードパーティー製の映像や音声のコーデックがDEP互換ではないことにある。この問題は一般に、すべてのインストールされているコーデックを最新バージョンに更新することによっても解決する場合がある。
DEPの問題は、Windows Explorer、Internet ExplorerおよびWindows Installerのような、DEP互換の中核的なオペレーティングシステムコンポーネントでも発生しうる。これらは、DEP互換ではないかもしれないサードパーティー製のプロセス内拡張やプラグインをサポートするからである。
本節では、4つの利用可能なDEPのモードについて解説する。モードのうち2つ (OptIn, OptOut) はコントロールパネルのシステムアプレットのパフォーマンスオプションダイアログボックスを通して制御できるが、残りの2つ (AlwaysOn, AlwaysOff) はWindows XPではboot.iniの直接編集で、Windows Vistaとそれ以降ではコマンドプロンプトのbcdeditコマンドによってのみ制御可能である。
OptIn: この設定はWindows XP、Vista、7、8の既定の構成である。このモードでは、DEPは限られたWindowsのシステムアプリケーションとサービスでのみ有効になる。アプリケーションはオペレーティングシステムによってオプトインを強いられない -- オプトインを望むアプリケーションは、明示的に保護の要求を提示しなければならない。ただし64ビットWindows上の64ビットアプリケーションとサービスは例外である: このモードで走る64ビットのアプリケーションとサービスは常にオプトインでありオプトアウトの要求は無視される。
OptOut: この設定はWindows Serverのデフォルト構成である。このモードでは、DEPは既定ですべてのプログラムとサービスに対して有効にされる。コントロールパネルのシステムダイアログボックスを使って、DEPが適用されるべきでない特定のプログラムの一覧を入力できる。ネットワーク管理者はApplication Compatibility Toolkitを使って、DEPの保護からプログラムを「オプトアウト」できる。DEPの保護を望まないプログラムとサービスは明示的にオプトアウトの要求を提示しなければならない。
AlwaysOn: この設定はシステム全体に完全なDEPの保護を提供する。すべてのプログラムは常にDEPを適用して実行される。例外の一覧、アプリケーション互換shimおよびオプトアウト要求は無視される。
AlwaysOff: この設定はDEPを完全に無効にする。32ビットWindows上のカーネルとドライバに対するDEPはこのモードでのみ無効になる。すべてのオプトイン要求は無視される。
Boot.iniファイルのパラメーター/noexecute=policy_levelでDEP設定を調整できる。ここでpolicy_levelはOptIn、OptOut、AlwaysOnもしくはAlwaysOffのいずれかである。