BREACH Attack on HTTP Compression
HTTP圧縮に対するBREACH攻撃
説明
この脆弱性は、サーバーがBREACH攻撃の影響を受けやすいことを示しています。この攻撃は、圧縮されたレスポンスのサイズを測定することで、暗号化されたHTTPSレスポンスから機密情報を抽出するためにHTTP圧縮を悪用します。
BREACH(Browser Reconnaissance and Exfiltration via Adaptive Compression of Hypertext)は、機密情報(CSRFトークン、セッションデータなど)とユーザー入力が同じ圧縮HTTPレスポンスに現れた場合に発生します。圧縮アルゴリズムは、機密情報に関する情報を明らかにする検出可能なパターンを作成します。
仕組み:
- 悪意のあるJavaScriptが、被害者のCookieを使用してターゲットサイトにリクエストを送信します
- 攻撃者はURLパラメータまたはフォームデータを介して推測を注入します
- 推測が機密情報の一部と一致すると、レスポンスの圧縮率が向上します(サイズが小さくなります)
- レスポンスのサイズを測定することで、攻撃者は機密情報を段階的に抽出します
要件:
- HTTP圧縮の有効化(gzip/deflate)
- HTTPレスポンスの本文にユーザー入力が反映される
- ユーザー入力と同じレスポンス内に機密情報が存在する
- 複数リクエストの許可
シナリオ例: Webアプリケーションは、ユーザーが提供した検索語とともに、JSONレスポンスにCSRFトークンを含めます。攻撃者は、CSRFトークンのパターンに部分的に一致するさまざまな検索語を使用してリクエストを作成し、圧縮されたレスポンスのサイズを観察して、トークン全体を徐々に抽出します。
攻撃は1分以内に何千ものリクエストを送信して機密情報を抽出する可能性があり、セッションハイジャック、CSRFのバイパス、および機密データの露出につながります。
推奨事項
BREACH攻撃を緩和するために、以下の戦略を実装してください:
主な緩和策:
-
機密ページのHTTP圧縮を無効にする - 機密情報を含むレスポンスに対してはgzip/deflateをオフにし、静的アセットのみを圧縮し、機密情報を含む動的コンテンツは圧縮しないでください。
-
ユーザー入力から機密情報を分離する - 機密データが、ユーザーが制御する入力と同じHTTPレスポンスに表示されないようにしてください。ユーザー入力をエコーしない機密操作には、別々のエンドポイントを使用してください。
-
リクエストごとに機密情報をランダム化する - 新しいCSRFトークンを頻繁に生成し、セッション識別子を定期的にローテーションして、攻撃者の機会の窓を制限します。
実装例:
# 機密のエンドポイントの圧縮を無効にします
location /api/csrf { gzip off; }
location /user/ { gzip off; }
# Flask: 圧縮ミドルウェアを無効にします
app.config['COMPRESS_MIMETYPES'] = []
# Django: MIDDLEWARE設定からGZipMiddlewareを削除します
MIDDLEWARE = [
# ... その他のミドルウェア、ただし以下は除く:
# 'django.middleware.gzip.GZipMiddleware',
]
追加の防御:
- 機密情報を含むレスポンスにランダムなパディングを追加してください。
- レート制限(ユーザー入力エンドポイントに対して1分間に10リクエスト)を実装してください。
- 潜在的な攻撃を示す不審なリクエストパターンを監視してください。
- ダブルサブミットCookieによるCSRF保護メソッドを使用してください。
リンク
標準
- SOC2_CONTROLS:
- CC_6_7
- CC_7_1
- CCPA:
- CCPA_1798_150
- GDPR:
- ART_32
- PCI_STANDARDS:
- REQ_4_1
- REQ_6_5
- REQ_11_3
- HIPAA_CONTROLS:
- SECURITY252
- SECURITY212
- SECURITY213