Mozilla 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 仕様の日本語訳も公開されていますので参考まで。
- Introducing Content Security Policy : MDN (現状ではちょっと情報が古い)
- An Introduction to Content Security Policy : HTML5 Rocks (翻訳記事)
- Content Security Policy 1.0 (日本語訳)
2013年 6月 22日 追記
Mozilla で CSP に関する詳細な記事が上がっていましたので紹介。