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, (^^ゞ