Windows XPのデータ実行防止
はじめまして、リサーチチームの本郷です。
日々のリサーチの中で気がついたちょっとしたことを紹介していきたいと思います。
どうぞよろしくお願いします。
今回はWindows のデータ実行防止(Data Execution Prevention 以下DEP)について話したいと思います。
DEPはWindows XP SP2 および Windows Server 2003 SP1から導入されたWindows のセキュリティ機構の一つです。
DEPにはソフトウェアDEPとハードウェアDEPがありますが、今回はハードウェアDEPについて取り上げます。
メモリ内部のセクションには大きく分けて、コードセクションとデータセクションがあります。コードセクションでは読み・実行が許可されており、データセクションでは読み・書きが許可されています(ここではそういう解釈で話を進めます)。
DEPはメモリ内の実行不可領域でのコード実行を防ぐもので、許可されてない領域でコードを実行しようとすると例外が発生します。
みなさんもこのような画面を見たことがあるのではないでしょうか
DEPの設定
DEPは4つの設定が用意されており、OptIn、OptOut、AlwaysOn、AlwaysOffがあります。
・OptIn
特定のプログラム(システムプログラムなど)のみDEPが適用されます。
・OptOut
すべてのプログラムにDEPが適用され、指定されたプログラムのDEPを解除することが可能です。
・AlwaysOn
すべてのプログラムにDEPが適用されます。
・AlwaysOff
すべてのプログラムにDEPが適用されません。
現在の状態はbootcfg /Queryで確認することができます。
Windows XP ではデフォルトでOptInに設定されており、特定のプログラムにだけDEPが適用されています。
システムのプロパティの詳細設定->パフォーマンス オプションのデータ実行防止タブから「次に選択するものを除くすべてのプログラムおよびサービスについてDEPを有効にする」を選択することでOptInからOptOutに変更することが可能です。
画面の状態はOptInに設定されている状態です。
AlwaysOnやAlwaysOffにする場合はboot.iniファイルを変更する必要があります。
各プロセスに対するDEPの設定
DEPはプロセスごとに設定されます。DEPが設定されている場合の設定として、通常のDEPとDEP(permanent)があります。
通常のDEPに設定されている場合は、アプリケーション実行後にDEPの設定を変更することができ、DEP(permanent)に設定されている場合、DEPの設定を変更することはできません。
通常のDEPが適用されている場合、NtSetProcessInformation APIを使用することでDEPのON/OFFを操作することが可能です。
そのため、以前このブログでも紹介したReturn-Into-Libcを利用して、NtSetProcessInformation APIでDEPを無効化することで、実行不可領域に置いた攻撃コードを実行することが可能となります。
この手法は、NtSetProcessInformation API 呼び出しの際、引数にNULLバイトが必要となるため、
文字列処理のAPIによるバッファオーバーフローなどの脆弱性を利用する場合には使えません。
また、Uninformed - vol 2 article 4 でntdll内部のマシン語命令を利用してDEPを回避する方法が紹介されています。
一方、DEP(permanent)はこのNtSetProcessInformationを使用してもON/OFFを切り替えることはできません。よって上述した攻撃を防ぐことが可能です。
Windows XP でデフォルトではDEP(permanent)は有効になっておらず、DEP(permanent)を有効にしたい場合は、AlwaysOnに設定するか、OptIn/OptOutに設定し、アプリケーション内部でDEP(permanent)を有効にする必要があります。
そのため、ユーザー側でDEP(permanent)にするにはAlwaysOnを選択する必要があります。
また、プロセスごとのDEPの適用状態はSysinternal SuiteのProcessExplorerで確認することができます(Vista以降であれば、タスクマネージャーから確認できます)。
Google ChromeやFirefoxではOptIn/OptOutの場合もDEP(permanent)となっていることが確認できます。
アプリケーション開発時の設定
アプリケーション開発時に/NXCOMPAT オプションを有効にしてリンクした場合、Vista以降ではDEP(permanent)が有効になるのですがXPでは適用されません。
前述の通り、システムがOptInおよびOptOutに設定されている場合にDEP(permanent)を有効にするには
アプリケーション内で明示的に有効にしてあげる必要があります。
Windows XP SP3 からはSetProcessDEPPolicy APIを使用することで、DEP(permanent)に設定することが可能です。
実際、SetProcessDEPPolicy API内部でNtSetProcessInformation APIを呼び出し、設定を行っています。
Windows XP SP3上でOptIn、OptOutが適用されている場合に/NXCOMPAT オプションをつけてリンクしたDep.exeとDEP(permanent)をアプリケーション内部で有効にしたDepPermanent.exeの違いを比較してみます。
ProcessExplorer上で通常のDEPが適用されている場合はDEPと表示され、DEP(permanent)が適用されている場合にはDEP(permanent)が表示されます。
システムにOptInが適用されている場合
Dep.exeはDEPが適用されていないが、DepPermanent.exeにはDEP(permanent)が適用されています。
システムにOptOutが適用されている場合
Dep.exeはDEPが適用されており、DepPermanent.exeにはDEP(permanent)が適用されています。
このようにWindows XPのデフォルト設定では、特定のアプリケーションにのみDEPが適用されています。デフォルトの設定で使用しているユーザーが多いことを考えると、アプリケーションを開発する側でDEPの設定を行ってあげることで、攻撃の可能性を減らすことが可能です。
---
このブログ中における株式会社フォティーンフォティ技術研究所(以下FFR)の社員による発言やコメントは、FFRの正式な見解またはコメントではありません。このブログは、FFRおよびココログの倫理規定に即して運営されており、倫理規定に反する内容のトラックバックは、事前のお知らせなしに削除させていただく場合があります。予めご了承ください。
| 固定リンク
| トラックバック (0)
|





