XSSにCSRFにSQLインジェクションにディレクトリトラバーサル……Webアプリケーションのプログラマが知っておくべき脆弱性はいっぱいあります。そこで本連載では、そのようなメジャーなもの“以外”も掘り下げていきます (編集部)
皆さんこんにちは、はせがわようすけです。今回は、Mozilla Firefoxでクロスドメイン制約を回避する方法の一例として、E4Xという機能を利用した攻撃方法を紹介します。
E4Xとは、「ECMAScript for XML」の略であり、JavaScriptやActionScriptなどのECMAScript処理系において、XMLをネイティブ機能として扱うための仕様です。
現在、FirefoxのJavaScriptやアドビのActionScriptなどで利用できますが、本稿ではMozilla Firefox上での動作に関して説明します。
【参考】
Standard ECMA-357
ECMAScript for XML (E4X) Specification
http://www.ecma-international.org/publications/standards/Ecma-357.htm
E4Xを使うと、例えば以下のようにJavaScript上で文字列や数値と同じようにXMLを直接的に扱うことができます。
var rssItem = <item> <title>Blog title</title> <link>http://example.com/</link> </item>; alert( rssItem.title ); |
E4XではXML内で{と}で囲むと、その部分はJavaScriptとして解釈されます。
var s = "abc"; var rssItem = <item> <title>{ s + "def" }</title> <link>http://example.com/</link> </item>; alert( rssItem.title ); |
このように、XMLをJavaScriptの一部としてそのまま記述できるのが、E4Xの最大の特徴です。
E4Xを利用することにより、機密情報の含まれるHTMLやXMLをJavaScriptの一部として扱うことができますので、攻撃者の用意したJavaScriptから機密情報にアクセスすることができる場合があるという問題がこれまで指摘されていました。
例えば、http://example.jp/sns.htmlというURLに以下のようなHTMLがあったとします。3つある<div>要素のうち、最初と最後のものは攻撃者がコントロール可能で、真ん中の<div>要素については攻撃者は内容を把握できないものであるとします。
<html><body> |
このHTMLを<script>要素を使って読み込むと、E4Xの機能によりXMLリテラルの記述されたJavaScriptとして扱われます。さらに{と}で囲まれている部分はそのままJavaScriptとして実行されますので、関数theftを通じてHTML内の文字列「ようこそ、川口さん!」という文字列に、JavaScriptからアクセスすることができます。
<script>function theft( s ){ alert( s ); }</script> |
このように、本来はスクリプトではないコンテンツを<script>のsrcとして攻撃者のわなサイト上からSame origin policyを超えて読み込みその内容を盗み見る、という方法がE4Xを利用した典型的な攻撃方法としてこれまで指摘されていました。
この攻撃方法は少なくとも2007年ごろから知られており、Firefox 3.0系列では上記の攻撃が成立しますが、Firefox 3.5および3.6では攻撃を成立させないよう大きく改善されており、上記のような単純な例では攻撃は成立しません。
Copyright © ITmedia, Inc. All Rights Reserved.