Universal XSS攻撃に利用されるIEのゼロデイ脆弱性の解析

セキュリティ企業「Deusen」のセキュリティ専門家 David Leo氏は、Microsoft の Internet Explorer(IE)に存在する新たな脆弱性を報告しました。この脆弱性を利用することにより、攻撃者はブラウザの同一生成元ポリシーを侵害することが可能になります。同一生成元ポリシーは、ある生成元や Webサイトから読み込まれた文書やスクリプトが、異なる生成元からプロパティを取得したり設定したりするのを制限します。

同一生成元ポリシーを侵害することによって、攻撃者はセッションの乗っ取り、認証情報(クッキー)の窃取、フィッシング攻撃の開始が可能になります。今回の脆弱性は「ユニバーサルクロスサイトスクリプティング(Universal XSS、UXSS)」の攻撃を可能にし、すべての Webサイトが「クロスサイトスクリプティング(XSS)」と呼ばれる攻撃に脆弱になります。

UXSS攻撃では、標的とする Webサイト上に脆弱性が存在する必要はありません。ユーザが不正な URL を訪れるだけで攻撃が可能になります。例えば、ユーザが過去に訪れた Webサイトのクッキーが簡単に窃取される可能性があります。また、標的とされた Webサイトが攻撃者によって改ざんされたように見えるものの、実際はこうした「改ざん」がユーザのブラウザ内で行われているという別のシナリオも考えられます。

攻撃者は iframe を利用して、ユーザがアカウントを持つ正規の Webサイトを読み込むことができます。今回明らかになった脆弱性により、攻撃者は正規の Webサイトのコンテンツ上で JavaScript を実行することが可能となりました。同一生成元ポリシーにより Webサイトは自身のコンテンツにアクセスするためのコードのみが使用可能なため、本来であれば攻撃者が実行できないことです。攻撃を受けたユーザには、正規の Webサイトに入力した情報や、それに関連したクッキーが攻撃者に窃取される危険性が生じます。

David Leo氏は、英国のタブロイド紙「Daily Mail」の Webサイトへの攻撃を実証する PoC(概念実証)コードを公開しました。改ざんされた Webページ上の リンクから、Daily Mail のWebサイトが新規ウインドウで開きます。そして 7秒後に、この Webサイトのコンテンツは、「Hacked by Deusen」と書かれた Webページに置き換えられました。

Webサイトは、HTTPヘッダの X-frame-opitionで「same-origin」、「deny」、「allow-from」の値を使用することにより、この脆弱性から自身を保護することが可能かもしれません。

IE 11 はこの脆弱性の影響を受けることが知られていますが、それより前のバージョンがこの影響を受けるかはすぐには判明しませんでした。Windows 7 や 8.1、また Windows 10 のテクニカルプレビュー版は、すべてこの脆弱性の影響を受けます。また、2015年2月6日時点、この脆弱性に対応する修正プログラムや回避策はありません。ユーザーは、被害に遭わないためには不審なメールや Web上の書き込みにある URL に安易にアクセスしないことが重要です。

■脆弱性の解析
この脆弱性はどのように利用されるのでしょうか。トレンドマイクロは、Windows 7 の 32ビット版の PC上でこの脆弱性を解析しました。ブラウザは、未修正のIE 11(”mshtmll.dll” のバージョン 11.00.9600.1 7041)です。

この脆弱性について説明する前に、”mshtmll.dll” 内のデータ構造について詳細を知る必要があります。

図1:
図1:”mshtmll.dll” のデータ構造

図1 で示されるように、各 iframe にはストラクチャ「Cwindow」があります。

  • abSID:セキュリティ識別子(SID)。ドメインによって表される。

abSID は Cwindow の一部ではありません。そのため、Cwindow は、abSID を取得するために「GetSIDOfDispatch」を呼び出すことができます。

