Preview版に導入された、ROP攻撃を緩和する5つの技術についてもう少し詳しく見てみましょう。参考文献はEMETに付属するユーザーズ・ガイド、および、下記のマイクロソフトのブログ記事です。checks)この機能はLoadLibrary関数の呼び出しを監視し、SMBパスによるリモートからのDLLのロードを防ぎます。「\\server\share\foo.dll」といった形でリモートホスト上のDLLを指定してLoadLibraryを呼び出すことを阻止します。checks)DEPによる保護を回避するため、攻撃者はしばしばスタック領域のメモリ・ページを動的に実行可能にする関数呼び出しを行いますが、この機能はスタック領域が実行可能に変更されることを防ぎます。checks)VirtualAllocや、VirtualProtect、HeapCreate、LoadLibraryといった、ROP攻撃においてよく利用される関数(EMETではこれらの関数を「クリティカル関数」と呼んでいます)がreturn命令ではなくcall命令によって正しく呼び出されたかどうかを確認する機能です。flow)この機能はクリティカル関数のリターンアドレスからいくつかのインストラクションのシミュレーションを行い、ROPのテクニックが使われているかどうかをチェックします。シミュレートするインストラクションの数はデフォルトで15です。mitigation)スタック・ピボットが行われたか、つまりスタックの位置がありえない場所に変更されたかどうかを検知します。これらのROP攻撃の抑止技術はデフォルトではOFFの状態になっていますので、使用したい場合はアプリケーション・プログラムごとに明示的にONにする必要があります。アプリケーション・プログラムによっては、これらの抑止技術により正常な動作が阻害される可能性があるため注意が必要とされます。興味深いことにこれらの技術は、前述したクリティカル関数のいずれかが呼ばれた際に機能するように、これらの関数の先頭にフックする形で実装されています。ROP攻撃ではこのような関数が呼ばれるという前提に立った実装だと言えるでしょう。具体的にどの関数がクリティカル関数として扱われているかについては、明確な資料は見当たりませんが、ざっと調べた限りでは少なくともkernel32.dll中の以下が対象となっているようです。WriteProcessMemory前述のマイクロソフトのブログ記事にも明記されていますが、このような実装方式の欠点としてこれらのクリティカル関数を呼び出さない攻撃が行われた場合、つまり例えばもっと低レベルの関数が使用された場合などは、残念ながらROP攻撃の抑止機能は効果を発揮することができません。Preview版がリリースされた2週間後には、それを回避する攻撃手法が公開されています。Mitigationshttp://repret.wordpress.com/2012/08/08/bypassing-emet-3-5s-rop-mitigations/最終的なリリースで実装方法が変更されるかどうかはわかりませんが、いずれにせよこのようなROP攻撃の抑止機能は、EMETが持つ数多くの防御機能の一つとして有効であることに変わりはありません。大切なのは多角的に複数の防御を施すことにより、攻撃者にとってのハードルを上げることです。EMETにとってはどれか一つの防御が攻撃を防ぐことができれば事足りるわけですから。EMETはv3.0以降、プロファイルを使用したコンフィグレーションや、グループポリシーによる管理、またイベントログへの記録およびポップアップによるユーザ通知といった機能が追加され、使い勝手と組織内展開の面で一段と向上していますので、この機会に組織内におけるEMETの導入を検討されることをお勧めします。それではみなさん、またお会いしましょう。それぞれ各社・各団体の商標または登録商標です。