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-age
、s-maxage
、public
、private
などのディレクティブを適切に設定する。 - 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
- HTTP caching: https://developer.mozilla.org/ja/docs/Web/HTTP/Caching
- RFC 7234: Hypertext Transfer Protocol (HTTP/1.1): Caching: https://datatracker.ietf.org/doc/html/rfc7234
この解説記事が、脆弱性理解の一助となれば幸いです。