CSPは「魔法の杖」ではない:script-srcの深淵と、モダンWebの防御アーキテクチャ
多くのエンジニアがCSP(Content Security Policy)を「XSSを防ぐための単なるヘッダー」だと誤解している。だが、現場でインシデント対応の最前線に立つ我々にとって、CSPは攻撃者のOSI参照モデルレイヤー7における「最後の砦」であり、同時に設定ミス一つでいとも簡単に突破される「脆い防壁」でもある。
今日は、script-srcディレクティブの本質と、それがなぜプロンプトインジェクションの時代において再評価されるべきなのか、その核心を突く。
—
1. 「信頼できるドメイン」という幻想
多くの組織が設定する script-src 'self' https://trusted.cdn.com というポリシー。これを見て「安全だ」と思うのは素人だ。
攻撃者は、CDN上にホストされた「正当なライブラリ」の中に存在する「ガジェット」を狙う。例えば、古いバージョンのAngularJSや、特定のjQueryプラグイン。これらは正当なドメインから読み込まれているため、CSPのホワイトリストをすり抜ける。これが、パケット解析や静的解析では防ぎきれない、アプリケーション層の盲点だ。
対策の核心:
単なるドメイン制限ではなく、strict-dynamic と nonce(使用回数制限付きの使い捨てトークン)の併用が現代の標準だ。
推奨される厳格なCSPヘッダーの例
Content-Security-Policy:
default-src ‘none’;
script-src ‘nonce-EDNnf03nceIOfn39fn3e9h3sdf’ ‘strict-dynamic’ https:;
object-src ‘none’;
base-uri ‘none’;
nonce: サーバー側で生成したランダムな文字列。HTML内のタグと一致しなければ実行されない。strict-dynamic: 信頼されたスクリプトが動的に生成した追加スクリプトまで信頼の連鎖を広げる。これにより、無秩序なホワイトリストを廃止できる。
---
2. メモリ破壊からプロンプトインジェクションへ:防御のシフト
かつての攻撃は、バッファオーバーフローによるメモリ破壊(ROPチェーンなど)が主流だった。しかし現在は、AIモデルに対するプロンプトインジェクションがその役割を担っている。
LLMが出力した「悪意のあるコード」がブラウザ上で実行される際、CSPは最後のガードレイルとなる。もし、CSPで unsafe-inline を許可していれば、AIが生成したスクリプトは即座に実行され、セッションクッキーが奪取される。
ここで重要なのは、「CSPは実行を止めるが、注入自体は防げない」という現実だ。つまり、CSPを配置した上で、サーバーサイドの入力バリデーションと、フロントエンドのレンダリングエスケープを徹底する、いわゆる「多層防御(Defense in Depth)」の哲学が不可欠となる。
---
3. 次世代の監査:CSPのモニタリングと「報告」の活用
多くのエンジニアは Content-Security-Policy-Report-Only ヘッダーを軽視している。だが、本番環境への投入前に、これを使わずにCSPを適用するのは自殺行為に等しい。
攻撃者が試行している「バイパス経路」を可視化するためには、レポートエンドポイントの構築が必須だ。
// レポートを受け取るためのシンプルなエンドポイントの考え方
// 攻撃者の試行回数や、ホワイトリスト外のスクリプト読み込みをJSONで集計する
app.post('/csp-report', (req, res) => {
const report = req.body['csp-report'];
console.warn('CSP違反を検知:', report['blocked-uri'], report['violated-directive']);
// ここでアラートを飛ばす、またはSIEMにログを送る
res.status(204).end();
});
このログには、攻撃者がどのような手法で、どのパスを狙っているかの貴重な情報が含まれている。これを分析することで、自社アプリケーションの脆弱なエンドポイントを逆引きできる。これが、受け身ではない「攻めのセキュリティ運用」だ。
---
4. 最後に:耐量子暗号時代を見据えたアーキテクチャ
今後、耐量子暗号(PQC)への移行が議論される中、ブラウザのセキュリティモデルも根本から再定義されるだろう。しかし、CSPのような「実行制御」のロジックは不変だ。
コードを記述する際、常に以下の自問自答を行ってほしい。
- 「このスクリプトは本当に実行権限が必要か?」
- 「もし攻撃者がこのライブラリを乗っ取ったら、CSPで阻止できるか?」
セキュリティは、ツールを入れることではない。攻撃者の思考を先回りし、技術的制約をアーキテクチャに落とし込む「設計の思想」そのものだ。
君たちのコードが、明日、世界で最も洗練された攻撃を無効化する盾になることを願っている。現場からは以上だ。
コメント