CSP: Header & Meta

概要

  • 脆弱性の名前: CSP: Header & Meta (コンテンツセキュリティポリシー:ヘッダーとメタ)
  • どんな問題か: WebサイトでContent Security Policy (CSP) がHTTPヘッダーとHTMLのmeta要素の両方で定義されている状態。
  • よくある発生シーン: CSPを導入する際に、設定方法を誤って両方で定義してしまう。レガシーなシステムで、meta要素でのCSP設定が残っている。

背景

  • 問題視されるようになった背景: CSPは、Webサイトのセキュリティを向上させるための重要な仕組みですが、設定方法によっては意図しない動作を引き起こす可能性があります。HTTPヘッダーとmeta要素の両方でCSPを設定すると、ブラウザの挙動が予測しにくくなり、セキュリティポリシーが正しく適用されない場合があります。
  • クラウド設計や設定ミスによる実例: クラウド環境でWebアプリケーションを構築する際、ロードバランサーやCDNの設定でHTTPヘッダーにCSPが設定され、アプリケーション側でもmeta要素でCSPを設定してしまうことがあります。

セキュリティ上のリスク

  • どんな攻撃に悪用されるか:
    • ポリシーの不整合: HTTPヘッダーとmeta要素で異なるCSPを設定した場合、ブラウザはどちらか一方のポリシーを適用するか、両方のポリシーをマージしようとします。しかし、その挙動はブラウザによって異なるため、意図しないセキュリティホールが生じる可能性があります。
    • XSS攻撃: CSPが正しく適用されない場合、XSS攻撃のリスクが高まります。攻撃者は悪意のあるスクリプトを注入し、ユーザーのブラウザ上で実行させることができます。
  • 実被害が出た具体的なインシデント: 具体的なインシデントは特定できませんでしたが、CSPの設定ミスにより、Webサイトが改ざんされた事例が報告されています。

対処方法の具体例

Apache2での対処

# .htaccess
<IfModule mod_headers.c>
    # HTTPヘッダーでのみCSPを設定する
    Header set Content-Security-Policy "default-src 'self'"
</IfModule>

Nginxでの対処

# nginx.conf
http {
    server {
        # HTTPヘッダーでのみCSPを設定する
        add_header Content-Security-Policy "default-src 'self'";
    }
}

PHPでの対処

<?php
// HTTPヘッダーでのみCSPを設定する
header("Content-Security-Policy: default-src 'self'");
?>

ベストプラクティス

  • CSPはHTTPヘッダーでのみ設定する: CSPはHTTPヘッダーでのみ設定し、HTMLのmeta要素での設定は避けてください。
  • CSPの設定を検証する: CSPの設定が正しく適用されているかどうかを、ブラウザの開発者ツールやCSP検証ツールで確認してください。
  • CSPのレポート機能を活用する: CSPのreport-uriディレクティブを設定し、ポリシー違反が発生した場合にレポートを受け取るようにしてください。

間違った設定例

<!-- HTMLのmeta要素とHTTPヘッダーの両方でCSPを設定する -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">
<?php
// HTTPヘッダーとmeta要素の両方でCSPを設定する
header("Content-Security-Policy: default-src 'self'");
echo '<meta http-equiv="Content-Security-Policy" content="default-src \'self\'">';
?>

正しい設定例

# .htaccess
<IfModule mod_headers.c>
    # HTTPヘッダーでのみCSPを設定する
    Header set Content-Security-Policy "default-src 'self'"
</IfModule>

検出方法

  • OWASP ZAPでの検出時の出力例: OWASP ZAPでは、HTTPヘッダーとHTMLのmeta要素の両方でCSPが設定されている場合、警告を表示します。
  • 手動での確認: ブラウザの開発者ツールを使用し、HTTPヘッダーとHTMLのmeta要素を確認し、CSPが両方で設定されていないかを確認します。

まとめ

  • 重要度: Low (CSPの設定方法によっては、セキュリティリスクが高まる可能性があります)
  • 運用チームや開発者が意識すべきポイント:
    • CSPはHTTPヘッダーでのみ設定する
    • CSPの設定を検証する
    • CSPのレポート機能を活用する
  • 再発防止の観点:
    • 開発者向けのセキュリティトレーニングを実施する
    • Webアプリケーションのセキュリティレビューを定期的に実施する
    • CI/CDパイプラインにCSPの設定を検証するツールを組み込む

補足資料リンクや参考URL

この解説記事が、脆弱性理解の一助となれば幸いです。