「Return Oriented Program(ROP)」はReturn to Libcと同様の攻撃手法ですが、APIではなく、プログラム中に(偶然)存在する、自分が実行したい短いマシン語を見つけて、これに制御を移す手法です。
この手法はいま最もホットなエリアで、2013年に開催されたBlueHat Prizeコンテストで表彰された上位3手法の全てがROP対策でした。
ROPは、メモリ上に展開された実行イメージ中で、自分が意図したマシン語に相当するバイナリデータを使います。図5では、本来は“move eax, 0xc3084189”となっているプログラムを、意図的に1バイトずらすことにより、“move [ecx+8], eax; ret”というプログラムとして利用します。
Return to Libcで解説した例でも、“jmp esp”の命令は、ROPを利用することができます。
ここで紹介をした攻撃に対して、Windowsではいくつかの対策が用意されています。その一つは「ブートフラグでDEPをAlwaysOn(表1を参照)にする」ことで、DEPの無効化を回避する方法です。ただし、この対策は、VirtualProtectを使った攻撃の対策にはならない点に注意が必要です。
大きな実行イメージの中から、意図したコードに相当するバイト列を見つけることは、必ずしも難しいことではないようで、ROPの対策が大きな課題となっています。先にご紹介したBlueHat Prizeで表彰されたROP対策の一部は、EMET(Enhanced Mitigation Experience Toolkit)4.1以降から逐次取り込まれています。
DEPの回避策に利用されるReturn to Libcや、ShellcodeからAPIを呼び出すためには、APIの絶対アドレスを事前に攻撃者が知る必要があります。このため、APIをはじめとしたさまざまなアドレスが事前に特定ができない場合、攻撃を成功させることが極めて難しくなります。これは「ASLR(Address Space Layout Randomization)」と呼ばれる技術で、WindowsではVistaから導入されています。
次回は、このASLRについてご紹介をしていきます。
高橋 正和(たかはし まさかず)
チーフ セキュリティ アドバイザー
1980年代初頭からミニコン、PC-98、8085、4ビットマイコンなどを使った制御システムの開発などを経験。
1980年代中頃から、日本デジタル研究所株式会社で標準ライブラリの開発保守、開発環境の開発保守、独自OSからWindows NT/Windows XPへの移植、品質管理、新入社員向けのC言語の新人教育などを担当した。
標準ライブラリでは、ファイルシステムやSocketライブラリの開発・実装・保守、開発環境では、68K系のCPUにWhite Sims’s Cによるリロケータブルな実行ファイル形式という特性を使って、オーバーレイリンカー・ローダー等も開発した。
1999年にISS(現在はIBM)セキュリティに関わり、2006年から現職(日本マイクロソフト株式会社 チーフセキュリティアドバイザー)を務める。
Copyright © ITmedia, Inc. All Rights Reserved.