Hello there, ('ω')ノ
✅ フレームワークごとの区切り文字の違いに注目
URL中の区切り文字(デリミタ)の解釈は、フレームワークごとに異なる場合があります。 これにより、キャッシュとアプリケーションの間でURLの意味が分裂することがWeb Cache Deceptionの温床になります。
🎯 Ruby on Rails における .(ドット)の意味
Rails では、URL中のドット(.)をレスポンスフォーマット指定子として扱います。
| URL | Railsの解釈 | 結果 |
|---|---|---|
/profile |
HTML形式のプロフィールページを返す | ✅ 正常 |
/profile.css |
CSSフォーマッタで処理しようとするが存在しない | ❌ エラー返す |
/profile.ico |
.ico は未知のフォーマット → 無視されHTMLフォーマッタが使われる |
✅ プロフィール情報が返る |
⚠️ キャッシュ側の解釈とのズレ
多くのCDNやキャッシュは、.ico などの拡張子が付いたURLを:
静的なアイコンファイルとみなしてキャッシュ対象とする
💥 攻撃の成立パターン(Rails + CDNの例)
- 攻撃者が
/profile.icoというURLで被害者を誘導 - Railsは
.icoを無視して/profileを返す → 被害者のプロフィールがレスポンスに含まれる - CDNは
.icoを見て静的アイコンと判断 → そのレスポンスをキャッシュ - 攻撃者が同じURLを後から叩く → 被害者のプロフィールが表示される
✅ 試すべき拡張子一覧(Rails環境でのテスト)
| 拡張子 | 期待される挙動(Rails側) | 攻撃に利用できる可能性 |
|---|---|---|
.css |
CSSフォーマットと判断 → エラー | ❌ 不成立 |
.ico |
未知のフォーマット → 無視されHTML扱い | ✅ 成立しやすい |
.exe |
無視されることが多い → HTML扱いの可能性 | ✅ 条件次第で使える |
.pdf |
独自フォーマッタがなければHTMLにフォールバック | ✅ 試す価値あり |
✅ 実際の攻撃構築例
/profile.ico → 被害者に誘導してアクセスさせる
その後:
/profile.ico → 攻撃者がアクセスしてキャッシュされた被害者のプロフィール情報を取得
✅ まとめ
Ruby on Railsでは .拡張子 をフォーマット指定として扱いますが、キャッシュサーバーはファイルと認識してしまうため、誤って機密情報がキャッシュされる可能性があります。
| ポイント | 内容 |
|---|---|
| Railsは未知フォーマットをHTMLとして処理 | → .ico, .exeなどが狙い目 |
| CDNは拡張子で静的と判断して保存 | → キャッシュとアプリのズレ発生 |
| 被害者がアクセスするだけで機密情報が保存されてしまう | → 攻撃者が同じURLで取得可能 |
Best regards, (^^ゞ