フレームを参照すると、レンダリングエンジンはプロキシウインドウ「COmWindowProxy」を作成し、以下を含みます。

  • pWindow:実際の HTMLウインドウへのポインタ
  • pbSID:セキュリティ識別子(SID)。実際のウインドウを参照する生成元によって表される。

同一生成元ポリシーはどのように機能するのでしょうか。「COmWindowProxy」のリソースにアクセスを試みると、関数「AccessAllowed」が呼び出されます。この関数は、pbSID と pWindow->abSID を比較します。同一であれば、このアクセスは同一生成元とされ、処理が許可されます。同一でなければ、アクセスは拒否されます。

この事例では、エンジンはこのアクセスの確認を単純に忘れており、そのため同一生成元ポリシーが回避されます。

POC は 2つのファイルで成り立っています。1つは “poc.html” と呼ばれる HTMLファイルで、もう 1つは “1.php” と呼ばれる PHPファイルです。この HTMLファイルは、以下のように 2つの iframe が含まれています。

例1:Frame0
例1:Frame0

例2:Frame1
例2:Frame1

また、以下の Javascript の関数が含まれています。

例3:関数「go」
例3:関数「go」

PHPファイルには、以下のコードが含まれています。

例4:PHP のコード
例4:PHP のコード

脆弱性は以下の手順で攻撃されます。

1. 関数「go」で、Frame0 のドメインは http://serverip です。これは、不正な Webサイトの URL です。PHP が「sleep」(5)を呼び出すため、サーバの応答が保留となります。

図2:frame0
図2:frame0

Frame1 のドメインは、http://www.dailymail.co.uk 、もしくは標的とする Webサイトです。メインフレームのドメインは http://serverip です。

コマンド「w=window.frames[0]」は、以下のように「ComWindowProxy」を作成します。

図3:「ComWindowProxy」の作成
図3:「ComWindowProxy」の作成

pbSID が abSIDと同一のため、同一生成元ポリシーによって「w.setTimeout」のアクセスが許可されます。

2. 「w.setTimeout」が実行されます。

2.1. コマンド「.x=top.frames[1]」が「COWindowproxy variant x」を作成します。pbSID は serverIP です。

図4:「COWindowproxy variant x」の作成
図4:「COWindowproxy variant x」の作成

2.2. 確認メッセージのループがリダイレクトメッセージを処理します。その結果、frame0 の abSID が Frame1 に変更します。

図5:frame0 の abSID が Frame1 に変更する
図5:frame0 の abSID が Frame1 に変更する

2.3. JavaScript のエンジンは「x.location」を実行します。この時点で、適切な方法は「x.AccessAllowed」を呼び出すことですが、pbSID(攻撃者の severIP)および abSID(www.dailymail.co.uk)が同一でないため、アクセスは失敗します。しかし、この確認が存在しません。そのため、攻撃者は当然のように攻撃を実行することができます。

この脆弱性の根本的原因は、関数の呼び出しを忘れていることで、これにより同一生成元ポリシーが回避されます。興味深いことに、弊社が試験を行ったところ、IE8 は適切に処理するものの、IE9 から 11 までの最新バージョンは処理しないことが判明しました。

弊社のサーバ向け総合セキュリティ製品「Trend Micro Deep Security(トレンドマイクロ ディープセキュリティ)」および「Trend Micro 脆弱性対策オプション(ウイルスバスター コーポレートエディション プラグイン製品)」をご利用のお客様は、以下のフィルタを適用することにより、問題のゼロデイ脆弱性を利用した攻撃から保護されます。

  • 1006472 – Microsoft Internet Explorer Same Origin Policy Bypass Vulnerability

トレンドマイクロ製品をご利用のユーザは、弊社のクラウド型セキュリティ基盤「Trend Micro Smart Protection Network」によって守られています。特に「Webレピュテーション」技術により、この脅威に関連する不正な Web サイトへのアクセスをブロックします。

協力執筆者:Henry Li および Rajat Kapoor

参考記事:

 翻訳:品川 暁子(Core Technology Marketing, TrendLabs)