2016/06/02

Genius が直面したセキュリティの問題

2016 年 6 月 2 日 MARC LALIBERTE 著

自社のビジネスモデルとユーザーにとって重要なセキュリティ保護が両立しないとわかったら、どうするべきでしょうか。ソフトウェア開発者の Vijith Assar 氏が先週、注釈サービスプラットフォームである Genius とその仕組みに関する調査結果をまとめた記事を The Verge に寄稿しました。 Genius は、ニューヨークのブルックリンを拠点とするスタートアップで、ユーザーがインターネット上の Web ページに注釈を付け、コメントセクションをどこにでも残せるサービスを提供しています。Genius の注釈の例は、Genius.com の [About US] ページでご覧になれます。

Genius は、自社のプロキシサーバーを経由させることで、Webコンテンツに注釈作成のための JavaScript を追加します。Genius のユーザーは、website.com の代わりに genius.it/website.com にアクセスします。すると、Genius のサーバーがバックグラウンドで website.com の元のコンテンツにアクセスし、Genius の JavaScript をページのソースに挿入して、それをコンテンツとしてクライアントブラウザーに転送します。受け取ったブラウザー側では、挿入された JavaScript によってページ上のすべてのリンクが書き換えられるため、要求が Genius のプロキシ経由で処理されるようになり、注釈を追加したり表示したりできるようになります。

Genius のこういった操作によって、CSP(コンテンツセキュリティポリシー)を XSS(クロスサイトスクリプティング)攻撃からのユーザーの保護に使用している Web サイトで、問題が発生することになります。CSP では、Web サーバーが HTTP ヘッダーを使用して、CSP 対応 Web ブラウザーに対してコンテンツの読み込み元を指示します。たとえば、Web サーバーが CSP を使用して、画像は cdn.website.com から、 JavaScript は api.google.com から、CSS(Cascading Style Sheets)は css.othersite.com からのみ取得するように、Web ブラウザーに指示できます。つまり、CSP ヘッダーで指定されていないサイトからのコンテンツはすべて、Web ブラウザーに拒否されることになります。また、CSP ヘッダーだけを記述すると、ヘッダーで明示的に許可されていない限り、インラインの JavaScript や CSS を Web ブラウザーが読み込まないように指示することになります。

クロスサイトスクリプティング攻撃からの保護を目的として CSP を使用し、デフォルトのインラインの JavaScript をブロックし、代わりに外部のソースを使用して専用の JavaScript を読み込むようにしている Web サイトも多くあります。このように設定されていれば、攻撃者がおそらくはコメントセクションや何らかの入力方法で Web サイトに JavaScript を挿入しようとしても、CSP ヘッダーの効果によって、Web ブラウザーでの悪意あるスクリプトの実行を防止できます。

ところが、この CSP が Genius にとっては問題になります。前述のように、JavaScript を挿入して Web サイトのすべてのリンクを書き換えるには、スクリプトを外部から読み込めないため、ページのソースに直接挿入する必要があります。Genius が仮にある Web サイトの元の CSP を取得したとしても、そのポリシーによって Genius の JavaScript の実行が阻止されます。これを回避するために Genius が元の CSP ヘッダーを削除してしまうと、プロキシの Web サイトにアクセスしたユーザーが、元のサイトでは回避できていたはずのクロスサイトスクリプティング攻撃にされる危険性が高くなります。

Assar 氏が最初に CSP の無効化によるセキュリティへの影響を公開した段階で、Genius は、同社の注釈機能ではページの読み込みでユーザーのいかなる個人情報も保存しないため、クロスサイトスクリプティング攻撃のリスクは極めて低いと発表しました。Assar 氏はさらに、Genius の説明は誤りではないが、脆弱性が存在することに変わりはなく、ドライブバイダウンロードやキーロガーなどの重大なセキュリティリスクは間違いなく存在すると説明しました。幸いにも、Assar が Genius の概念実証(Proof Of Concept)を提示した後に、Genius の開発者がコードを書き換えて Web サイトの元の CSP を有効に戻し、Genius のスクリプトが動作できるようにするためのいくつかの変更を加えました。

Google Chrome の最新版がこの CSP Level 2 仕様を完全サポートしているのに対し、Firefox の最新版はこのセキュリティの問題とは無関係の1つの指令を除くすべてをサポートしています。Internet Explorer、Edge、および Safari は現在、最初の CSP 仕様をサポートしていますが、CSP Level 2 についてはサポートしていません。ただし、CSP Level 2 仕様をサポートしないブラウザーでユーザーが Genius サービスを利用して Web サイトにアクセスした場合も、デフォルトのブラウザーの動作で、セキュリティ目的のコンテンツが禁止されます。つまり、Genius のプロキシを使用するためのリンクの書き換えに使用される Genius の JavaScript が、一部のブラウザーでは動作しないことを意味します。

Genius が今回、自社のサービスのエコシステムを見直してユーザーのセキュリティを強化する対策を実施したことは、素晴らしいことだと思います。CSP は、クロスサイトスクリプティング攻撃対策の重要なメカニズムです。どのようなユーザーにとっても、最新の仕様をサポートする Web ブラウザーを使用し、その保護が損なわれるようなサービスを利用しないことが重要です。— Marc Laliberte