Re-examine Cache-control Directives

概要

  • 脆弱性の名前: Re-examine Cache-control Directives (Cache-Controlディレクティブの再検討)
  • どんな問題か: Webサーバーが返すHTTPレスポンスヘッダーのCache-Controlディレクティブの設定が不適切であるために、機密情報がキャッシュに保存されたり、意図しないキャッシュ動作が発生したりする状態。
  • よくある発生シーン: Webサーバーの設定ミス、CDN (Content Delivery Network) の設定ミス、アプリケーションのキャッシュ制御の不備。

背景

  • 問題視されるようになった背景: Webサイトのパフォーマンス改善のためにキャッシュが広く利用されている一方で、キャッシュの設定が不適切であると、セキュリティ上のリスクが生じるため。
  • クラウド設計や設定ミスによる実例: クラウド環境でCDNを使用している場合、Cache-Controlディレクティブの設定が誤っていると、本来キャッシュすべきでない機密情報がCDNにキャッシュされてしまうことがある。

セキュリティ上のリスク

  • どんな攻撃に悪用されるか:
    • 情報漏洩: 機密情報を含むページがキャッシュに保存され、意図しないユーザーに情報が漏洩する可能性がある。
    • キャッシュポイズニング: 攻撃者がキャッシュサーバーに悪意のあるコンテンツをキャッシュさせ、ユーザーに誤った情報を提供することができる。
    • サービス妨害 (DoS) 攻撃: キャッシュの設定ミスにより、特定のコンテンツへのアクセスが集中し、サーバーが過負荷状態になる可能性がある。
  • 実被害が出た具体的なインシデント: 具体的なインシデントは特定できませんでしたが、過去には、ECサイトで顧客の個人情報がキャッシュに保存され、他のユーザーが閲覧できる状態になった事例が報告されています。

対処方法の具体例

Apache2での対処

# .htaccess
<FilesMatch "\.(html|htm|js|css)$">
    <IfModule mod_headers.c>
        Header set Cache-Control "no-cache, no-store, must-revalidate"
        Header set Pragma "no-cache"
        Header set Expires "0"
    </IfModule>
</FilesMatch>

Nginxでの対処

# nginx.conf
location ~* \.(html|htm|js|css)$ {
    add_header Cache-Control "no-cache, no-store, must-revalidate";
    add_header Pragma "no-cache";
    add_header Expires "0";
}

PHPでの対処

<?php
// キャッシュを無効化する
header("Cache-Control: no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: 0");

ベストプラクティス

  • 機密情報を含むページはキャッシュしない: Cache-Control: no-cache, no-store, must-revalidateを設定し、キャッシュを無効化する。
  • 適切なCache-Controlディレクティブを設定する: コンテンツの種類や重要度に応じて、max-ages-maxagepublicprivateなどのディレクティブを適切に設定する。
  • CDNのキャッシュ設定を確認する: CDNを使用している場合は、CDNのキャッシュ設定が適切かどうかを確認する。
  • キャッシュの有効期限を適切に設定する: キャッシュの有効期限が長すぎると、古い情報が表示される可能性があるため、適切な有効期限を設定する。

間違った設定例

# 機密情報を含むページをキャッシュする
Header set Cache-Control "public, max-age=3600"

正しい設定例

# 機密情報を含むページのキャッシュを無効化する
Header set Cache-Control "no-cache, no-store, must-revalidate"

検出方法

  • OWASP ZAPでの検出時の出力例: OWASP ZAPでは、Cache-Controlディレクティブの設定が不適切である場合に、警告を表示する。
  • 手動での確認: ブラウザの開発者ツールを使用し、HTTPレスポンスヘッダーを確認し、Cache-Controlディレクティブの設定が適切かどうかを確認する。また、curlコマンドを使用して、HTTPレスポンスヘッダーを確認することもできる。

まとめ

  • 重要度: Medium (キャッシュされる情報の種類やWebサイトの構成によって変動します)
  • 運用チームや開発者が意識すべきポイント:
    • 機密情報を含むページはキャッシュしない
    • 適切なCache-Controlディレクティブを設定する
    • CDNのキャッシュ設定を確認する
    • キャッシュの有効期限を適切に設定する
  • 再発防止の観点:
    • 開発者向けのセキュリティトレーニングを実施する
    • WebサーバーやCDNのキャッシュに関する設定を定期的に見直す
    • CI/CDパイプラインにキャッシュ設定の評価ツールを組み込む

補足資料リンクや参考URL

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