« 安全な JSON, 危険な JSON (Cross-site Including?) | メイン | JSONP - データ提供者側のセキュリティについて »

2007年01月10日

E4X-XSS 脆弱性について

 Firefox でサポートされている JavaScript 拡張 E4X (ECMA-357) では、JavaScript 内に XML とほぼ同様のマークアップ言語を記述できるようになっています。しかし、マークアップ言語の解釈にはいくつかの違いがあり、この点をついたクロスサイトスクリプティングの可能性が (相当に小さいものの) 存在します。攻撃者は、

  1. ウェブアプリケーションに E4X として解釈した場合に実行コードとして解釈されるコードを注入 (XSS) し、
  2. 1 のコンテンツを <script> タグを用いて参照するような別のウェブサイトを用意し、攻撃対象にアクセスさせる (受動的攻撃)
ことで、秘密情報を詐取することができます。

1. 攻撃手法

 私が思いついた攻撃手法を紹介します。

1.1. { ... } を使った攻撃

 E4X では XML 内の { と } で囲まれた範囲を、JavaScript コードとして解釈します。そこで、マークアップ言語内の同一行の2ヶ所に外部からのデータを埋め込むことが可能な場合に、たとえば、第一の位置に {f(' 、第二の位置に ')} を埋め込むことで、両者の間にあるコンテンツを、別のウェブサイトの関数 f から読み込むことが可能になります。下のリンクをクリックすると、kazuho.31tools.com のスクリプトが kazuhooku.com の HTML からデータを読み込んで表示します。

1.2. マークアップの終了位置を使った攻撃

 E4X は、単一の XML マークアップ、XML コメント、CDATA、XML 処理命令のいずれかを リテラルとして解釈します。つまり、

<div>element1</div><div>1;f('</div><div>element3</div><div>');//</div>...
のような HTML を E4X として見ると、最初の DIV 要素のみがリテラルということになります。、次の < は比較演算子、div は識別子、> は比較演算子、という具合になっていくので、この HTML を別のウェブサイトから E4X として読み込むと、element3 の内容を抜き取れることになります。下のボタンをクリックすると、kazuho.31tools.com のスクリプトが kazuhooku.com の HTML からデータを読み込んで表示します。

2. 影響範囲

 幸いなことに、E4X-XSS 攻撃が実際に成立する可能性は低いと考えられます。というのは、上の例で示したように、脆弱なコンテンツの形式は改行の有無やマークアップの形態によって相当に限定されるからです。また、たとえ脆弱なコンテンツを出力しうるウェブアプリケーションがあったとしても、攻撃用のコードを埋め込む手間もかかります。
 一方で、HTML や XML はインターネット上でもっとも使われているマークアップ言語であり、GET メソッドによるアクセスにも対応しなければならないケースが多いこと、また、AJAH では (この攻撃に対して脆弱になりうる可能性の高い) 一部の HTML 要素のみを転送する手法が使われる、といった点は、マイナスの要素だと思います。

 ちなみに、私が確認した中でもっとも脆弱性に近かったのは、Gmail の Atom フィードでした。仮に先頭に XML 処理命令が記述されていなければ、2つの細工されたメールを送りつけ、攻撃者のサイトを開かせることで、その2つのメールにはさまれた新着メールの一覧を詐取できたでしょう。

3. ウェブアプリケーション開発者側での対策

 ウェブアプリケーションを開発する際に、出力するコンテンツに E4X-XSS 脆弱性がないことをいちいち確認するのは大変です。私は、とりあえず、以下の対策を採ることで、他のファイルを E4X として解釈した場合、エラーが発生するようにすべきかな、と考えています。

  • HTML には、必ず文書型宣言をつける
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
  • XML には、必ず処理命令をつける。また、ルートエレメントの直後にコメントをつける
    <?xml version="1.0" encoding="utf-8"?>
    <foo>
    <!-- anti-E4X-XSS comment -->
    ...
  • AJAX では、POST メソッドのみを許可する
  • GET メソッドを用い AJAH 等によってマークアップの一部分を返したい場合は、レスポンスの先頭に HTML コメントを3つ以上連続でつける

4. その他

 この問題は、先のエントリ「クロスサイトのセキュリティモデル」に書いたように、コンテンツの種類によってセキュリティの要件が異なるにもかかわらず、ブラウザによるコンテンツ型の判別手法がいい加減な点に起因するのではないかと思います (Content-Type レスポンスヘッダを参照していれば問題ないはず) 。まあ、いまさら直すのは (動かなくなるウェブサイトがいっぱいあるでしょうから) 不可能なんだと思いますが...

参考: ECMAScript for XML (E4X) Specification 2nd edition (11.1.4 あたり)

投稿者 kazuho : 2007年01月10日 12:37 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1032

このリストは、次のエントリーを参照しています: E4X-XSS 脆弱性について:

» E4X、連想配列とプロパティ、Object.evalメソッド from ockeghem(徳丸浩)の日記
大垣さんのブログから 確かにかなり便利なのですが以下のコードでスクリプトが実行されることはほとんど知られていないでしょうね。 <script&#... [続きを読む]

トラックバック時刻: 2007年10月17日 11:51