XSSとコンテンツのフィルタリング
クロスサイトスクリプティング(以降、XSSと呼ぶ)は、動的にHTML文書を生成するWebアプリケーションにおいて、悪意を持ったスクリプトを外部から与えることで、HTML文書内に挿入させ、このスクリプトを実行させる攻撃方法です。前述したように、一般ユーザーが生成したコンテンツが多数流通している現在、悪意を持ったスクリプトコードを容易に埋め込むことが可能になりました。図2に、SNS(Social Networking Service)を例にとってXSS攻撃に例を示します。
- 攻撃者は、投稿入力画面から、正規のデータ(例. 日記)に、悪意を持ったスクリプトを挿入します。
- 入力された内容は、SNSサーバーに送られます。
- SNSサーバー側では、入力された内容にスクリプトが注入されていないかをチェックしますが、攻撃者は、後述する手法などを使ってこの処理をバイパスします。
- チェックをすり抜けたスクリプトが、SNSサーバー上のデータベースに格納されます。
- 一般(攻撃対象)ユーザーが、日記やコメントを読むためにSNSサーバーにアクセスします。
- 攻撃者の日記やコメントを読む過程で、悪意を持ったスクリプトが一般ユーザーのWebブラウザーで実行されます。
ここで注意したいのは、SNSサーバーそのものは一般的には信頼できるドメインにあることです。現行のWebブラウザーでは、怪しいサーバーのURIを指定することで、そのドメインからダウンロードされたJavaScriptを実行しないという設定が可能ですし、NoScriptといったFireFoxプラグインもよく使われます。しかし、現在のWebアプリケーションの多くが、JavaScriptを用いたWebページから構成されているため、JavaScriptの実行を禁止すると、そのWebアプリケーションを正しく動かすことはできなくなってしまいます。
また、上で示した手順2)のように、多くのWebアプリケーションでは、ユーザーが入力した文字列をサーバー側でチェックして、悪意を持ったスクリプトを検出しています。ただ、攻撃者は、さまざまな手法を用いてそれを免れようとします。
例えば、入力として
今日は天気です<img src="javascript:alert('hello');"> <script>alert('hello again')</script> 。
という日記のテキスト文字列を受け取ることを考えましょう。単純にはそのテキストをスキャンし、"javascript:"と言うという文字列があるかどうかを検査するプログラムを書くことは容易です。ただ、次のような文字列が入力だったらどうでしょう。
今日は天気です <img src="jav ascript:alert('XSS');"> 。
驚くべきことに、上のスクリプトを実行してしまうブラウザ(特定のバージョン)があるのです。また、
今日は天気です src=javascript:alert('XSS')> 。
これは、各文字をUTF-8エンコーディングしたものです。ブラウザによっては、この符号化された文字列をアスキーコードに変換して実行するものがあります。これらの場合、単純に"javascript:"があるかどうかをチェックしても意味がありません。
ha.ckers.orgのXSS Cheat Sheetでは、単純な検証処理をすり抜けるための手法が収集され、対応するWebブラウザーの種類と共に記載されています。新しいバージョンのWebブラウザでは、これらの問題に対応しているものが多いですが、ユーザーが使用しているWebブラウザーがいつも最新だとは限らないため、注意が必要です。
XSSを防ぐための解決策の一つとして、筆者が所属する研究チームでは、設定したフィルタリングルールに基づいて、HTML, JSON, RSS/ATOM Feedデータから、JavaScriptコードを除去するツールActive Content Filter(ACF)を開発し、いくつかのIBM製品に提供しています。例えば、軽量な次世代WebアプリケーションプラットフォームであるProject Zero(製品版はWebSphere sMash)では、Webコンテンツに対してACFを適用することが可能です。また、Project Zero/WebSphere sMashでは、XSSとならんでWebアプリケーションに対する脅威として知られているクロスサイトリクエストフォージェリー(Cross Site Request Forgery, CSRF)を防ぐためのモジュールも含まれています。また、同様のツールとして、前述のOWASPが、AntiSammyというツールを公開しています。また、PerlやPHPなどのプログラミング言語では、文字列をエスケープしたりサニタイズする関数やライブラリーが提供されており、それらをうまく使うことで、脅威を軽減することが可能です。ただ、攻撃者はあの手この手を使って、これらの処理を無効化しようとするので、できるだけ新しいバージョンを使ったり、最新の情報を知るなどの努力が必要です。
脆弱性チェックツールIBM Rational AppScan
Webアプリケーションに対する脅威は、もちろんXSSだけではありません。さまざまな脅威を念頭に置きながらWebアプリケーションを構築することは困難です。セキュリティーのエキスパートではない開発者を支援するための環境やツールはいくつかありますが、ここでは、Rational AppScanという製品を紹介します。
AppScanは、既に構築されているWebアプリケーションに対し、さまざまな攻撃の組み合わせを自動生成・実行し、その結果をレポートすることができます。AppScanに、Webアプリケーションのtop画面のURLを入力すると、そのページをスキャンし、たどることができるページを収集していきます。得られたページのスキャンをさらに行い、ページ集合を作ります。それらに、例えばJavaScriptを埋め込んだ入力を自動生成し、サーバーに送信します。結果として受け取るHTML文書を解析し、攻撃が成功したかどうかをチェックします。既存のWebアプリケーションに対し、URL経由でネットワーク越しに解析を行いますので、簡単に既存のWebアプリケーションの脆弱性チェックが可能ですし、テスト段階からこのツールを用いることで、将来的なリスクを軽減することができます。図3にAppScanの画面のスナップショットを示します。
スキャン結果には、発見された脆弱性の詳細と、対策方法が含まれており、この結果を基に、アプリケーションを修正しよりセキュアにすることができます。
また、2008年には、Javaで書かれたWebアプリケーションに対し、ソースコードを解析することで脆弱性を検知する製品AppScan Developer Edition(DE)も発売されています。