Flashで任意のRefererヘッダーなどを送信可能を確認

こちらの内容をはるぷさんの「交差点の猫 - リファラーを 偽装するのよ Flashで」を元にして実験して確認しました。
その結果、作成したFlashコンテンツをWebに設置して、他のドメインに対して任意のRefererヘッダーを送信することができました。

再び、「@IT:「ぼくはまちちゃん」 ――知られざるCSRF攻撃」を修正

前回(高木先生からの今夜分かるSQLインジェクション対策への意見)で修正したばかりですが、新たな情報を得たため再度の修正です。二転三転ご迷惑をおかけします。

  • 修正前(2006年11月6日版)
リファラーで発信元をチェック
 HTTPリクエストを受けたとき、そのリクエストがどこのWebページから発行されたものかを示すリファラー(REFERER)と呼ばれる情報を得ることができる。この情報を活用し、本来意図したWebページ以外からのリクエストを拒否することで、CSRFによる外部からのリクエストを防ぐことができる。

 リファラー情報はリクエスト発信者が自由に発行できる情報であるため、偽装されることを懸念するかもしれない。しかし、CSRFの場合には踏んでしまった自分自身がリクエストを発信するので、自分自身でリファラー情報を偽装する余地はない。

 ただし、ユーザーがリファラー情報を出力しないブラウザを使っている場合、このチェックを導入すると正当な操作でも受け付けなくなってしまう。
  • 修正後
リファラーで発信元をチェック
 HTTPリクエストを受けたとき、そのリクエストがどこのWebページから発行されたものかを示すリファラー(REFERER)と呼ばれる情報を得ることができる。この情報を活用し、本来意図したWebページ以外からのリクエストを拒否することで、CSRFによる外部からのリクエストを防ぐことができる。
 ただし、ユーザーがリファラー情報を出力しないブラウザを使っている場合、このチェックを導入すると正当な操作でも受け付けなくなってしまう。

 懸念されるリファラー情報偽装に対する問題だが、以前はリファラー情報を発行するのは攻撃を踏んでしまった自分自身なので、リファラー情報を偽装する動機がなく、この対策は安全であるとされていた。しかし、Flashのアクションスクリプトを利用することでではRefererヘッダーを自由に作成できてしまうため偽装できてしまう。よって、この対策だけでは安全と言えなくなった。

追記(2006/11/08)

実験したFlash Playerのバージョンを書いてなかった。XP SP2に最初から入っていた Flash Player 6 (WIN 6,0,84,0)です。
はるぷさんは Flash Player 8、9で実験しているようです。
Refererに、HostやUser-Agentなどは上書きできました。この辺りはFlash Player 8と同じ挙動みたい。Cookieの上書きは、やり方がわからなかった。
アクションスクリプトの書き方が違ってるのかも。

追記(2006/11/16)

2006年11月14日にでたバージョン: 9,0,28,0でこの問題が修正されたようです。これまでの方法で試しても、Refererには、swfファイルのURLが出るようになりました。User-AgentやHostも同様に修正されて変更できなくなったようです。アップデートした方がよさそうですね。

追記(2007/1/15)

9,0,28,0での修正が完璧ではなかったようです。

追記(2007/7/12)

JVN#72595280: Flash Player において任意の Referer ヘッダが送信可能な脆弱性
以前直ったと思っていたら、相変わらず存在するようです。影響を受けるのはFlash Player 8.0.34.0 およびそれ以前だそうです。アップデートを実施するようにしましょう。