Content Security Policyとは?何が読み込まれるかを制御する
content security policy(CSP)とは、browserが強制するallowlistであり、ページが読み込んでよいscript、スタイル、その他のリソースのソースを宣言します。
content security policy(CSP)は、cross-site scriptingに対する最も強力な防御の一つです。HTTP headerとして配信され、どのソースのコードやコンテンツを信頼するかを正確にbrowserに指示します。注入された悪意あるscriptを含め、リストにないものはすべてブロックされます。よく作り込まれたCSPは、本来なら悪用可能なXSS脆弱性を無力化できます。
CSPの仕組み
サーバーは、リソースの種類ごとに許可されたソースを列挙したContent-Security-Policy headerを送信します。scriptはこれらのオリジンから、スタイルはあれらから、画像は別の場所から、といった具合です。browserはこのポリシーを強制し、allowlistの外にあるものの読み込みや実行を拒否します。
CSPが防御する対象
- 注入されたinlineまたはサードパーティのscriptによるcross-site scripting。
- 予期しない信頼できないオリジンからのリソースの読み込み。
- 接続先を制限することによる、一部のデータ流出経路。
nonceとhash
特定のinline scriptを安全に許可するために、CSPはレスポンスごとのnonceやscript内容のhashを使えます。対応するnonceまたはhashを持つscriptだけが実行されるため、それを持たないscriptを注入した攻撃者はブロックされます。
CSPを慎重に構築する
CSPはアプリに合わせて調整する必要があります。緩すぎればほとんど保護になりませんし、厳しすぎれば正当な機能を壊します。チームはしばしばreport-onlyモードで始め、違反を収集し、その後ポリシーが安全かつ機能的になるまで締めていきます。
CI/CDにおけるCSP
CSPは、scriptやサードパーティのwidgetを追加する際に、うっかり壊しやすいものです。CSPが存在し緩められていないことを表明するCIチェックは、デプロイ前にリグレッションを捕捉し、保護を長期にわたって維持します。
多層防御の一部
CSPは、入力のサニタイズや出力のエンコードを置き換えるものではありません。最後の砦です。XSSの欠陥がすり抜けても、強力なCSPは注入されたscriptの実行を止め、潜在的な侵害をブロックされた試行へと変えられます。
重要なポイント
- CSPは、信頼できるscriptおよびリソースのソースを列挙した、browserが強制するallowlistです。
- cross-site scriptingに対する強力な最後の砦であり、inline scriptにはnonceやhashを使います。
- 慎重に調整し、CIで検証することで、デプロイがひそかにCSPを緩めることを防ぎます。