Shikata Ga Nai

Private? There is no such things.

区切り文字の解釈のズレ(Ruby on Rails編)とWeb Cache Deceptionの脆弱性

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の例)

  1. 攻撃者が /profile.ico というURLで被害者を誘導
  2. Railsは .ico を無視して /profile を返す → 被害者のプロフィールがレスポンスに含まれる
  3. CDNは .ico を見て静的アイコンと判断 → そのレスポンスをキャッシュ
  4. 攻撃者が同じ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, (^^ゞ