DEPでメモリ保護を実行しよう - 適宜覚書-Fragments

DEPでメモリ保護を実行しよう

      2017/03/08

DEPとは、WindowsXPのSP2以降、またはWindows2003ServerSP1以降で取り入れられた機能で今後のWindowsOSには全てこの機能が含まれるらしい。これはインストールされたアプリケーションがシステムメモリを正常に使っているかどうかを確認することが目的のもので、本来コード実行に使われるべきでないメモリ領域(例えば、デフォルト ヒープ ページ、スタック ページ、メモリ プール ページなどのデータ ページ)を使おうとする行儀の悪いプログラムの動作を防止してくれる。具体的にはOSカーネルのバッファ・オーバーフローの脆弱性に対する攻撃を防ぐことが念頭にあるとされている。

この機能の扱いが難しい。以下に二つ理由を挙げる。

  • 本来ウィルスとか悪意的に設計されたプログラムがインストールされてしまった後メモリの不正利用をする傾向があるための事後対策である。しかし、インストール前の予備策と誤解される。
  • 正規のアプリケーションでも工夫と創意の名の下にメモリを不正利用しているかもしれない。つまり、仕様を整備しようとしていてもそれを破らないと目的を達せられないようなソフトウェアというのも少なからずあり、利便性を取るべきかどうかの選択はエンドユーザに委ねられる。(既定のDEPの設定は一般アプリケーションは監視対象としていない。監視対象に組み入れる場合、すべてのプログラムに対し監視を行う設定を行い、差し障りのあるものだけ除外対象として指定する)

DEPには、ソフトウェアDEPとハードウェアDEPの二種類がある。ソフトウェアDEPは既定で有効化されている。ハードウェアDEPはAMD が定義した非実行ページ保護 (NX) プロセッサ機能、もしくはIntel が定義した Execute Disable Bit (XD) 機能のハードウェアなら自動でboot.iniでPAEモード(物理アドレス拡張。64 ビットのアドレスをカーネル モードのコンポーネントに転送する)に設定され有効になる。残念ながら、うちのPCは対象CPUを搭載していない。

DEPの設定は4つから選択出来る。

  • OptIn:SP2等適用後の既定設定。Windows システムのコンポーネントおよびサービスにのみ保護対象とする。「データ実行防止」のGUIで指定可能。
  • OptOut:全プロセスに対して有効。除外 アプリケーションのリスト設定可能。「データ実行防止」のGUIで指定可能。
  • AlwaysOn:全プロセスに対して有効。boot.ini直接編集で設定。
  • AlwaysOff:全プロセスにも無効。boot.ini直接編集で設定。

OptOutがあればAlwaysOnは要らない気がするが、多分キッチリ区分けたかったのだろう…と適当な憶測をしておく。ちなみに、この選択の変更は再起動後、有効になる。boot.iniで動かす以上当然なのかもしれないが…。

バッファオーバーフローについて

基礎知識が無いので纏めてみる。転載に近いものを切り貼りして血肉になっていないから、再考しなきゃいかんかもしれんが…。

コンピュータは多くの機器から構成されている。しかし,その動作原理はCPUがメモリに格納された命令を順番に実行しているだけである。

  • メモリーは「アドレス」で管理
  • CPUはメモリーから命令を読み出して実行

つまり、あるアドレスに格納された命令を読み出して実行するためには,CPUは読み出すアドレスを常に知っていなければならない。このため,CPUは実行すべきアドレスを一時的な記憶(スタック)として持っている。それがEIP(Extended Instruction Pointer)である。

メモリーは、格納するデータの種類によって利用する領域が分割されている。例えばWindowsでは、

  • Text:プログラム・コードを格納する。データ読み出し元、書き換え不可
  • System DLL:システムAPIを格納する。データ読み出し元、書き換え不可
  • スタック:固定長のデータを格納する。書き換え可能
  • ヒープ:可変長のデータを格納する。書き換え可能

TextやSystem DLL領域を書き換えようとすると,CPUは「メモリー保護違反」のエラーを発し,Windowsはエラーを起こしたプログラムを終了する。メモリの書き換えはそういった保護がなされている。

しかし、バッファオーバーランはこれを書き換える。固定長で決められたスタック領域の変数用バッファに対し、格納可能データ長を超えるデータを書き込む。すると本来のバッファとは別個にあるリターンアドレス(EIP)の領域まで塗りつぶされる。そこで任意のリターンアドレス(EIP)を指定し、そのアドレスの先に悪意を持ったシェルコードを置いて実行させる。

この一連の過程を成立させるには以下の四つの条件をクリアする必要がある。

  1. 変数の格納時に,データ長チェックがされていないこと
  2. あふれを発生させるデータ量が明確に算出できること
  3. リターン・アドレスを書き換えられること
  4. リターン・アドレスの値をシェルコードの格納されているアドレスに指定できること

ソフトウェアDEPでは、例外処理を悪用しようとした場合、「リターン・アドレス(EIP)の値をシェルコードの格納されているアドレスに指定できること」を許可しない。例外処理プログラムを実行するときに、Windowsに登録されているものかどうかのリストチェックを行い、リストに無い場合には実行をさせない。

関連情報

適宜覚書-Fragmentsは、筆者が興味をもった様々な情報やネタを筆者が忘れても後で思い出せるよう覚書として公開するBlogです。Google Chrome拡張、Facebook、Google、Twitter、Windows、各種Webアプリなどを扱うことが多いです。この覚書が、もし何かお役立ちになれば幸いです。

 - Tips, Windows, 覚書 , , , , , , ,