ウェブサービスAPIにおける『成りすまし問題』に関する一考察
2007.06.06
先週の末に、はてなのウェブ・サービスAPIを使ったMash-upアプリをFlash上で作り始めていきなりつまずいたのが、Cross-Domainセキュリティ。satoshi.blogs.comから取得したswfファイル上のActionScriptからb.hatena.ne.jp下にあるRSSフィードだとかXML-RPCにアクセスができないのだ。
「確か方法があったはず」と調べてみると、はてな側がサーバーにcrossdomain.xmlというファイルを置いて明示的にCross-Domainアクセスを許可していなければならない、という。そこで見つけたのが、「Flashから各APIの操作、データのロードができるよう、サーバ上に「crossdomain.xml」というポリシーファイルの設置をお願いしたい。」というはてなアイデアへのリクエスト。2006年の2月にリクエストが出されているのだが、11月に「セキュリティ上の理由から却下させていただきます。」と却下されている。
こうなると普通の選択枝としては、(1)あきらめる、(2)自分のサーバーにproxyを作る、の二つがあるのだが、「普通のこと」をすることが嫌いな私としては、(3)なんとかはてなを説得できないものか、と色々と考えてみた。
はてなが、crossdomain.xmlファイルを置いてで任意のサイト(domain="*")から取得したswfファイルからのCross-Domainアクセスを許可できないのは、そのアクセスがエンド・ユーザーのコンテキストで行なわれてしまうからである。それを許可してしまうと、ユーザーが非公開にしているブックマークのリストを他のサイトに送られたり、別のサイトにアクセスしているときにはてなユーザー名を知られてしまったり、という危険があるのだ。
はてなは、ユーザーへの便宜を考え、b.hatena.ne.jp, d.hatena.ne.jp などの複数のはてなのサービスにまたがったクッキーを"hatena.ne.jp"向けに発行し、そのレベルでのセッション管理をしている(だからb.hatena.ne.jpからログインしたユーザーがd.hatena.ne.jpに移動しても再度ログインする必要がないのだ)。ここで問題となるのは、RSSフィードやXML-RPCも同じhatena.ne.jpドメイン下に置かれている点である。そのため、ブラウザーがこれらのウェブ・サービスAPIにアクセスするときには、hatena.ne.jpに発行されたクッキーが送信されてしまうし、はてなサーバーもそのクッキーを見て、ある特定のユーザーからのアクセスとみなしてしまうのだ。
こんな状態のまま、はてながcrossdomain.xmlというポリシーファイルを置いて、他のドメインから取得したswfファイルにCross-Domainアクセスを許可してしまうと、悪意を持ったサイトに置かれたswfファイルが、はてなユーザーに成りすましてウェブ・サービスAPIにアクセスして、そのユーザーしかアクセスできないデータを取得して別のサイトに送ってしまう、などのことができてしまうのだ。
これが、はてなは「セキュリティ上の理由からcrossdomain.xmlファイルを置かない」ことを決めた理由だが、そこで私の頭に浮かんだのは、「なんでそもそも『成りすまし』をされる危険があるhatena.ne.jpドメイン上にウェブ・サービスAPIを公開しているのか?」という素朴な疑問である。
もし「ユーザーに成りすましてのウェブ・サービスAPIへアクセスは絶対に禁止したい」のであれば、そういったウェブ・サービスAPIをユーザー向けのサービスと同じhatena.ne.jpドメイン下に置かずに、別のドメイン下(例えばhatena-api.ne.jp)に置けば良いだけの話ではないか、と思える。そうして置けば、万が一ハッカーがCross-Domainセキュリティの壁をすり抜けてアクセスしてきたとしても、そもそもドメインが違うのでブラウザーがhatena.ne.jp向けに発行されたクッキーを送ったりしないので、「はてなユーザーに成りすます」ことはできない。
つまり、具体的には、現在b.hatena.ne.jp/xmlrpcという(ブラウザーがクッキーを送ってしまう)URIを通して提供しているウェブ・サービスAPIを、b.hatena-api.ne.jpのような全く別のドメイン上で提供することにより、「はてなユーザーへの成りすまし」を100%不可能にした上で、crossdomain.xmlファイルをルートに置いて、他のサイト上に置かれたswfファイルからのCross-Domainアクセスを許可するというのがエレガントな解決策だと思うのだがいかがだろう?
とりあえずハッカーよりもクラッカーって言ってほしいです。
Posted by: はやし | 2007.06.06 at 17:41