SPN通信 2012年8月27日

ROP攻撃の緩和機能が追加されたEMET Tech Preview版(前編)


みなさん、こんにちは。 SPNの塩月です。

先月のことになりますが、マイクロソフトがEMET v3.5 Tech Preview版を公開しました。

  • EMET v3.5 Tech Preview が公開されました
    http://blogs.technet.com/b/jpsecurity/archive/2012/07/27/3511225.aspx

EMET(Enhanced Mitigation Experience Toolkit)については過去のSPN通信でも何度か取り上げましたが、これはバッファオーバーフローのようなソフトウェアの脆弱性を悪用した攻撃を、緩和するためのWindows OS用アドオンツールです。

今回公開されたバージョンはテクノロジー・プレビュー版ということですので、あくまでも評価目的での公開になりますが、このバージョンではROPという攻撃手法に対抗する以下の5つの技術が導入されています。

  • ロードライブラリ・チェック(Load library checks)
  • メモリ保護チェック(Memory protection checks)
  • 呼び出し元チェック(Caller checks)
  • 実行フロー・シミュレーション(Simulate execution flow)
  • スタック・ピボットの検知(Stack pivot mitigation)

ROP(Return-Oriented Programming)とは、WindowsのDEP(データ実行防止)のようにメモリ中のデータ領域での不正コード実行を防止する機能を、回避するための攻撃手法の一つです。

例えばスタック・バッファオーバーフローの脆弱性を利用してシェルコードを実行させるケースを考えてみましょう。通常、攻撃者はプロセス・メモリのスタック領域にシェルコードを送り込み、そこへプロセスの制御を移すことによりシェルコードを実行させようとします。しかしWindowsのDEP(正確にはハードウェアDEP)はスタック中でのプログラムコードの実行を防止しますので、DEPが有効の場合は攻撃が成功しません。

そこで攻撃者はDEPを回避するためにROPの手法を使用します。ROP攻撃のポイントは、プロセス・メモリ内のコード領域に点在する「return命令を伴ったプログラムコードの断片」を連続的に実行するところにあります。下の図はROPのイメージを表しています。

【コード領域】                     【スタック領域】

  ......                            |     ↑     |
  ret                               |            |
                                    |------------|
0x77bfcb29 <-- retによりジャンプ -- | 0x77bfcb29 |
  pop edx                           |------------|
  ret                               | 0x00134560 | --> pop edxにより 
                                    |------------|     edxレジスタへ
0x77bf2254 <-- retによりジャンプ -- | 0x77bf2254 |
  pop ecx                           |------------|
  ret                               | 0xdeadbeef | --> pop ecxにより
                                    |------------|     ecxレジスタへ
0x77bf3c40 <-- retによりジャンプ -- | 0x77bf3c40 |
  mov [edx],ecx                     |------------|  mov [edx],ecxにより
  ret                               |            |  アドレス0x00134560に
                                    |            |  0xdeadbeefがコピー
return命令が実行されると、スタックの先頭に積まれているアドレスのプログラムコードへと制御が移ります。図のように、あらかじめスタック上にジャンプ先のアドレスやパラメータを積んでおき、直後にreturn命令があるようなインストラクションへ次々とジャンプさせることで、攻撃者の意図したさまざまなコード実行が可能になります。この場合、コードの実行は通常のコード領域で行われますのでDEPによる防御は働きません。

ヒープ・スプレイ攻撃のように攻撃者の制御可能なデータ領域がヒープ領域の場合は、最初の段階で「xchg eax,esp / ret」といったコードを実行することで、スタックポインタがヒープ領域を指すように仕向けます。つまりスタックの位置を強制的にヒープ領域へと変更させるわけですね。このような行為はスタック・ピボットと呼ばれます。

ROPの手法を使用することでDEPを回避した柔軟なコード実行が実現できますが、ROPのみで大量の複雑な処理を行うことは困難です。そのため実際の攻撃では、例えばROPを利用してVirtualProtect関数を呼び出し、データ領域に送り込んだシェルコードを動的に実行可能に変更した後、そのシェルコードを実行させるといったことが行われます。

ROP攻撃の考え方については以下の資料がわかりやすいので、興味のある方はご参照ください。

  • Practical Return-Oriented Programming
    http://trailofbits.files.wordpress.com/2010/04/practical-rop.pdf

(後編へ続く...)

合同会社セキュリティ・プロフェッショナルズ・ネットワーク
代表社員 塩月誠人