メモリ保護 ( DEP/NX Memory Protection ) 機能の IE7 と IE8 の違い

こんにちは、五寳です。

IE7 から実装されているメモリ保護 ( DEP/NX Memory Protection ) の機能ですが、IE8 からは (条件がそろえば) デフォルトで有効になっています。
Beta1 の時に、Eric Lawrence が "IEBlog: IE8 Security Part I: DEP/NX Memory Protection" にて、この機能について解説しており、私もセミナー等でみなさんに評価をお願いしてきましたが、IE8 では、この項目が表示される場合とされない場合があったりするので、今回まとめておこうと思います。

IE8 DEP NX Setting

まず最初に、IE7 と IE8 に実装されているメモリ保護機能は、名前は同じでも中身の仕様は変わっています。

メモリ保護機能をおさらいしておくと、、、
CPU の機能として実装された DEP/NX (OS としては Windows XP SP2 からサポート) は、ハードウェア的にあるコードが non-executable (実行不可) とマークされたメモリ空間において実行されることを防ぐ機能であり、Address Space Layout Randomization (ASLR) などの他の技術と組み合わせて使うことによって、バッファオーバーランのようなメモリの脆弱性を突いた攻撃をより強力に防ぐことができます。

しかしながら、最終的に開発者の皆様に実施していただきたい項目は、上記の IEBlog にあるとおりで変わりません。ですので、メモリ保護機能対応 (対策) で実施して欲しいことを先に挙げておきます。

  1. コードが古い ATL に依存している場合は、ATL v7.1 SP1 以上で再ビルドしてください。
    (Visual Studio 2005 には ATL 8.0 が含まれています。)
  2. Extention (ActiveX コントロールなど) を DPE/NX に対して互換性を持たせるためには、/NXCompat リンカーオプションをつけてください。
  3. コードを DEP/NX オプションを有効にした IE8 on Vista SP1 の環境でテストしてください。
    (あわせて、DEP/NX オプションを有効にした IE7 on Vista でのテストすることをお勧めします。)
  4. その他、コードを防御するためには、Stack Defense (/GS), Safe exveption handling (/SafeSEH) や ASLR (/DynamicBase) のオプトインを実施してください。

さて、IE7 では CPU が DEP/NX に対応していないマシンでも、この項目は表示されており、有効にすることでソフトウェア的にメモリリークを促す脆弱性に対抗してきたわけですが、IE8 では、IE7 で有効になっていたとしても、OS と Service Pack の組み合わせによってこの機能を利用できない場合があります。

  • IE8 でメモリ保護 ( DEP/NX Memory Protection ) 機能を利用できない (項目自体が無効:非表示)
    • ハードウェア ( CPU ) が DEP/NX に未対応 (BIOS で初期状態で無効にしてある PC もあるので注意。)
    • Windows XP SP2 以下
    • Windows Vista サービスパックなし
    • Windows Server 2003 すべて
  • IE8 でメモリ保護機能を利用できる
    • ハードウェア ( CPU ) が DEP/NX に対応 ( BIOS で有効になっているもの) が前提
    • Windows XP SP3 以上
    • Windows Vista SP1 以上
    • Windows Server 2008 以上

では、なぜ IE8 でメモリ保護機能が利用できる・できないの差があるのかというと。。。を述べる前に、IE8 でこのメモリ保護機能が ( 利用できる環境で ) デフォルトで有効になっている理由から説明します。

IE7 のプランニングの際、当初は IE7 でもデフォルトでこのメモリ保護機能を有効にしようとしていました。しかし、ベータプログラムのフィードバックなどから、互換性の問題の影響が大きかったので ( 当時の多くのポピュラーなアドオンは、古い ATL でビルドされたものが多く、メモリ保護機能と互換性がないので、これを有効にしているとアドオンがロードされた時点で IE がクラッシュしていました。 ) 、ユーザーへ多大な迷惑をかけることを予想し、デフォルト無効にすることになりました。(Windows Server 2003 の IE7 はデフォルト有効。サーバーなので。。。)

しかし、月日は流れ、セミナーなどの啓蒙活動により IE8 の Beta をリリースできるくらいの時期には、、、

  • よく使われるアドオンは ATL v7.1 SP1 以上で再ビルドされ、または DEP/NX の互換性を持った。
  • 最新の Windows OS のサービスパックには、新しい DEP/NX の API が実装された。

この 2 点の好転により、IE8 ではメモリ保護機能をデフォルト有効にする方向性に決まりました。
特に、新しい DEP/NX の API を使うことで、"DEP/NX 機能に引っかかるようなコーディングをしていないにも関わらず、単純に古い ATL でビルドしている" アドオンがクラッシュしなくなったことは、一番大きな改善であると思います。

ここまでをまとめると、
IE8 でメモリ保護機能を効果的に使うには、 新しい DEP/NX の API が使える OS / サービスパックであること」 が挙げられます。
加えて、
より強力に保護するために、バッファ オーバーフロー攻撃が DEP をバイバスして return-to-libc 攻撃になることを防いでくれる 「Address Space Layout Randomization ( ASLR ) が利用できる OS / サービスパックである」 必要がありました。

IE 8 のメモリ保護機能は、この 2点 によって、アプリケーション互換性のリスクを最小限にしながら、高いセキュリティの効果が得られる機能に大幅に改善され、そして、これを実現できる OSとサービスパックが上記に挙げた、 "IE8 でメモリ保護機能を利用できる" ものとなったわけです。

開発者の皆様はテストされる際には、開発・評価環境を今一度お確かめいただければ幸いです。

(補足) 64bit OS に搭載されている 64bit IE8 は、無条件でメモリ保護機能が有効になっていて、これを 32bit IE8 のように無効にする (IE8 を管理者権限で起動させることによって、普段グレーアウトしている項目のチェックをオフにできる) 方法はありません。なので、64bit IE8 の詳細設定には、この項目が表示されていません