RSSでWebページの更新情報を提供することが多くなりました。ブログソフトウェアやCMS(コンテンツ管理システム)では自動的にRSSフィードを生成してくれます。また、RSS情報を取得し見やすく整形して表示するRSSリーダーを使用してWebサイトの巡回をしている人も多いと思います。今回は、RSSフィードを提供する場合のセキュリティとRSSリーダーのセキュリティについて考えていきます。
RSSフィードのフォーマット
RSSにはいくつかのバージョンが存在します。RSS1.0、RSS2.0、Atomがよく使われています。たとえばRSS2.0は以下のようなXML形式のファイルです。このようなRSSフィードをWebサイト運営者が作成し、RSSリーダーがRSSフィードを読み込み、整形して表示するという流れになります。
RSSでの攻撃シナリオ
まず、攻撃者は攻撃コードを埋め込んだRSSフィードを準備します。このRSSフィードを設置する場所としては2つのケースが考えられます。1つは攻撃者自身のWebサイトに不正なRSSフィードを設置する方法で、もう1つが他のサイトのRSSフィードに埋め込む方法です。
攻撃者自身のサイトに攻撃コードを含んだRSSフィードを設置する方法の場合、攻撃者は自身のサイトに被害者を誘導しアクセスさせる必要があります。
一方、他のサイトのRSSフィードに埋め込む方法の場合、著名なサイトのRSSフィードに埋め込むことができれば攻撃の効果も上がります。ブログのコメントやトラックバックを利用することで、攻撃コードを埋め込んだRSSフィードを生成させることができる場合があります。
そして、攻撃コードを埋め込まれたRSSフィードをRSSリーダーが読み込んだ時に被害が発生します。発生しうる主な脆弱性には以下のものがあります。
- クロスサイトスクリプティング
- SQLインジェクション
- バッファオーバーフロー
RSSフィードへの攻撃による被害拡散
攻撃者はどこかのRSSフィードに攻撃コードを埋め込んでおけば、そのRSSを購読しているユーザのほうからRSSフィードを取得しに来てくれます。
一般のクロスサイトスクリプティングは何らかの方法によりユーザをサイトに誘導する必要があったのに対し、RSSを利用した攻撃の場合、攻撃者は一度攻撃を仕掛ければ、待っているだけでユーザのほうから被害に遭いに来てくれます。また、RSSフィードを一度購読すると、RSSリーダーは数分間隔で更新確認のためにRSSフィードにアクセスします。そのため、非常に効率よく大規模な攻撃を行うことができるので、攻撃者から見ると格好のターゲットになります。
RSSフィード提供者は、このように攻撃の踏み台となるのを防ぐ必要があります。対策は、一般のWebアプリケーションと同様です。
たとえば、図1のようにコメント欄に
と入力されていた場合には
としてRSSフィードに出力すればよいことになります。
RSSリーダーの脆弱性
では、次にRSSリーダーの脆弱性について考えてみます。
RSSフィードがWebサイトの更新情報を配信しているという性格上、RSSリーダーはブラウザを利用したWebアプリケーションとして開発される場合と、IEコンポーネントを利用したアプリケーションやFirefoxのアドオンとして開発される場合があります。
そのため、クロスサイトスクリプティングやSQLインジェクションのように、一般のWebアプリケーションと同じ脆弱性が存在します。HTMLを解釈して出力する機能があればクロスサイトスクリプティングの脆弱性が考えられ、データベースへの登録機能があればSQLインジェクションの脆弱性が考えられます。よってその対策も一般のWebアプリケーションと同様になります。
しかしRSSリーダーの種類によってはクロスサイトスクリプティングの影響範囲が一般のWebアプリケーションとは異なる部分がありますので、クロスサイトスクリプティングについてもう少し見ていきたいと思います。
所属するドメインに注意
ローカルアプリケーションとして動作するRSSリーダーの仕組みは次のようになります。
- 登録されたURLにアクセスし、RSSフィードを読み込む
- RSSフィードを解析し、必要な情報を抜き出す
- 抜き出した情報を元に、HTMLファイルを作成し保存する
- 保存したHTMLファイルを表示する
※RSSリーダーによって細かい違いはあります。たとえばHTMLファイルを動的に生成するものもあります。
ここで問題となるのが、上記の4番でHTMLファイルを表示する際に、どのドメインに属することになるのかということです。
なぜ問題になるのかというと、第2回で、Webの世界ではSame-Originポリシーがセキュリティを保つための重要なポリシーのひとつであると紹介しました。これは、基本的にスクリプトは同じドメイン内にしかアクセスできないというポリシーです。しかし、裏を返せば同じドメインであればスクリプトでアクセスできるということなので、どのドメインに属するかというのが重要なのです。
たとえば、ブラウザでローカルに保存されたファイルを閲覧している場合、マイコンピュータのドメインに属します。そのため、ローカルに保存されたファイルから以下のようなスクリプトを実行することで、ローカルのファイルにアクセスすることができます。
しかし、このファイルをInternet Explorerで開いた場合には図4のような警告が表示され、ユーザが許可しない限りスクリプトは実行されません。ローカルのファイルを開いた場合、マイコンピュータのドメインでスクリプトが実行されて危険なため、セキュリティ上の制限が掛かっているのです。
一方、Firefoxで開いた場合には、何の警告もなくスクリプトが実行されてしまいます。この点はFirefoxの方が危険な状態にあります。
かといってInternet Explorerが安全というわけではありません。IEコンポーネントを使ってRSSリーダーを開発した場合には、このような警告は表示されません。安全のために用意されている機能が働かないわけです(もちろんFirefoxのアドオンとして開発されている場合にも、警告は表示されません)。そのため、ユーザが気づかないうちにローカルのファイルを盗むことが可能になります。
ローカルアプリケーションによる被害拡大
WebアプリケーションタイプのRSSリーダーにクロスサイトスクリプティングの脆弱性が存在していた場合、被害としては一般のWebアプリケーションと同様で、認証情報の盗難や画面のなりすまし等が起こり得ます。一方、インストールして使用するタイプのRSSリーダーにクロスサイトスクリプティングの脆弱性が存在していた場合には、ローカルコンピュータのファイル盗難といった被害が発生します。
今回はRSSリーダーを例として説明しましたが、RSSリーダーに限らず、ローカルで動作するアプリケーションであれば同様の脆弱性が存在する可能性があります。Web2.0という言葉が出はじめてから、Web(HTTP)を使ったアプリケーションが多く作られています。そのようなソフトウェアを開発し、配布する場合には、脆弱性が存在した場合の影響範囲を見誤らないように注意していただければと思います。