ウェブのセキュリティ モデルは、同一オリジン ポリシーがベースになっています。https://mybank.com
のコードは https://mybank.com
のデータにのみアクセスでき、https://evil.example.com
にはアクセスできないようにする必要があります。各オリジンはウェブの他の部分から分離されているため、デベロッパーは安全にサンドボックスを構築してプレイできます。理論上これは非常に優れたモデルです。実際には、攻撃者は巧妙な方法を見つけてシステムを妨害します。
たとえば、クロスサイト スクリプティング(XSS)攻撃は、意図するコンテンツとともに悪質なコードを提供するようにサイトを仕向けることによって、同一生成元ポリシーを回避します。これは大きな問題です。ブラウザは、ページに表示されるすべてのコードを、そのページのセキュリティ オリジンに正当に含まれているものとして信頼するからです。XSS チートシートは、攻撃者が悪質なコードを注入することでこの信頼を侵害するために使用する手法の古い代表的な例です。攻撃者がなんらかのコードの注入に成功すると、それでほぼゲームオーバーです。ユーザー セッション データが侵害され、知らないうちに機密情報が悪意を持つ人に渡されてしまいます。できれば、それを避けたいと考えています。
この概要では、最新のブラウザで XSS 攻撃のリスクと影響を大幅に低減するための防御策である、コンテンツ セキュリティ ポリシー(CSP)について説明します。
要約
- 許可リストを使用して、許可または不許可の対象をクライアントに指示します。
- 使用可能なディレクティブについて説明します。
- どのようなキーワードが使用されているかを把握する。
- インラインコードと
eval()
は有害と見なされます。 - ポリシーを適用する前に、ポリシー違反をサーバーに報告します。
ソースの許可リスト
XSS 攻撃によって引き起こされる問題は、ブラウザが、アプリケーションに含まれるスクリプトと、悪意のある第三者が注入したスクリプトを区別できなくなることです。たとえば、このページの下部にある Google +1 ボタンは、オリジンがこのページのオリジンであるという条件で、https://apis.google.com/js/plusone.js
から取得したコードを読み込み、実行します。Google はそのコードを信頼していますが、apis.google.com
のコードが優れていて、apis.evil.example.com
のコードはおそらく素晴らしくないと、ブラウザが自ら判断することは期待できません。このブラウザは参照元にかかわらず、ただ素直にページが要求するコードをダウンロードして実行します。
サーバーから配信されるすべてのコンテンツを無条件に信頼するのではなく、CSP に則した Content-Security-Policy
HTTP ヘッダーを定義すると、信頼できるコンテンツ提供元の許可リストを作成して、ブラウザにこれらの提供元からのリソースのみを実行または表示するように指示できます。攻撃者がスクリプトを注入するセキュリティ ホールを見つけたとしても、許可リストに一致しなければそのスクリプトは実行されません。
apis.google.com
は有効なコードを配信すると信頼しています。また、自身のドメインも同様に信頼できるので、この 2 つのリソースのうちどちらかを取得した場合にのみスクリプトを実行できるポリシーを定義してみましょう。
Content-Security-Policy: script-src 'self' https://apis.google.com
簡単ですよね。お気づきのとおり、script-src
は、特定のページでスクリプト関連の権限を制御するディレクティブです。スクリプトの有効な参照元として 'self'
ともう 1 つ、https://apis.google.com
を指定しました。ブラウザは HTTPS を介して、オリジンが現在のページおよび apis.google.com
の JavaScript を従順にダウンロードし、実行します。
このポリシーを定義すると、ブラウザはそれ以外の参照元からのスクリプトは読み込まず、単純にエラーをスローします。巧妙な攻撃者がどうにかしてサイトにコードを注入しようとしても、期待どおりに成功せず、逆にエラーメッセージに遭遇します。
幅広いリソースに適用するポリシー
スクリプト リソースは最も明白なセキュリティ リスクですが、CSP は豊富なポリシー ディレクティブを提供し、ページの読み込みが許可されるリソースをきめ細かく制御します。script-src
についてはすでに説明したので、そのコンセプトはもうおわかりでしょう。
続いて、その他のリソース ディレクティブについて簡単に説明します。次のリストは、レベル 2 時点でのディレクティブの状態を示しています。レベル 3 の仕様が公開されていますが、主要なブラウザにはほとんど実装されていません。
base-uri
は、ページの<base>
要素に表示できる URL を制限します。child-src
は、ワーカーと埋め込まれたフレーム コンテンツの URL を列挙します。たとえば、child-src https://youtube.com
は、YouTube の動画を埋め込むことができますが、他のオリジンの動画は埋め込むことができません。connect-src
は、(XHR、WebSockets、EventSource を経由して)接続できるオリジンを制限します。font-src
は、ウェブフォントを配信できるオリジンを指定します。Google のウェブフォントはfont-src https://themes.googleusercontent.com
で有効にできます。form-action
は、<form>
タグからの送信の有効なエンドポイントを列挙します。frame-ancestors
は、現在のページを埋め込むことができるソースを指定します。このディレクティブは、<frame>
、<iframe>
、<embed>
、<applet>
タグに適用されます。このディレクティブは<meta>
タグで使用できず、非 HTML リソースにのみ適用されます。frame-src
はレベル 2 で非推奨になりましたが、レベル 3 で復元されています。存在しない場合は、以前と同様にchild-src
にフォールバックします。img-src
は、画像を読み込み可能なオリジンを定義します。media-src
は、動画と音声を配信できるオリジンを制限します。object-src
は、Flash などのプラグインを制御できます。plugin-types
は、ページで起動できるプラグインの種類を制限します。report-uri
には、コンテンツ セキュリティ ポリシー違反があった場合にブラウザがレポートを送信する URL を指定します。このディレクティブは<meta>
タグで使用できません。style-src
は、スタイルシートのscript-src
に相当します。upgrade-insecure-requests
は、URL スキームを書き換えて HTTP を HTTPS に変更するようユーザー エージェントに指示します。このディレクティブは、書き直しが必要な古い URL が多数存在するウェブサイトに使用します。worker-src
は、ワーカー、共有ワーカー、または Service Worker として読み込まれる URL を制限する CSP レベル 3 ディレクティブです。2017 年 7 月現在、このディレクティブの実装は制限されています。
デフォルトでは、ディレクティブに制限はありません。ディレクティブに特定のポリシーを設定しない場合(font-src
など)、そのディレクティブは、有効な参照元として *
を指定した場合と同じようにデフォルトで動作します(たとえば、制限なしでどこからでもフォントを読み込むことができます)。
このデフォルトの動作は、default-src
ディレクティブを指定することでオーバーライドできます。このディレクティブは、未指定のディレクティブの大半に対してデフォルトを定義します。通常、これは末尾が -src
のディレクティブに適用されます。default-src
が https://example.com
に設定され、font-src
ディレクティブを指定しなかった場合、https://example.com
からフォントを読み込むことはできますが、それ以外からは読み込めません。前の例では script-src
のみを指定しました。この場合、画像、フォントなどはどのオリジンからでも読み込むことができます。
次のディレクティブは、フォールバックとして default-src
を使用しません。設定しない場合は、すべてを許可した場合と同じ結果になります。
base-uri
form-action
frame-ancestors
plugin-types
report-uri
sandbox
これらのディレクティブは、アプリケーションに応じて必要な数だけ使用できます。HTTP ヘッダーに各ディレクティブをリストし、ディレクティブをセミコロンで区切ってください。1 つのディレクティブで、必須のリソースタイプをすべて記述していることを確認してください。script-src https://host1.com; script-src https://host2.com
のように記述すると、2 番目のディレクティブは無視されます。両方のオリジンの指定を有効にする正しい記述は次のとおりです。
script-src https://host1.com https://host2.com
たとえば、コンテンツ配信ネットワーク(https://cdn.example.net
など)からすべてのリソースを読み込むアプリがあり、フレーム化されたコンテンツやプラグインが不要な場合、ポリシーは次のようになります。
Content-Security-Policy: default-src https://cdn.example.net; child-src 'none'; object-src 'none'
実装の詳細
ウェブの各種チュートリアルで、X-WebKit-CSP
ヘッダーと X-Content-Security-Policy
ヘッダーを目にすることがあるでしょう。今後は、これらの接頭辞付きヘッダーは無視する必要があります。最新のブラウザ(IE を除く)は、接頭辞のない Content-Security-Policy
ヘッダーをサポートしています。こちらのヘッダーを使用してください。
使用するヘッダーに関係なく、ポリシーはページごとに定義されます。保護したいレスポンスはすべて HTTP ヘッダーとともに送信する必要があります。これにより、各ニーズに応じて特定のページのポリシーを微調整できるため、柔軟性が向上します。サイトに +1 ボタンが存在するページもあれば、ないページもあります。その場合、必要なときにだけボタンのコードの読み込みを許可できます。
各ディレクティブのソースリストは柔軟に使用できます。ソースはスキーム(data:
、https:
)で指定することも、ホスト名のみ(example.com
、そのホスト上の任意のオリジン、スキーム、ポートのいずれかに一致)から完全修飾 URI(https://example.com:443
、HTTPS のみ、example.com
のみ、ポート 443 のみに一致)の範囲で指定することもできます。ワイルドカードも使用できますが、スキーム、ポート、またはホスト名の一番左端のみに限定されます。*://*.example.com:*
は、example.com
のすべてのサブドメインに一致し、スキームとポートはどれでも使用できます(ただし、example.com
自体は一致しません)。
参照元リストには、次の 4 つのキーワードも使用できます。
'none'
: 予想どおり、何も一致しません。'self'
は現在のオリジンとは一致しますが、サブドメインとは一致しません。'unsafe-inline'
: インライン JavaScript と CSS を許可します。(このキーワードについては、後でもう少し詳しく説明する予定です)。'unsafe-eval'
は、eval
などの text-to-JavaScript の仕組みを許可します。(このキーワードについても後述します)。
これらのキーワードには一重引用符が必要です。たとえば、script-src 'self'
(引用符付き)は、現在のホストからの JavaScript の実行を許可します。script-src self
(引用符なし)は、(現在のホストからではなく)「self
」という名前のサーバーからの JavaScript を許可します。これはおそらく意図と異なるでしょう。
サンドボックス化
もう 1 つ説明すべきディレクティブがあります。sandbox
です。これまで説明してきたディレクティブとは若干異なり、ページが読み込めるリソースにではなく、ページで実行できるアクションに制限を加えます。sandbox
ディレクティブが存在する場合、ページは sandbox
属性を指定した <iframe>
内に読み込まれるように処理されます。このディレクティブは、ページを一意のオリジンに限定したり、フォームの送信を禁止したり、ページに幅広い効果をもたらします。この記事の範囲からややはずれますが、有効なサンドボックス属性の完全な詳細については、HTML5 仕様の「Sandboxing」セクションをご覧ください。
meta タグ
CSP が推奨する配信メカニズムは HTTP ヘッダーです。ただし、ページのマークアップに直接ポリシーを設定することもできます。その場合、http-equiv
属性を持つ <meta>
タグを使用します。
<meta
http-equiv="Content-Security-Policy"
content="default-src https://cdn.example.net; child-src 'none'; object-src 'none'"
/>
frame-ancestors
、report-uri
、sandbox
には使用できません。
インラインコードは有害と見なす
CSP は明確に、許可リストに登録されたオリジンに基づいています。こうすれば、特定のリソースだけを受け入れてそれ以外を拒否するという、あいまいさを排除した処理をブラウザに指示できるからです。ただし、オリジンベースの許可リストでは、XSS 攻撃による最大の脅威であるインライン スクリプト インジェクションを解決できません。攻撃者が、悪意のあるペイロード(<script>sendMyDataToEvilDotCom();</script>
)を直接含むスクリプトタグを挿入できる場合、ブラウザには、それを正当なインライン スクリプトタグと区別するメカニズムがありません。CSP でこの問題を解決するには、インライン スクリプトを完全に禁止します。これが唯一確実な方法です。
この禁止には、script
タグに直接組み込まれたスクリプトに限らず、インライン イベント ハンドラと javascript:
URL も含まれます。script
タグのコンテンツを外部ファイルに移動し、javascript:
URL と <a ... onclick="[JAVASCRIPT]">
を適切な addEventListener()
呼び出しに置き換える必要があります。たとえば、次のコードを書き換えるとします。
<script>
function doAmazingThings() {
alert('YOU AM AMAZING!');
}
</script>
<button onclick="doAmazingThings();">Am I amazing?</button>
次のように変更します。
<!-- amazing.html -->
<script src="amazing.js"></script>
<button id="amazing">Am I amazing?</button>
<div style="clear:both;"></div>
// amazing.js
function doAmazingThings() {
alert('YOU AM AMAZING!');
}
document.addEventListener('DOMContentLoaded', function () {
document.getElementById('amazing').addEventListener('click', doAmazingThings);
});
書き換えられたコードには、CSP とうまく連動する以上のメリットがあります。CSP を使用するかにかかわらず、これはベスト プラクティスです。インライン JavaScript は、不適切な方法で構造と動作を混在させています。外部リソースはブラウザでキャッシュしやすく、デベロッパーにとってわかりやすく、編集と圧縮のメリットがあります。外部リソースにコードを移動すれば、より適切なコードを書くことができます。
インライン スタイルも同じように扱われます。style
属性と style
タグの両方を外部スタイルシートに統合して、CSS で利用できるさまざまな驚くほど巧妙なデータ引き出し方法から保護する必要があります。
どうしてもインライン スクリプトやインライン スタイルが必要な場合は、script-src
または style-src
ディレクティブで許可される参照元として 'unsafe-inline'
を追加することで有効にできます。ナンスやハッシュ(以下を参照)を使用することもできますが、使用すべきではありません。インライン スクリプトの禁止は、CSP で可能な最大のセキュリティ保護ですが、インライン スタイルの禁止も同様に、アプリケーションをさらに強化できます。すべてのコードを外部に移動した後は、正しく動作するかの事前確認が多少は必要になりますが、その手間をかけるだけの価値はあります。
やむを得ずインライン スクリプトを使用しなければならない場合
CSP レベル 2 では、暗号ノンス(1 回使用する数値)またはハッシュのいずれかを使用して、特定のインライン スクリプトを許可リストに追加できるため、インライン スクリプトの下位互換性が提供されます。これは面倒に思われるかもしれませんが 難しい場合に役立ちます
ナンスを使用するには、script タグに nonce 属性を指定します。その値は、信頼できるソースのリストにある値と一致している必要があります。例:
<script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">
// Some inline code I can't remove yet, but need to asap.
</script>
続いて、nonce-
キーワードに付加したナンスを、script-src
ディレクティブに追加します。
Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
ノンスはページ リクエストごとに再生成する必要があり、推測できないものにする必要があります。
ハッシュもほぼ同じように機能します。script タグにコードを追加する代わりに、スクリプト自体の SHA ハッシュを作成して script-src
ディレクティブに追加します。たとえば、ページに次のような内容が含まれているとします。
<script>
alert('Hello, world.');
</script>
ポリシーは次のようになります。
Content-Security-Policy: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng='
いくつか注意点があります。sha*-
接頭辞は、ハッシュを生成するアルゴリズムを指定します。上記の例では、sha256-
を使用しています。CSP は sha384-
と sha512-
もサポートしています。ハッシュを生成する際は、<script>
タグを含めないでください。また、先頭や末尾のスペースなど、大文字やスペースも影響します。
SHA ハッシュの生成については、Google 検索を使えばあらゆる言語でソリューションにたどり着くでしょう。Chrome 40 以降を使用して、DevTools を開き、ページを再読み込みします。[Console] タブには、インライン スクリプトごとに、エラー メッセージと正しい sha256 ハッシュが含まれています。
評価にも注意
攻撃者がスクリプトを直接挿入できない場合でも、アプリケーションを騙して不活性なテキストを実行可能な JavaScript に変換し、ユーザーの代わりに実行させるおそれがあります。eval()
、new Function()、setTimeout([string], ...)
、setInterval([string], ...)
はすべて、挿入されたテキストが予期しない悪意のあるものを実行する可能性があるベクトルです。CSP のこのリスクに対する基本的な回答は、このような媒介となる関数をすべて完全にブロックすることです。
これは、アプリケーションの構築方法に少なからず影響を及ぼします。
eval
に頼らず、組み込みのJSON.parse
を介して JSON を解析する必要があります。ネイティブの JSON 演算は、IE8 以降のすべてのブラウザで利用でき、高い安全性が確保されています。- 現在実行している
setTimeout
またはsetInterval
呼び出しを、文字列ではなくインライン関数を使用するように書き直してください。例:
setTimeout("document.querySelector('a').style.display = 'none';", 10);
次のように改善します。
setTimeout(function () {
document.querySelector('a').style.display = 'none';
}, 10);
- 実行時にインライン テンプレートを使用しない: 多くのテンプレート ライブラリで
new Function()
をうまく使用することで、実行時のテンプレート生成を高速化しています。これは動的プログラミングのすばらしい応用例ですが、悪意のあるテキストを評価するリスクにさらされます。一部のフレームワークでは CSP をすぐにサポートしており、eval
がない場合は堅牢なパーサーにフォールバックします。AngularJS の ng-csp ディレクティブがその好例です。
ただし、プリコンパイルを実行できるテンプレート言語(Handlebars など)を使用することをおすすめします。テンプレートをプリコンパイルすると、最速のランタイム実装よりもユーザー エクスペリエンスがさらに高速になり、安全性も高まります。eval や、text-to-JavaScript の兄弟機能がアプリケーションに不可欠な場合は、script-src
ディレクティブの許可ソースとして 'unsafe-eval'
を追加することで有効にできますが、この方法はおすすめしません。文字列の実行を禁止すれば、攻撃者にとって、不正なコードをサイトで実行することが非常に難しくなります。
レポート
信頼できないリソースをクライアント側でブロックする CSP の機能は、ユーザーに多大なメリットをもたらします。さらに、なんらかの通知をサーバーに返送し、悪意のある注入を許すバグを最初の段階で特定して防ぐために非常に役立ちます。これを実現するために、report-uri
ディレクティブで指定した場所に JSON 形式の違反レポートを POST
するようにブラウザに指示できます。
Content-Security-Policy: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;
レポートは次のようになります。
{
"csp-report": {
"document-uri": "http://example.org/page.html",
"referrer": "http://evil.example.com/",
"blocked-uri": "http://evil.example.com/evil.js",
"violated-directive": "script-src 'self' https://apis.google.com",
"original-policy": "script-src 'self' https://apis.google.com; report-uri http://example.org/my_amazing_csp_report_parser"
}
}
これには、違反が発生したページ(document-uri
)、そのページの参照元(HTTP ヘッダー フィールドとは異なり、キーのスペルは間違っていないことに注意してください)、ページのポリシーに違反したリソース(blocked-uri
)、違反した特定のディレクティブ(violated-directive
)、ページの完全なポリシー(original-policy
)など、違反の具体的な原因を特定するのに役立つ多くの情報が含まれています。
レポート専用
CSP を初めて使用する場合は、厳格なポリシーをユーザーにロールアウトする前に、アプリケーションの現在の状態を評価することをおすすめします。完全なデプロイへのステップとして、ポリシーのモニタリングをブラウザに依頼し、違反を報告するだけで制限を適用しないこともできます。Content-Security-Policy
ヘッダーを送信する代わりに、Content-Security-Policy-Report-Only
ヘッダーを送信します。
Content-Security-Policy-Report-Only: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;
report-only モードで指定されたポリシーは、制限対象リソースをブロックせず、違反レポートを指定した場所に送信します。両方のヘッダーを送信して、1 つのポリシーを適用し、もう 1 つのポリシーを監視することもできます。これは、アプリケーションの CSP を変更した場合の影響を評価する方法として非常におすすめです。新しいポリシーのレポートを有効にして、違反レポートを監視し、見つかったバグを修正します。その効果に満足できたら、新しいポリシーの適用を開始します。
実際の使い方
CSP 1 は、Chrome、Safari、Firefox でその大部分を使用できますが、IE 10 でのサポートはかなり制限されています。詳細については、caniuse.com をご覧ください。CSP Level 2 は、バージョン 40 以降の Chrome で使用できます。Twitter や Facebook のような大規模なサイトは、このヘッダーをデプロイしています(Twitter のケーススタディは一読の価値があります)。この標準を使用して、すぐにでも自分のサイトでデプロイを開始できます。
アプリケーションのポリシーを作成するための最初のステップは、実際に読み込んでいるリソースを評価することです。リソースを自分のアプリにどうまとめればよいかを把握できたら、その要件に基づきポリシーを設定します。一般的なユースケースをあげながら、CSP の保護の範囲内で対応できる最善策を見ていきましょう。
ユースケース 1: ソーシャル メディア ウィジェット
Google の +1 ボタンには
https://apis.google.com
のスクリプトが含まれており、https://plusone.google.com
の<iframe>
が埋め込まれています。ボタンを埋め込むには、この両方のオリジンを含むポリシーが必要です。最小限のポリシーはscript-src https://apis.google.com; child-src https://plusone.google.com
です。また、Google が提供する JavaScript のスニペットが、外部の JavaScript ファイルに pull されるようにする必要もあります。frame-src
を使用するレベル 1 ベースのポリシーがある場合、レベル 2 ではchild-src
に変更する必要があります。これは CSP レベル 3 では不要になりました。Facebook の高評価ボタンには、実装オプションがいくつかあります。サイトの他の部分から安全に切り離せるため、
<iframe>
バージョンだけを使用することをおすすめします。適切に機能するには、child-src https://facebook.com
ディレクティブが必要です。デフォルトでは、Facebook が提供する<iframe>
コードは相対 URL である//facebook.com
を読み込みます。HTTPS を明示的に指定するには、https://facebook.com
に変更します。あえて HTTP を使用する理由はありません。Twitter のツイート ボタンは、スクリプトとフレームの両方にアクセスする必要があります。どちらも
https://platform.twitter.com
でホストされています。(Twitter もデフォルトで相対 URL を提供します。ローカルにコピー / 貼り付けるときは、コードを編集して HTTPS を指定してください)。Twitter が提供する JavaScript スニペットを外部 JavaScript ファイルに移動すれば、script-src https://platform.twitter.com; child-src https://platform.twitter.com
の設定は完了です。その他のプラットフォームにも類似の要件があり、同じように対処できます。
default-src
を'none'
に設定し、コンソールを監視して、ウィジェットを機能させるために有効にする必要があるリソースを特定することをおすすめします。
複数のウィジェットを含めるのは簡単で、ポリシーのディレクティブを統合するだけです。先ほど説明したとおり、同じタイプのリソースはすべて 1 つのディレクティブにまとめる必要があります。3 つのソーシャル メディア ウィジェットがすべて必要な場合は、ポリシーは次のようになります。
script-src https://apis.google.com https://platform.twitter.com; child-src https://plusone.google.com https://facebook.com https://platform.twitter.com
ユースケース 2: ロックダウン
あなたは銀行のサイトを運営しており、自分で記述したリソースだけを読み込めるようにする必要があるとします。このシナリオでは、すべてを完全にブロックするデフォルト ポリシー(default-src 'none'
)から始めて、徐々に構築していきます。
この銀行ではすべての画像、スタイル、スクリプトを https://cdn.mybank.net
にある CDN から読み込むとします。また、XHR 経由で https://api.mybank.com/
に接続し、各種のデータを取得します。フレームが使用されていますが、サイトのローカル ページのみです(サードパーティのオリジンはありません)。サイトに Flash、フォント、その他の要素はありません。送信できる最も制限の厳しい CSP ヘッダーは次のとおりです。
Content-Security-Policy: default-src 'none'; script-src https://cdn.mybank.net; style-src https://cdn.mybank.net; img-src https://cdn.mybank.net; connect-src https://api.mybank.com; child-src 'self'
ユースケース 3: SSL のみ
結婚指輪のディスカッション フォーラムの管理者が、すべてのリソースを安全なチャンネルからのみ読み込めるようにしたいと考えていますが、あまり多くのコードを記述したくありません。インライン スクリプトとインライン スタイルが多数使われているサードパーティ フォーラム ソフトウェアの大量のコードを書き直すことは、管理者の能力を超えています。効果的なポリシーは次のとおりです。
Content-Security-Policy: default-src https:; script-src https: 'unsafe-inline'; style-src https: 'unsafe-inline'
default-src
で https:
が指定されていますが、スクリプトとスタイルのディレクティブは、その参照元を自動的に継承することはありません。各ディレクティブは、特定のタイプのリソースでデフォルト値を完全に上書きします。
今後について
コンテンツ セキュリティ ポリシー レベル 2 は 推奨事項候補です。W3C の Web Application Security Working Group はすでに、次の規格である Content Security Policy Level 3 のイテレーションに着手しています。
今後の機能に関する議論に興味をお持ちの方は、public-webappsec@ メーリング リストのアーカイブを一読するか、このメーリング リストにご参加ください。