これが「脆弱性」として合意されるかどうかわからなかったが、脅威と対策をまとめてIPAに届け出てみたところ、受理され、当該サイト(複数)は修正された。以下、この問題がどういうもので、どうするべきなのか、はてなのケースを例に書いておく。
4月にこんな話が盛り上がりを見せていた。*1
Bボタンフィッシングとは何?
記事の最後には私のブログでもおなじみの、はてなブックマークへ追加ボタンや、バザールのブックマークボタン(Bボタン)を設置しているブログを最近良く見かける。何気なく私はそれを利用したりしている。(略)『あれ?セッションがきれたのかな』と思い、自分のIDとパスワードを入れてログイン。すると次の画面へ飛ぶ。(略)
見事な流れにフィッシングに気づかなかった (略)
よくよくはてなの画面を見るとURLが全然違う画面が一つだけある。それはログイン画面だ。(略)
どこかのブログに貼られた「B!」ボタンを(はてなブックマークに追加するつもりで)押したときに、はてなのログイン画面のようなものが出たら、それが偽サイトであってもIDとパスワードを入れてしまう人が続出するだろうという話だ。
言うまでもなく、こういうのは、パスワードを入れようとする際にその画面のアドレスバーのURLを見てドメイン名を確認することが鉄則であり、それでよい。どこから飛んだ場合であっても、常日頃からそれを徹底しておくべきである。
パスワードや個人情報、クレジットカード番号などを入力しようとするその直前に、次のことを確認し、確認できない場合は入力を中止します。
パスワード 入れるその前 URLチェック(字余り)
ところが、はてなのログイン画面には次の問題があった。(現在は修正されている。)
まず、正規の動作がどうなっているかというと、たとえば http://example.com/ をブックマークしようとするときは、次のURLにアクセスすることになる。
http://b.hatena.ne.jp/add?mode=confirm&title=&url=http://example.com/
このときに、はてなにログインしていない状態だった場合は、
ゲストさん、はてなブックマークへようこそ。この操作ははてなにログインしていただくことでご利用可能です。
という画面が出る。ここで、「ログイン」の部分のリンクをクリックしてジャンプすると、
https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fb.hatena.ne.jp%2Fadd%3Fmode%3Dconfirm%26 title%3D%26url%3Dhttp%253A%252F%252Fexample.com%252F%26is_bm%3D
へ移動し、ログイン画面となる。ここで、正しいユーザ名とパスワードを入力してログインが成功すると、
http://b.hatena.ne.jp/add?mode=confirm&title=&url=http%3A%2F%2Fexample.com%2F&is_bm=
に自動的にジャンプする(ログイン前の画面へ戻ってくる)ようになっている。すなわち、ログイン画面の /login というCGIプログラムのパラメータ「backurl」は、ログイン成功時に自動的にジャンプする先のURLとして使用されているわけだ。
しかし、このパラメータ「backurl」に任意のURLを指定するとどうなるか。つまり、例えば
https://www.hatena.ne.jp/login?backurl=http://takagi-hiromisu.jp/exploit
にアクセスした場合にログイン成功後どこへ飛ぶか。以前は、この指定された任意のサイトへジャンプする状態だった。(現在は修正されている。)
これがなぜ問題なのか。以下に、届出時に使ったデモの画面で示す。
phishing詐欺師が、どこかのサイトから以下のURLへの罠リンク(「B!」ボタンなどで)を仕掛けていたとしよう。
https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Ftakagi-hiromitsu.jp%2Fsecurity%2Fvuln-info%2F 20070408-hatena%2Flogin.html
これにアクセスすると図1の画面が出る。
安全なWebサイト利用の鉄則に従いアドレスバーを見ると、確かに hatena.ne.jp ドメインの画面であるから、本物サイトであると確認できるので、ユーザ名とパスワードを入れて「ログイン」ボタンを押したとする。すると、図2の画面が一瞬だけ現れるが、すぐに図3の画面に自動的にジャンプする。
ここで、一瞬現れた図2のことを気に留めることなく、図3の画面を見たならば、「パスワードの入力を間違えてしまった」と普通は認識するだろう。そして、もう一度ユーザ名とパスワードを入れてしまう。
しかし、図3のアドレスバーを見るとわかるように、これは偽サイトである。
さて、どうだろうか。どこのサイトでも、ログイン画面でパスワードを打ち間違えると、このように「ユーザ名またはパスワードが違います」というメッセージが出るようになっているものだが、打ち間違えて再度パスワードを入れるその都度、毎回アドレスバーのURLを確認しなければならないのだろうか?
それを「安全な利用の鉄則」とするのは、さすがに酷な話だ。
これは、「backurl」に信頼されていない任意のURL(はてな以外のサイト)を指定できてしまうことが誤りであり、はてなのこの仕組みの方を修正するべきであると考えた。
現在は、はてな以外のサイトを「backurl」に指定すると、(ログイン成功時に)はてなトップページへジャンプするように修正されている。
ちなみに、Yahoo! JAPANの場合は、以前から対策されていたようで、「backurl」相当のパラメータにYahoo! JAPAN以外のURLを指定してアクセスするとその時点で、
お客様がご覧になろうとしているページは、
Yahoo! JAPANのサービスではありません。以下の可能性が考えられます。
・Yahoo! JAPANを装うウェブページに掲載されている偽のリンクをクリックしてしまった。
・メールや掲示板などに掲載されている偽のURLをクリックしてしまった。
・直接URLを入力した際に誤ったURLを指定してしまった。
(略)
というエラー画面が出るようになっていた。
はてな以外にも、私の知る範囲で同様の問題のあるサイトがあったので、IPAに届け出たところ修正された。
あるサイト(現在は修正済み)では、図2相当の画面が存在せず、正しいパスワードを送ると直接図3相当の画面が出るようになっていた。この場合はより騙される危険が高いだろう。
もし他にもこの問題を抱えているサイトがあった場合、そのようなサイトを使う利用者は、次のことが回避策となる。
回避策: パスワード入力ミス後の再入力の画面も含めて、常にいかなる場合も、パスワード入力の際には画面のアドレスを確認する(再確認する)。
*1 1つ目のYouTube風画像リンクの話はどうでもいい。「再生ボタンを押すとウィルスのダウンロードが始まる」というが、ダウンロードが始まることは何ら問題がない。キャンセルすればいいのだから。そもそも、この画像の貼られたページを見に行ったのなら、その時点で別の方法でダウンロード開始させることが可能なわけで、こういう画像が云々という話は全くセキュリティリテラシに関係がない。単に素人を面白がらせるだけの話で役に立たない。
ログイン処理なんてほとんどのWebアプリケーションに必要だから、プログラマであれば簡単に作れると思われるかもしれないが、これが意外とあなどれない。初心者プログラマがやりがちな失敗から、最終的にどうあればいいのかを順を追ってみていこうと思う。 ■1. (レベル0)..