レベル: 中級 Todd Kaplinger (todkap@us.ibm.com), Project Zero Architecture & Development, IBM Masayoshi Teraguchi (teraguti@jp.ibm.com), Research Staff Member, IBM Gang Chen (gangchen@us.ibm.com), IBM Software Services for WebSphere, IBM
2007年 11月 06日 2008年 2月 29日 更新 ACF (Active Content Filtering) を使用して、クロスサイト・スクリプティングをはじめとする一般的な Web 2.0 ベースのアプリケーションに対する攻撃をかわし、Project Zero アプリケーションのセキュリティーを劇的に向上させてください。ACF は Project Zero に含まれる分解可能なコンポーネントで、このコンポーネントが提供するライブラリーでは要求データ (要求パラメーターなど) とクライアントに送信される応答出力からアクティブ・コンテンツを取り除くことができます。この記事を読んで、アクティブ・コンテンツが存在する可能性のある Project Zero の環境に ACF を適用するという強力な手段を身につけてください。
ACF の概要
ACF の概要の一環としてまず理解しておかなければならないのは、Project Zero とは何であるかです。以下の説明は、Project Zero の Web サイトから引用しています。
「Project Zero は IBM® 内で始まったインキュベーター・プロジェクトで、その焦点は次世代の動的 Web アプリケーションのアジャイル開発に置かれています。Project Zero は、代表的な Web 技術をベースにアプリケーションを作成し、組み立て、実行するための単純な環境を導入します。Project Zero の環境には、Groovy および PHP のスクリプティング・ランタイムが組み込まれ、REST スタイルのサービス、統合マッシュアップ、そしてリッチ Web インターフェースを作り出すことを目的に最適化されたアプリケーション・プログラミング・インターフェースが備わっています」。
Project Zero が主に対象としているのは次世代の動的 Web アプリケーション (一般に Web 2.0 の傘下に分類されるアプリケーション) なので、この記事ではマッシュアップ、ウィキ、ブログといったユーザー提供のコンテンツが含まれる対話型 Web アプリケーションに焦点を絞ります。このようなアプリケーションをサポートするために Project Zero がライブラリーとして用意しているのが ACF です。アプリケーション開発者が Zero アプリケーションの一部として組み込める ACF は、この類の対話型アプリケーションで発生する可能性のあるクロスサイト・スクリプティングなどの問題にアプリケーションがさらされる危険を抑える方法を開発者に提供します (クロスサイト・スクリプティングについての説明は、「参考文献」に記載したリンクを参照してください)。
この記事で使用する例について
この記事に記載する例は、単純で基本的な使用事例から徐々に複雑さを増した使用事例に沿って ACF を説明することを目的としています。これらの例は、前の例で説明した内容を土台に展開していきます。それぞれの例については以降のセクションで詳しく説明しますが、要約すると以下のようになります。
- 例 1 は基本的な Ajax 対応ページで、このページではユーザーが外部のロケーションから受信した記事に対してコメントを投稿することができます。この例では、ユーザーのコメントや記事にアクティブ・コンテンツ (JavaScript など) が含まれている場合に発生する事態について説明します。
- 例 2 では、例 1 のページに ACF ライブラリーのサポートを追加します。この例では、記事にアクティブ・コンテンツ (JavaScript など) が含まれる場合に ACF フィルタリングがどのように機能するかを説明します。
- 例 3 では、例 2 のページにさらに要求パラメーターの ACF フィルタリングのサポートを追加します。 この例では、ユーザーのコメントにアクティブ・コンテンツ (JavaScript など) が含まれる場合に ACF フィルタリングがどのように機能するかを説明します。
この記事の「ダウンロード」セクションからサンプル・アプリケーションをダウンロードして、実際に ACF の機能を有効にしてみてください。Web ニュース・アグリゲーション兼ブログ・アプリケーションを模したこのサンプル・アプリケーションでは、今日のニュースに関するコメントをサーバーに投稿すると、そのコメントが他の閲覧者に表示されるようになっています。図 1 に示すようにページの先頭にはニュース・アグリゲーションの結果が表示され、この表示から、悪意の疑いがあるコンテンツ (点滅する赤いテキスト) が注入されていることがわかります。Original source of the news というタイトルのペインをクリックすると、ニュース・アグリゲーションの元の HTML コンテンツが表示されます。画面の一番下にある Enter your comments here. のテキスト域には、コメントを書き込むことができます。書き込んだコメントは、Post your comment ボタンをクリックすると同時に All comments 域に表示されます。
図 1. ACF のサンプル
サーバー・サイドのコンポーネントは IBM の最新 Web 2.0 プラットフォーム、Project Zero でビルドされています。サンプル・アプリケーションのフロント・エンドで使用しているのは 2 つの新興技術、Dojo と Ajax です。
この記事に付属のサンプル・アプリケーションを実行するには、Eclipse 開発 IDE と Project Zero プラグインが適切に構成されている必要があります (プラグインへのリンクは「参考文献」セクションに記載しているので、この記事を参照してセットアップしてください)。構成が完了すると、サンプル・アプリケーション (ACFSampleApp-1.0.0.zip) を既存のプロジェクトとしてワークスペースにインポートできるようになります。Select archive file を選択して、サンプル・アプリケーションのアーカイブ・ファイルをソースとして選択してください (図 2 を参照)。Project Zero は、zero.acf ライブラリーによって ACF サポートを提供します。このライブラリーは、アプリケーション依存関係の 1 つとして ivy.xml ファイルにあらかじめ構成されています。
図 2. Eclipse ワークスペースへの ACFSampleApp のインポート
ACFSampleApp を右クリックして Run as – Project Zero Application を選択すれば、ACF 機能を探る旅の始まりです。サーバー・コンポーネントが立ち上がって実行中になったら、ブラウザーで http://localhost:8080 にアクセスしてサンプル・アプリケーションのテストを開始します。
シナリオ 1: ACF 応答フィルタリング
最初のシナリオは、ACF 応答フィルタリングを使って悪質なコンテンツを防ぐというものです。ACF 応答フィルタリングは一連のフィルタリング・ルール (後で説明) に基づいて、応答メッセージから JavaScript などのアクティブ・コンテンツを取り除きます。サンプル・アプリケーションを実行すると、ページ先頭のニュース見出しに MALICIOUS というテキストが注入されて点滅するはずです。これは、最初のニュース・フィードにアクティブ・コンテンツ (JavaScript コード) が含まれているためです。Original source of the news というタイトルのペインをクリックすると、このニュース・フィードのソースを確認することができます (図 3 を参照)。
図 3. ニュース見出しに示された悪意のあるテキスト
ここで、ACF 応答フィルタリングを使用して、この悪意のあるテキストがアプリケーションにダメージを与えないようにする方法を見てみましょう。ACF 応答フィルタリングは zero.config 構成ファイルで制御されます。ACF 応答フィルタリングを有効にするには、この構成ファイルに以下のエントリーが必要です (リスト 1 を参照)。
リスト 1. ACF 応答フィルタリングの構成
[@include ${zero.acf}/config/acf.config]
uri=/resources/newsViewer
|
サンプル・アプリケーションには上記の構成が用意されているので、zero.config ファイルでこのセクションのコメントを外してから Project Zero サーバーを再起動するだけで、ACF は有効になります。図 4 に示されたこの 2 行の構成プロパティーが ACF エンジンに指示している内容は、ACF に事前定義されたフィルタリング・ルールのデフォルト・セットを使用して URI /resources/newsViewer から送信された応答からアクティブ・コンテンツを取り除くという単純なものです。
図 4. ACF 応答フィルタリングの構成
これでアプリケーションを再度実行すると、煩わしい点滅テキストは表示されなくなります。
シナリオ 2: ACF 要求フィルタリング
Web 2.0 をテーマとしたアプリケーションとの連携や、そのようなアプリケーションへの参加においては大抵、ユーザーにホスティング・サーバーに対するコンテンツの入力または投稿を許可しています。これによってもたらされるのが、サーバーが悪質なコンテンツ (JavaScript など) をレンダリングした場合のセキュリティー問題です。サンプル・アプリケーションでは、ユーザーがサーバーにコメントを投稿できるようになっています。悪意のあるスクリプトによる脅威の実例として、リスト 2 のテキストを Enter your comment here. 域に入力してください。
リスト 2. 悪意のあるスクリプトの例
<script>alert("You are under attack!")</script>
|
Post your comment ボタンをクリックしても All comments 結果域には何も表示されず、代わりに煩わしい JavaScript ポップアップが表示されるはずです。
では、どのようにして HTTP 要求をフィルタリングして悪意のある JavaScript の攻撃を防げばよいのでしょう。そのために、ACF では強力な一連の API を用意しています。これらの API は、フィルタリング・ルールのセットに基づき、JavaScript などのアクティブ・コンテンツが HTTP 要求パラメーターに含まれているかどうかを通知します。アクティブ・コンテンツが検出された場合には、適切な例外をスローすることも、あるいは XMLEncoder という Project Zero の別のライブラリーを使用してアクティブ・コンテンツをエンコードし、実行中にそのコンテンツが実行されないようにすることもできます。この例では、着信コメントの POST 要求を処理するサーバー・サイドのコンポーネントは commentHandler.groovy クラスなので、このクラスに ACF 要求フィルタリング・コードを追加することになります。それには、サンプル・アプリケーションに用意された ACF 要求フィルタリング・コードのコメントを外して、この機能を有効にするだけです (図 5 を参照)。
図 5. ACF 要求フィルタリングの有効化
この機能をテストするために Zero サーバーを再起動する必要はありません。アプリケーションのページをリロードして、コメント域に前と同じ JavaScript を入力してください。当然、害のあるコンテンツを投稿することはできなくなっています (図 6 を参照)。
図 6. ACF 要求フィルタリングの例
クライアント・サイドでのフィルタリング
これまではサーバー・サイドに焦点を当てて、悪意のある攻撃を防ぐ上で ACF が発揮する威力を説明してきましたが、さらにアプリケーションのセキュリティーを強化するには、最近の JavaScript ライブラリーで導入しているクライアント・サイドでのエンコーディング機能を使用するという手段も検討できます。その一例は Dojo フレームワークです。例えば Dojo のリッチ・テキスト・エディターはユーザー入力を比較的安全に使用できる HTML コードに自動的にエンコードします。
注: クライアント・サイドでのエンコーディングは非常に効果的ですが、サーバー・サイドでの ACF フィルタリングの代わりにはなりません。ユーザーがクライアント・サイドでの対策の裏をかくのは、それほど大変なことではないためです。
サンプル・アプリケーションには Dojo ベースのリッチ・テキスト・エディターが用意されています。アプリケーションをテストするにはブラウザーで http://localhost:8080/clientfilter.gt にアクセスしてください。図 7 に示すように、Dojo エディターで書き込んだ JavaScript はサーバーに送信される前にエンコードされるため、ブラウザーが投稿されたコンテンツをアクティブな JavaScript として解釈することはありません。
図 7. Dojo エディターの実装
まとめ
この記事では、開発者による大々的なアプリケーションの変更を必要とせずにアプリケーションでのアクティブ・コンテンツのフィルタリングを可能にすることによって、ACF がアプリケーションのデプロイメントに一層の柔軟性をもたらす仕組みを説明しました。残念ながら多くの Web 2.0 アプリケーションではクロスサイト・スクリプティング (XSS) といったアクティブ・コンテンツの攻撃が一般的になっていますが、ACF がもたらす優れた柔軟性により、このような懸念からアプリケーションを一層確実に切り離せるようになります。みなさんもサンプル・アプリケーションを試してみて、Project Zero フォーラム (「参考文献」を参照) にフィードバックをお寄せください。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Sample application for this article | ACFSampleApp-1.0.0.zip | 32KB | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | 
|  | Todd Kaplinger は IBM Software Group のシニア・ソフトウェア・エンジニアで、現在 Project Zero のセキュリティー・チームでアーキテクト兼チーム・リーダーを務めています。JSP、Servlet、PHP などの Web ベースの技術を専門する彼は、最近では新たな Web 2.0 技術と企業におけるその影響に注目しています。現在 JSR 223: Scripting for the Java Platform のエクスパート・グループのメンバーであり、さらに Open AJAX Alliance のメンバーとして各種 Ajax フレームワーク実装でのセキュリティーにおけるインターオペラビリティーにも取り組んでいます。過去に IBM WebSphere Webcontainer and RRD (Remote Request Dispatcher) プロジェクトのチーム・リーダー兼アーキテクトとして活躍し、Servlet Expert グループの IBM 代表として JSR 154 Servlet 2.5 仕様に関わった経験もあります。 |
 | 
|  | 寺口 正義は、IBM Tokyo Research Laboratory のリサーチ・スタッフの一員です。これまで 5 年間、XML、Web Services、および WSS (Web Services Security) を研究してきました。現在の研究対象には、Web 2.0 のセキュリティーおよびパフォーマンスなどが含まれます。 |
記事の評価
|