Content Security Policy (CSP) Report-Only Header Found

概要

  • 脆弱性の名前: Content Security Policy (CSP) Report-Only Header Found (CSPレポートオンリーヘッダー検出)
  • 問題の要点: Content-Security-Policy-Report-Only ヘッダーのみが設定されており、実際のポリシーが適用されていないため、XSS攻撃などのリスクを軽減できない状態。
  • よくある発生シーン: CSPの導入初期段階やテスト環境で、ポリシーの効果を検証するために使用されることが多い。本番環境への移行時に、ヘッダーが Report-Only のままになっている場合に発生しやすい。クラウド環境では、設定ファイルが複数存在し、本番環境用の設定が誤って Report-Only になっていることがあります。

背景

CSP (Content Security Policy) は、Webページが読み込むことができるリソースの出所を制限することで、XSS攻撃などのリスクを軽減するセキュリティ機能です。CSPは、HTTPレスポンスヘッダーで設定します。
Content-Security-Policy ヘッダーは、ポリシーを強制的に適用し、違反があった場合にブラウザにリソースの読み込みをブロックさせます。一方、Content-Security-Policy-Report-Only ヘッダーは、ポリシーを適用せずに、違反があった場合にレポートを送信するだけです。
Report-Only ヘッダーは、CSPの導入初期段階で、ポリシーがWebサイトに与える影響を評価するために使用されます。しかし、本番環境で Report-Only ヘッダーのみが設定されている場合、ポリシーは適用されず、セキュリティ上のリスクが残ります。

セキュリティ上のリスク

  • XSS攻撃の防御が不完全
  • 不正なリソース読み込みの許可
  • インラインスクリプトの実行
  • データ漏洩の可能性
  • クリックジャッキング攻撃の可能性

対処方法の具体例

Apache2での対処

# .htaccess
Header set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';"

Nginxでの対処

# nginx.conf
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; frame-ancestors 'none';" always;

WordPressでの対処

// functions.php
add_action('send_headers', function() {
    header("Content-Security-Policy: " .
        "default-src 'self' *.wordpress.com; " .
        "script-src 'self' 'unsafe-inline' *.wp.com; " .
        "style-src 'self' 'unsafe-inline' *.wp.com; " .
        "img-src 'self' data: *.wp.com; " .
        "frame-ancestors 'none';"
    );
});

PHPでの対処

// 完全なCSPヘッダーの設定
header("Content-Security-Policy: ".
    "default-src 'self'; " .
    "script-src 'self' 'nonce-" . base64_encode(random_bytes(16)) . "'; " .
    "style-src 'self'; " .
    "img-src 'self' data:; " .
    "frame-ancestors 'none'; " .
    "form-action 'self';"
);

// 違反レポートの処理
function handleCSPReport() {
    $report = file_get_contents('php://input');
    $json = json_decode($report, true);
    error_log('CSP Violation: ' . json_encode($json['csp-report']));
}

検出方法

OWASP ZAP での出力例

  • Alert 名: Content Security Policy (CSP) Report-Only Header Found
  • リスク: Information
  • URL: Content-Security-Policy-Report-Only ヘッダーが設定されているURL
  • パラメータ: なし
  • 詳細: Content-Security-Policy-Report-Only ヘッダーのみが設定されており、Content-Security-Policy ヘッダーが設定されていないという情報

手動再現例

  1. Webブラウザの開発者ツールを開き、Networkタブを選択します。
  2. Webサイトにアクセスし、HTTPレスポンスヘッダーに Content-Security-Policy ヘッダーが存在しないことを確認します。
  3. curl コマンドを使用して、HTTPレスポンスヘッダーを確認します。
curl -I https://example.com

まとめ

  • CVSS 基本値: 4.0 (Medium)
  • 運用チームや開発者が意識すべきポイント:
    • 本番環境では、Content-Security-Policy ヘッダーを設定し、Content-Security-Policy-Report-Only ヘッダーのみが設定されていないことを確認する。
    • CSPの導入初期段階では、Content-Security-Policy-Report-Only ヘッダーを使用して、ポリシーの影響を評価する。
    • CSPのポリシーを適切に設定し、XSS攻撃などのリスクを軽減する。
    • 定期的にWebサイトのセキュリティ診断を実施する。
  • 再発防止:
    • 開発プロセス全体でセキュリティを考慮する (Security by Design)。
    • コードレビューを実施し、CSPヘッダーの設定が正しいことを確認する。
    • 自動脆弱性診断ツールを導入し、定期的にスキャンを行う。
    • CSPに関するポリシーを策定し、遵守する。
    • 設定管理ツール(IaC)を導入し、設定の一貫性を保つ。

補足資料・参考 URL

以上の対策と検出方法を活用して、Content Security Policy (CSP) Report-Only Header Found のリスクを低減してください。