WWW Watch

Firefox 23 が Content Security Policy 1.0 仕様に対応

Firefox 23 (2013年 8月 6日正式リリース予定) が、クロスサイトスクリプティング (XSS) などの攻撃から Web ページを保護するための仕組み 「Content Security Policy 1.0」 仕様に対応しました。

FirefoxMozilla Hacks で、現在 Aurora チャンネルの、Firefox 23 が、Content Security Policy (CSP) 1.0 の仕様に対応した件、紹介されていました。

Content Security Policy (CSP) 1.0 は、あらかじめその Web ページで読み込まれることが想定されている JavaScript などのコンテンツを、ホワイトリストとして指定することによって、攻撃者によって挿入される悪意のあるスクリプトの読み込みを遮断し、クロスサイトスクリプティング (XSS) など、インジェクション攻撃から Web サイト や Web アプリケーションを保護するための仕組み。現在、W3C で策定が進められ、勧告候補の段階になっています。

We have just landed support for the Content Security Policy (CSP) 1.0 specification in Firefox Aurora (Firefox 23), available as of tomorrow (May 30th). CSP is a security mechanism that aims to protect a website against content injection attacks by providing a whitelist of known-good domain names to accept JavaScript (and other content) from. CSP does this by sending a Content-Security-Policy header with the document it protects (yes, we lost the X prefix with the 1.0 version of the spec).

Content Security Policy 1.0 lands in Firefox Aurora : Mozilla Hacks から引用

CSP を有効にする、また、詳細なポリシーの指定は HTTP ヘッダを利用します。当たり前ですけども、セキュリティの関係上、meta 要素による Content-Security-Policy ヘッダの指定はできませんので、サーバ側での設定が必要になります。

CSP はもともと、Mozilla が開発し、Firefox 4 から実装されていますので、かなり前から使えていましたが、独自実装のため W3C で策定中の標準仕様 (CSP 1.0) では、「Content-Security-Policy」 ヘッダを使用するのに対して、Firefox では 「X-Content-Security-Policy」 ヘッダを使用するなど、多少の差異がありました。今回の件で、Firefox 23 以降は、標準仕様の方に対応したということになります。

ちなみに、Google Chrome は、一足先の var.25 で、Content-Security-Policy ヘッダが使用できるようになっています。それ以前のバージョンや、Safari など、Webkit 啓のブラウザでは、「X-WebKit-CSP」 ヘッダを送信することで、CSP を使用することができます。IE10 も、「X-Content-Security-Policy」 ヘッダで CSP を利用することができますよ。

指定できるディレクティブ

ヘッダ情報として送信できる CSP の各設定項目 (ディレクティブ) には下記のようなものが挙げられます。また、それぞれには、特に指定されていなかった場合の初期値があらかじめ定められています。

  • default-src
  • script-src
  • object-src
  • style-src
  • img-src
  • media-src
  • frame-src
  • font-src
  • connect-src
  • sandbox
  • report-uri

例えば、下記のように HTTP ヘッダをセットして、CSP を有効にした場合、すべてのコンテンツの読み込みは、その Web ページと同一オリジン (URL スキーム、ドメイン、ポート番号がすべて一致) からのみ可能になります。つまり、他のドメインなどからのコンテンツの読み込みはできません。

Content-Security-Policy: allow 'self'

だからもし、今ご覧になっているこのページで、このヘッダを有効にしたら、ソーシャル系のボタンとか、Google Analytics とか、別ドメインからスクリプトや画像などを読み込んでいる機能が全部動かなくなります。

さらに、例えばですが、script-src ディレクティブの初期値は、

  • インライン JavaScript の実行不可
  • eval の無効
  • Data URI scheme での JavaScript 無効

などとなっていますので、「Web ページと同一オリジンから、外部リソースとして読み込まれた JavaScript」 のみ (eval は無効) が実行可能となり、これによって、XSS のように JavaScript コードを挿入することで行われる攻撃を防ぐことが可能になるというわけです。

また、下記のように、細かくディレクティブを指定して、読み込み可能なコンテンツを制御することも可能です。

Content-Security-Policy: allow 'self';
script-src 'self' http://www.example.com;
img-src 'self' *example.com

冒頭で書いたとおり、ホワイトリスト方式ですから、読み込み、実行を許可する項目を指定していくことになります。細かく指定していけば、セキュリティ強度はかなり向上しますが、メンテナンスとのバランスもありますので、セキュリティが重要な Web ページやアプリケーションに関してはうまく利用すればよいと思います。

その他、詳しくは下記のページなどが参考になります。CSP 1.0 仕様の日本語訳も公開されていますので参考まで。

2013年 6月 22日 追記
Mozilla で CSP に関する詳細な記事が上がっていましたので紹介。

関連エントリー

Recent Entry

全ての記事一覧を見る

Hot Entry

逆引きおすすめエントリー