Skip to content

Instantly share code, notes, and snippets.

@mala
Last active October 29, 2019 00:35
  • Star 11 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save mala/8857629 to your computer and use it in GitHub Desktop.
Flashと特定ブラウザの組み合わせでcross originでカスタムヘッダ付与が出来てしまう問題が未だに直っていない話

2014-07-09 それぞれ修正されたのを確認したので追記します。

APSB14-17 で修正されたようです

筆者が把握している範囲で、最新版のFlash Playerを利用している場合に、(crossdomain.xmlもしくはユーザーの許可なしで)cross originでカスタムヘッダを付与する方法はありません。

Webサイト運営者は

  • 意図した通りのOriginヘッダが付いている
  • または カスタムヘッダが付与されている(same originからのリクエストか、CORS or crossdomain.xmlで許可されて無ければ不可)

ことを確認することで、(ブラウザやプラグインのバグが無い前提で) CSRF対策を行うことが出来ます。

古いバージョンのFlash Playerには、他にも任意コード実行を含む深刻な脆弱性を数多く抱えているため、アップデートが強く推奨されます。Webサイト運営者が古いFlash Playerに配慮したところで、利用者の安全性は高まりません。単にアップデート推奨しましょう。

修正されたため、以下、古いFlash Playerを使ってるユーザーを無視できない人向けの参考情報となります


この文章は2014-02-07に書かれました。あなたがこれを読むときには修正されているかも知れませんので注意してください。更新情報があったら追記するつもりですが、忘れてしまうかも知れません。

Firefoxのケース

カスタムヘッダがcross originで送信されてしまうのはセキュリティモデルに違反する、ということで

NPAPI(Netscape Plugin APIのことだよ)の拡張仕様が提案されて、Firefox4で実装された。

Chromiumのケース

一度修正されてenbug?

NPAPI(段階的に廃止しようとしてるやつだよ)からPPAPIへの移行で問題があったんじゃない?とのこと

navigateToURL, sendToURL + //example.com

navigateToURLに // で始まるURLを指定することでもカスタムヘッダ付与が出来てしまう。

http://127.0.0.1/ から //example.com にリクエストを投げると

//local.example.com:5000/ のような指定だと失敗した。ポート番号が付くとダメらしい。

影響と結論

  • Flashを使ってoriginヘッダなし、ユーザーに確認無し、カスタムヘッダ付与、のPOSTリクエストを飛ばすことが出来る
  • // の方が報告されたのは最近のようだが、リダイレクト使うケースは少なくとも公知になってから3年近く直ってない。
  • //の方は確実にFlash側の問題なので(//から始まるパスでcrossdomain.xmlをチェックしない) そう遠くないうちに直ると思う。
  • リダイレクトを使う方は長年放置されていたりenbugしていたり、NPAPIの仕様とセットなので時間がかかる可能性がある。
  • cross originでカスタムヘッダ勝手に付与出来ないはずという前提のCSRF対策(例: http://d.hatena.ne.jp/hasegawayosuke/20130302/p1 ) は現状Flashのバグを使うことで突破されてしまう。

また、認証がゆるふわだけどブラウザからはカスタムヘッダつけられないから専用クライアントからじゃないと設定変更できないよね、という前提のプロトコルがルーターとかプリンタとかで使われていた場合には勝手に設定変更される恐れがあります。これはGoogle Chromeのケースでも影響があります。chromeはoriginヘッダ付けてくれますが、余計なヘッダとみなして無視されるでしょう。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment