人気ブラウザ「Mozilla Firefox」に脆弱性を利用する「PoC」を徹底検証 - テクニカルレポート

脆弱性を悪用する昨今の脅威事例を考慮すると、ユーザは OS・各アプリケーションの更新を怠らず、システムを常に最新の状態に保つことを徹底する必要があります。また、今日ブラウザを多く利用してインターネット接続に多くの時間を費やす人々が増えていることで、Webブラウザの脆弱性を利用した攻撃が多く確認されるようになりました。

2011年6月下旬、「Internet Explorer(IE)」についで人気のブラウザである「Mozilla Firefox」に存在する脆弱性が明らかになりました。この脆弱性は、Matasano Security のセキュリティ研究者 Chris Rohlf 氏および Yan Ivnitskiy氏が確認。同年8月3~4日に米国ラスベガスにて開催された「Black Hat Conference」で、「Attacking Clientside JIT Compilers(クライアント側における実行時コンパイラへの攻撃)」という両氏の発表内で報告されました。

今回、この脆弱性を突いた「Proof-of-concept(PoC、概念実証型エクスプロイト。実際に有効な攻撃ができることを実証している攻撃コード)」の解析の詳細について報告します。

共通脆弱性識別子(CVE)「CVE-2011-2371」として特定されるこの脆弱性は、Mozilla Firefox のライブラリ “Js3250!.dll” および関数 “Js3250!!array_reduceRight” に存在します。影響を受けるシステムは、以下のとおりとなります。

  • Mozilla Firefox のバージョン 3.6.18 およびそれ以前
  • Mozilla Firefox のバーション 4.0 から 4.0.1
  • ※2011年11月08日現在の Firefox のバージョンは、7.0.1 です。

    なお、この脆弱性を利用した2つの「PoC」が Matteo Memelli 氏および Metasploit により公開(EDB-ID:1797417976)されています。

    トレンドマイクロでは、リバースエンジニアリング手法を用いて解析し、公開されている上記2つの「PoC」を検証しました。この結果、Mozilla Firefox のバージョン 3.6.16上で、任意のリモートコードが実行され、結果として利用者の意図しない不正な行為(不正プログラムへの感染など)行われる可能性があることを実証することができました。

    ■脆弱性「CVE-2011-2371」を利用する不正なコードの解析
    エクスプロイトコードの例は、以下のとおりとなります。

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

    このコードでは、JavaScriptのArrayオブジェクトの長さに「符号なし整数」として長い値が設定されています。これにより、新規配列に関数「reduceRight」が呼び出されます。

    上述のコードが問題の脆弱性を抱えた FirefoxによってJITエンジンを介して読み込まれた場合、関数「Js3250!array_reduceRight」が実行されることとなります。そして、これにより、「ArrayExtraMode」の値として「2」が設定され、関数「Js3250!array_extra」が呼び出されます。

    図2:関数「Js3250! array_extra」を呼び出すコード
    図2:関数「Js3250! array_extra」を呼び出すコード

    「符号なし」として設定されたArrayオブジェクトは、関数「js_GetLenghProperty」を渡して、新規作成された Array Lengthプロパティを取得します。

    図3:関数「js_GetLenghProperty」を呼び出すコード
    図3:関数「js_GetLenghProperty」を呼び出すコード

    関数「js_GetLenghProperty」は、関数「array_extra」から呼び出された際、「符号なし整数」として新規作成された配列の長さのアドレスを返します。

    図4:新規作成された Array Lengthプロパティのための関数「Js3250!js_GetLenghProperty」
    図4:新規作成された Array Lengthプロパティのための関数「Js3250!js_GetLenghProperty」

    符号付き値として配列の長さ「(0×83000006)」を取得した後、この配列の長さは、関数「Js3250!GetArrayElement」を渡します。

    図5:新規作成された Array Lengthプロパティのための関数「Js3250!js_GetLenghProperty」
    図5:新規作成された Array Lengthプロパティのための関数「Js3250!js_GetLenghProperty」

    そして、関数「GetArrayElement」は、値として「(obj->dslots[index])」を返します。この「(obj->dslots[index])」の値は、以下の数式で計算されます。

  • base address(ecx)+index(edx)*4
  • また、この「(obj->dslots[index]」のアドレスは、任意のコードを実行する際に利用される「Heap Spray」が読み込まれるアドレスを示します。

    図6:新規作成された Array Lengthプロパティのための関数「Js3250!js_GetLenghProperty」
    図6:新規作成された Array Lengthプロパティのための関数「Js3250!js_GetLenghProperty」

    「js_invoke」の戻り値を設定した後、「js_invoke」は関数「Js3250!jsInvoke」を呼び出します。

    図7:新規作成された Array Lengthプロパティのための関数「Js3250!js_GetLenghProperty」
    図7:新規作成された Array Lengthプロパティのための関数「Js3250!js_GetLenghProperty」

    この時点で、ユーザ定義のスクリプトファイルが実行されます。これにより、JSFrameRegsタイプのレジスタおよび数式「(base address(ecx)+index(edx)*4)」のアドレスを取得します。

    図8:数式「(base address(ecx)+index(edx)*4)」を呼び出す関数「Js3250!js_Invoke」
    図8:数式「(base address(ecx)+index(edx)*4)」を呼び出す関数「Js3250!js_Invoke」



    図9:攻撃用コードまたは不正活動のコードに誘導する関数「Js3250!js_Invoke」
    図9:攻撃用コードまたは不正活動のコードに誘導する関数「Js3250!js_Invoke」

    ■トレンドマイクロからの対策およびソリューションのご提案
    脆弱性が確認されると、何よりもまず考えることは、問題の脆弱性を利用する脅威からユーザを保護するために何をすべきか、ということです。各ユーザは、確認された脆弱性の影響を受けるかどうか確認し、該当するのであればOSやアプリケーションのセキュリティパッチを適用します。

    しかしながら、特に企業においては、セキュリティパッチ適用がすぐに適用できるとは限りません。ネットワーク管理者は、パッチ管理の適用に苦慮する場合もあるでしょう。というのも、該当するセキュリティパッチが企業内ネットワークに影響を与えかねないかまず検証する必要があるからです。

    脆弱性を利用する脅威からネットワークやシステムを保護するセキュリティ製品を使用することは、企業内のネットワークやシステム条件に応じてすぐにセキュリティパッチ対策が施すことができない環境を保護するのに役立つことは言うまでもありません。例えば、トレンドマイクロのサーバ向け総合セキュリティ製品「Trend Micro Deep Security」をご利用の場合、既知の脆弱性に対して対策が必要な箇所を自動検出。そして、脆弱性対策を講じるWebサイトで必要な仮想パッチが自動で適用されシステムを保護します。そのため、ネットワーク管理者は、セキュリティパッチ適用に焦ることなく、必要なセキュリティパッチの検証することが可能となります。

    今回、問題になった Mozilla Firefoxに存在する脆弱性については、同ブラウザを利用しているユーザは、最新のバージョンに更新することを強くお勧めします。また、不審なWebサイトへアクセスせず、身元不明な送信者からのEメールを開封しない、といった心がけが大切です。一方、ネットワーク管理者は、サーバへのアクセス権限を最小限に抑えることが必要でしょう。

    「Trend Micro Deep Security」および「Trend Micro 侵入防御ファイアウォール(ウイルスバスター コーポレートエディション プラグイン製品)」を組み合わせた「ウイルスバスター コーポレートエディション」をご利用の企業ユーザは、2011年7月にリリースされた最新のフィルタ(1004722:Mozilla Firefox “Array.reduceRight()” Remote Code Execution)を適用することにより、この脆弱性を利用する関連攻撃からシステムを安全に守ることができます。

    参考記事:

  • Technical Analysis for Mozilla Firefox Array.reduceRight() Vulnerability
     by Kim Chanwoo (Security Specialist)
  •  翻訳・編集:船越 麻衣子(Core Technology Marketing, TrendLabs)