« TwittPet復活のお知らせ « » 児童にイタズラした犯人の家から、児童ポルノやエロマンガが見つかるのはどうしてなのか、ちゃんと理論的に説明する。 »

2008年03月10日

 crossdomain.xmlの脆弱性の話が人気だけど、簡単に解説するよ!このエントリーを含むはてなブックマーク

ついったー足あと帳
このサイトを一昨日とかに見てびっくりした人も多いと思うんだけどcrossdomain.xmlの設定をあやふやにしておくと、ユーザーのセキュリティもあやふやになっちゃうんで、そこはWebサービスとしてはまずいよね?っていう話が話題。

Twitter の crossdomain.xml 問題について。 - てっく煮ブログ
crossdomain.xml と CSRF 脆弱性について - 川o・-・)<2nd life

だけども、てっく煮の中の人が言うように

このような「取得」のゆるさが理由で、Twitter API を活用したサービスを作る人が多発して、それがまた Twitter の人気を押し上げたのは事実。

という具合に、Webサービスのcrossdomain.xmlを全部厳しく(もしくはそもそも置かない)すればそれでいいかっていうと、それだとユーザーの自発的なサービスを潰しちゃってもったいないのです。
それで、今回の話を聞いて、え、よくわからない、とりあえずcrossdomain.xmlは危険なのね?みたいな流れになっちゃうと凄く面白くないと思うので、もう少しわかりやすく説明しておくよ。
もちろん完全にどうすれば大丈夫ってことは僕には言えないので、へぇ、そういう感じなのねーという理解の入り口のためだけだと思ってください。

そもそも、crossdomain.xmlって何よ?

crossdomain.xmlは、サーバーに置くファイルで、このファイルの内容でFlashがどのドメインからアクセスできるかどうか?を設定できるもの。
例えばこの設定を、全てのドメイン("*")にしてやると、誰でも自由にそこにあるデータを使ったFlashのサービスが作れて、とても便利なことになる。
Twitterもちょっと前まではこの設定になっていて、みんな自由に発言とかを拾ってきて表示するFlashとかを作っていたわけ。

何が問題だったの?

TwitterはAPI(誰かの発言を取ってくるとか)だけを公開するつもりだったんだろうけど、Flashって意外なほどいろんなアクセスができちゃう。
どれくらいできちゃうかっていうと、ユーザーがアクセスして表示される範囲は全部取得できるんだよね。

ちょっと具体的に見てみよう。
Twitterアカウントを持っている人は、以下のURLを踏むと、自分の最近の発言がXMLで表示されるはず。
http://twitter.com/statuses/user_timeline.xml
見れるということは、crossdomain.xmlで許可すれば、Flashで取得できる、ということ。TwittPetなんかは、この仕組みを使ってユーザーの発言をブログペット風に表示していたわけだ(今は偽proxyを使っている)
で、よく見ればユーザー名が書いてあったりしちゃって、早い話が今誰がサイトにアクセスしているか分かっちゃったりするんで、これをサーバーにアップロードでもして保存しておけば、Twitterの誰がサイトにアクセスしてきたかの履歴が作れるってわけだね。

まあこんなのは別にどうってことなくて、問題なのはこっちのURL。
http://twitter.com/account/settings
Twitterユーザーはアクセスするだけで、設定ページが開いたはず。(Cookieでユーザー認証したから)
で、見れるということは、crossdomain.xmlで許可すれば、Flashで取得できる、ということ。(普通のHTMLページも取得できる。)
で、凄くまずいことにこのページって、メールアドレスが表示されてるんだよね。
アクセスしてきたユーザーのメールアドレスを収集することができちゃうわけだ。

・・・というのが今回の一連の話。

ちなみに、いろんな人が気にしてた「もしかして、さらにユーザの設定を勝手に変えられるんじゃないの?」っていう話は僕も気になって、いろいろ試してたんだけど、なんか上手くいかなくて、あれ~?って思ってるうちにcrossdomain.xml修正されちゃって、分らなかったよ。
てっく煮の人によれば、ちゃんとブロックされてたってさ。

じゃあどうすればいいの?

crossdomain.xmlを置かないとか、対象ドメインを明確に設定するとかで大丈夫だけど、それだとユーザーの面白サービス(Amazonとか、フリッカーはいっぱいある)は生まれなくなっちゃう。

crossdomain.xml と CSRF 脆弱性について - 川o・-・)<2nd lifeでも紹介されているけど、crossdomain.xmlを許可しつつ、範囲を限定する一番簡単な方法は、別のサブドメインを用意してしまうこと。
別のサブドメインを作って、APIはそこで応答するようにする。
これだとクッキーも持ち越せないので、ログインユーザーだけに表示する情報をFlashに取られなくて済む
APIに関係ないページも取れなくなるしね。

で、同じく紹介されている別の方法で、一部ディレクトリ以下をcrossdomain.xml許可するというもの。
これだと、逆にクッキーを持ち越せて、ログインユーザーだけに表示する情報をFlashがとれるようになる。(もちろん、危険なAPIはここには置かない)
当然だけど、設定ページなんかは別に置いておくことで、普通のページは除外したままFlashにユーザーのデータを提供できる。

で、どっちがいいかっていうこともないんだけど、個人的に後者の方が楽しいことができると思うのです。
別に後者にしておいて、クッキー使ったAPI置かなきゃ前者と同程度だし。
もちろんどっちを使うかっていうのは自由なんだけど、僕としては世の中に面白いサービスがどんどん生まれてほしいから、偉い人たちは安全な範囲で、できる限りFlashにデータを取らせてくれると嬉しいなって思います。
ほら、日本の企業ってちょっと危険かもって思うと、ガチガチに塞いじゃうことがあるからさ。