読者です 読者をやめる 読者になる 読者になる

crossdomain.xml と CSRF 脆弱性について

crossdomain.xml を安易に設置すると CSRF 脆弱性を引き起こす可能性があります。というのも、ここ数が月、それなりの数の crossdomain.xml による CSRF 脆弱性を発見し(現在、それらのサイトでは対策がなされています)、まだまだ Web プログラマに脆弱性を引き起こす可能性がある、という考え方が浸透してないんじゃないか、と思ったので。
先月、Life is beautiful: ウェブサービスAPIにおける『成りすまし問題』に関する一考察にも crossdomain.xml について書かれてたのですが、その後もいくつかのサービスで crossdomain.xml を許可ドメインすべてにしているサービスがあったので、注意喚起としてエントリーに書き起こします。
自分も一年半ぐらい前は、crossdomain.xml を許可ドメインすべて ('*') にして設置しておくと、Flash からいろいろ操作できると便利だよね、とセキュリティについて何も考慮していませんでした。

さて、crossdomain.xml を設置して、安易に許可ドメインをすべてにすると、別ドメインからでも、第三者がそのユーザのブラウザの COOKIE を用いてアクセスが可能になってしまいます。つまり Flash(swf) からそのユーザになりすまして、GET/POST し放題な状態になります。ここで、たとえば /config などに設定情報が記載してあると、ユーザ情報を取得、といったことが可能になります。またランダムなキーを埋め込んでそれが同一なら POST 許可、という方法をとっているサイトでも、crossdomain.xml で許可している場合、最初に GET でランダムキーを取得してから POST することが可能なため危険です。
なので安易に crossdomain.xml を設置するのではなくて、実際に安全かどうかを確認してから設置することが必要です。安全かどうか解らない場合は設置しない方が良いでしょう。
たとえば flickr や amazon の場合は、API 用のドメインを用意して、そこに crossdomain.xml を設置することで問題を解決しています。また Lingr の場合は、http://lingr.com/api/crossdomain.xml と /api/ 以下に crossdomain.xml を設置することで、/api/* のみ、Flash からのアクセスを許可しています。これは /api/ 以下にはユーザの COOKIE などを利用した処理は一切行っていないため、安全というわけです。
というわけで、自分の作っているサービスに crossdomain.xml を設置している場合、もう一度セキュリティについて、考え直してみてはいかがでしょうか。

ちなみにはてなでは、現在 crossdomain.xml は設置していませんが、何らかの方法で Flash から APIRSS にアクセス可能にできたらなぁ、と思ってます。/api/* から mod_proxy でリダイレクトしたり、api な全く別ドメイン作ったり、いろいろな手段がありそう。