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

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

2010/2/8

XSSにCSRFにSQLインジェクションにディレクトリトラバーサル……Webアプリケーションのプログラマが知っておくべき脆弱性はいっぱいあります。そこで本連載では、そのようなメジャーなもの“以外”も掘り下げていきます (編集部)

ECMAScriptでXMLを扱う“E4X”

- PR -

 皆さんこんにちは、はせがわようすけです。今回は、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を利用した攻撃

 E4Xを利用することにより、機密情報の含まれるHTMLやXMLをJavaScriptの一部として扱うことができますので、攻撃者の用意したJavaScriptから機密情報にアクセスすることができる場合があるという問題がこれまで指摘されていました。

 例えば、http://example.jp/sns.htmlというURLに以下のようなHTMLがあったとします。 3つある<div>要素のうち、最初と最後のものは攻撃者がコントロール可能で、真ん中の<div>要素については攻撃者は内容を把握できないものであるとします。

<html><body>
<div>{theft("</div><div>ようこそ、川口さん!</div><div>")}</div>
</body></html>

 このHTMLを<script>要素を使って読み込むと、E4Xの機能によりXMLリテラルの記述されたJavaScriptとして扱われます。さらに{と}で囲まれている部分はそのままJavaScriptとして実行されますので、関数theftを通じてHTML内の文字列「ようこそ、川口さん!」という文字列に、JavaScriptからアクセスすることができます。

<script>function theft( s ){ alert( s ); }</script>
<script src="http://example.jp/sns.html"></script>

 このように、本来はスクリプトではないコンテンツを<script>のsrcとして
攻撃者のわなサイト上からSame origin policyを超えて読み込みその内容を盗み見る、という方法がE4Xを利用した典型的な攻撃方法としてこれまで指摘されていました。

 この攻撃方法は少なくとも2007年ごろから知られており、Firefox 3.0系列では上記の攻撃が成立しますが、Firefox 3.5および3.6では攻撃を成立させないよう大きく改善されており、上記のような単純な例では攻撃は成立しません。

 
1/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