[ニッチ]E4Xで攻撃できる? できない?:教科書に載らないWebアプリケーションセキュリティ(6)(3/3 ページ)
XSSにCSRFにSQLインジェクションにディレクトリトラバーサル……Webアプリケーションのプログラマが知っておくべき脆弱性はいっぱいあります。そこで本連載では、そのようなメジャーなもの“以外”も掘り下げていきます (編集部)
いまも通用するかも? こんな攻撃の手口
最新のバージョンでは、外部のHTMLおよびXMLをJavaScriptソースとして簡単に読み込めなくなりましたが、依然としてE4Xを利用した攻撃が成り立つ場合が現実に存在します。実際に過去に見つけた事例を紹介しましょう。
攻撃の対象となったのは、Twitterとよく似たあるミニブログサービスでした。そのミニブログは非常に高機能なAPIを豊富に揃えており、外部の他のアプリケーションとの連携のため、ユーザーのタイムラインをCSVで出力することも可能でした。
例えば、ユーザーhasegawaがログインした状態で、
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
のようなURLにアクセスすると、hasegawaがフォローしている人たちの発言の一覧がCSV形式で、
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
のように取得できました。各列は左からユニークID、発言内容、発言したユーザー、日付、時刻です。
このとき、例えば悪意あるユーザーkazuhoは、APIから取得できるCSVが次のようになるよう、タイミングを見計らって発言をします。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このようなCSVが生成されることを見越して、攻撃者kazuhoはユーザーhasegawaに以下のようなHTMLを含むURLに誘導します(途中改行していますが、実際には1行です)。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
すると、hasegawaあてに生成されるCSVは、スクリプトとして解釈されます。この例では、CSVをJavaScriptとして解釈すると、
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
となります。変数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.
関連記事
- いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(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の世界を体験してみよう