徹底検証:Internet Explorer 9および10に存在するゼロデイ脆弱性を利用するエクスプロイトコード

Internet Explorer(IE)に存在する脆弱性は、どれも深刻な問題ですが、2014年2月17日のブログで報告したゼロデイ脆弱性「CVE-2014-0322」は、とりわけ注視すべきものです。今回のゼロデイ攻撃では、異なる技術を使用した複数のコンポーネントに分割された不正なエクスプロイトコードを利用しています。今回の事例では、エクスプロイトコードは、JavaScript および Adobe Flash 間で分割されていました。このようにエクスプロイトコードを分割させることで、攻撃者は、脆弱性を利用した不正コードの実行を困難にさせるための機能「Address Space Layout Randomization(アドレス空間レイアウトのランダム化、ASLR)」やセキュリティ機能「Data Execution Prevention(データ実行防止、DEP)」といった OS レベルの防御システムを回避できるようになります。

次に、どのようにしてこのエクスプロイトコードがユーザに被害を与えたのかについて考えてみましょう。問題となった Webサイトは改ざんされており、以下の 2つの不正なファイルが Webサイトへアップロードされていました。

  • Erido.jpg(「HTML_EXPLOIT.PB」として検出。MD5ハッシュ:00ae7a1514809749a57d4d05d8c969b5)
  • Tope.swf(「SWF_EXPLOIT.PB」として検出。MD5ハッシュ:732b6a98b0a7b2ee795f2193a041520d)

エクスプロイトコードがどのように実行されるのか、図1 で解説をしています。

図1:ゼロデイ脆弱性「CVE-2014-0322」を利用するエクスプロイトコード
図1:ゼロデイ脆弱性「CVE-2014-0322」を利用するエクスプロイトコード

改ざんされた Webサイトのページ “img.html” は、不正な Flashファイルを読み込むために、以下のように JavaScript および iframe を挿入して変更されていました。

  • <embed src=Tope.swf width=10 height=10></embed>

上述のタグが読み込まれると、Flashファイルは「Heap Spray」を実行します。そして、Flashファイル内の call関数を介し、JavaScript に受け渡します。脆弱性「CVE-2014-0322」を利用する実際の不正なコードは、Flashファイル内ではなく、JavaScript内に存在します。ただし、この脆弱性を利用する攻撃が今後行なわれるのを防ぐため、このエクスプロイトコードに関する詳細については、これ以上言及はしません。その後、JavaScript は、任意のメモリの読み書きに関与するコードが存在する Flashファイルに返します。

ここから先、エクスプロイトコードの目的は単純です。Flashファイル内のエクスプロイトコードは、メモリ内の「return-oriented programming (ROP)」を実行するガジェットを検索します。厳密に言うと、”ntdll.dll” 内に含まれる ROPガジェットを利用します。そして、Flash の ActionScript 3 コードを実行させる仮想マシン環境である「ActionScript Virtual Machine 2」の実行フローを乗っ取るため、ROPチェーンを構築し、Flashオブジェクトの仮想テーブルを上書きします。

今回の攻撃で以下の 2つの ROPガジェットが利用されました。

  • 77a646a8 94 xchg eax,esp // スタックポインタのピボット
  • ntdll!ZwProtectVirtualMemory (1a1b3000, 1000, PAGE_EXECUTE_READWRITE)

最初の ROPガジェットは、制御されたデータを指し示すため、スタックポインタをピボットします。2つ目の ROPガジェットは、シェルコードの保護を「PAGE_EXECUTE_READWRITE」へ変更するため、関数「ZwProtectVirtualMemory」を呼び出します。これにより、DEP による保護を回避することができます。

このシェルコードが API を呼び出す必要がある場合、シェルコードはまず API がインラインでフックされたかどうか、API の最初のバイトコードを照合することで確認します。これが確認された場合、シェルコードは API の最初の 5バイトを無視し、フックから逃れます。この手法は、こういった挙動を監視しているセキュリティ対策製品の検出を回避するために利用されます。

図2:不正なシェルコード
図2:不正なシェルコード

図2 に表示されるシェルコードは、以下を実行します。

  1. ファイル “Erido.jpg” 内のデータを利用して、2つの Windows用実行ファイル(PEファイル)を復号する
  2. 2つの PEファイルを以下に作成する
    • <Windows Temporary フォルダ>\sqlrenew.txt
    • <Windows Temporary フォルダ>\stream.exe
  3. ファイル “sqlrenew.txt” のデータをメモリ内に読み込む
  4. Flash や IE の強制終了を防ぐため、呼び出し側に戻す

IE が終了して、モジュール自身が読み込まれていない場合にのみ、単純に “sqlrenew.txt” のデータは、作成されたもう 1つのファイル “stream.exe” を実行します。

図3:不正なシェルコード
図3:不正なシェルコード

■結論
IE のような広く使われているプログラムに存在するゼロデイ脆弱性は、大きな影響を与えます。しかし、今回の攻撃は、その中でもさらに深刻であると考えられます。脆弱性を利用する攻撃への影響を軽減する対策として ASLR や DEP といった既知の対策技術があります。今回の攻撃では、こうした技術を回避するために、検出されやすい単体のファイルを利用する代わりに「協働」する複数の Webオブジェクトが利用されました。

サイバー犯罪者たちは、すべてのプラットフォームにおいて自身のエクスプロイトコードをさらに効果的なものにしようと試みているため、将来、上述した手法を用いた攻撃はさらに多く確認されると考えられます。ユーザの安全を確保するために、開発者およびセキュリティ企業は、新たな脅威に対応する必要があるでしょう。

参考記事:

  • Analysis of The Recent Zero-Day Vulnerability in IE9/IE10
    by Trend Micro
  • 注:Microsoft は、2014年2月19日(現地時間)、問題の脆弱性「CVE-2014-0322」に対応するセキュリティアドバイザリおよび Fix it Tool を公開しました。詳細については、同社の関連ページをご参照ください。

    翻訳:木内 牧(Core Technology Marketing, TrendLabs)