最新のバージョンでは、外部のHTMLおよびXMLをJavaScriptソースとして簡単に読み込めなくなりましたが、依然としてE4Xを利用した攻撃が成り立つ場合が現実に存在します。実際に過去に見つけた事例を紹介しましょう。
攻撃の対象となったのは、Twitterとよく似たあるミニブログサービスでした。そのミニブログは非常に高機能なAPIを豊富に揃えており、外部の他のアプリケーションとの連携のため、ユーザーのタイムラインをCSVで出力することも可能でした。
例えば、ユーザーhasegawaがログインした状態で、
http://api.example.jp/statuses/friends_timeline.csv?id=hasegawa |
のようなURLにアクセスすると、hasegawaがフォローしている人たちの発言の一覧がCSV形式で、
0003,今日はもう帰ろう,yamagata,2010/02/01,18:02:13 |
のように取得できました。各列は左からユニークID、発言内容、発言したユーザー、日付、時刻です。
このとき、例えば悪意あるユーザーkazuhoは、APIから取得できるCSVが次のようになるよう、タイミングを見計らって発言をします。
0006,s=<s><![CDATA[,kazuho,2010/02/01,18:22:03 |
このようなCSVが生成されることを見越して、攻撃者kazuhoはユーザーhasegawaに以下のようなHTMLを含むURLに誘導します(途中改行していますが、実際には1行です)。
<script src="http://api.example.jp/statuses/ |
すると、hasegawaあてに生成されるCSVは、スクリプトとして解釈されます。この例では、CSVをJavaScriptとして解釈すると、
0006, |
となります。変数sには、E4Xの機能によりユーザーnakamuraの発言を含むXMLが代入されますので、攻撃者はnakamuraからhasegawaあてに発言された内容を取得することができる、というわけです。
この事例自体は2008年夏ごろ、Firefox 3.5のリリース以前に発覚したものですが、仮にFirefox 3.5/3.6であっても、<script>のsrcとして読み込ませている対象がHTMLやXMLリテラルだけではないので、Firefox 3.5で導入されたE4Xによるのぞき見対策が機能せず、攻撃が成立するのではないかと考えます。
なおこのミニブログサービスでは対策として、UserAgentを判別し通常のブラウザに対してはCSV形式でのレスポンスを返さないようにしたそうです。
実際のところ、今回紹介した事例のような、E4X機能を応用することによって攻撃が成立する対象はそれほど多くはないと思います。
その理由の1つには、Firefox自身の改善により通常のHTMLやXMLがJavaScriptとして扱われなくなり、それ以外の種類のコンテンツ、特にCSVのようにJavaScriptとして解釈されやすいデータ形式はそれほど使われていないからです。
加えて、例えCSVで出力する場合であっても、実際に攻撃を成功させるためにはJavaScriptとしてきちんと解釈できるよう出力を工夫しなければならず、攻撃側にも相当な手間もかかります。
とはいえ、E4Xという機能によりさまざまなコンテンツをJavaScriptとして解釈可能にできる可能性、言い換えると「攻撃の成功する可能性」が引き上げられていることも事実です。
通常のWebアプリケーションの開発者がE4Xのようにニッチな機能を必ずしも熟知しておく必要はないとは思いますが、HTMLやXML以外の特殊な形式で機密情報を含むコンテンツを生成するようなWebアプリケーションの場合、そのコンテンツがJavaScriptとして解釈可能な余地がないかを把握しておくとよいでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.