第6回 [ニッチ]E4Xで攻撃できる? できない?

はせがわようすけ
ネットエージェント株式会社

2010/2/8

いまも通用するかも? こんな攻撃の手口

- PR -

 
 最新のバージョンでは、外部の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
0002,そろそろ仕事終わりだな,tanaka,2010/02/01,17:54:25
0001,残業確定なう,nakamura,2010/02/01,17:49:32

のように取得できました。各列は左からユニークID、発言内容、発言したユーザー、日付、時刻です。

 このとき、例えば悪意あるユーザーkazuhoは、APIから取得できるCSVが次のようになるよう、タイミングを見計らって発言をします。

0006,s=<s><![CDATA[,kazuho,2010/02/01,18:22:03
0005,残業が終わりません。,nakamura,2010/02/01,18:19:41
0004,]]></s>;alert(s);//,nakamura,2010/02/01,18:18:25

 このようなCSVが生成されることを見越して、攻撃者kazuhoはユーザーhasegawa に以下のようなHTMLを含むURLに誘導します(途中改行していますが、実際には1行です)。

<script src="http://api.example.jp/statuses/
friends_timeline.csv?id=hasegawa"></script>

 すると、hasegawaあてに生成されるCSVは、スクリプトとして解釈されます。この例では、CSVをJavaScriptとして解釈すると、

    0006,
s =
<s><![CDATA[
,kazuho,2010/02/01,18:22:03
0005,残業が終わりません。,nakamura,2010/02/01,18:19:41
0004,
]]></s>;
alert(s);
//,nakamura,2010/02/01,18:18:25

となります。変数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として解釈可能な余地がないかを把握しておくとよいでしょう。

3/3
 

Index
[ニッチ]E4Xで攻撃できる? できない?
  Page1
ECMAScriptでXMLを扱う“E4X”
E4Xを利用した攻撃
  Page2
E4Xによるのぞき見を防止するFirefoxの改善
Page3
いまも通用するかも? こんな攻撃の手口
機能が増えると「攻撃が成功する可能性」は上がる

教科書に載らないWebアプリケーションセキュリティ

 Coding Edgeお勧め記事
いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(1)
 コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう
Zope 3の魅力に迫る
Zope 3とは何ぞや?(1)
 Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか?
貧弱環境プログラミングのススメ
柴田 淳のコーディング天国
 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く?
Haskellプログラミングの楽しみ方
のんびりHaskell(1)
 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう
ちょっと変わったLisp入門
Gaucheでメタプログラミング(1)
 Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91

TechTargetジャパン

Coding Edge フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH