<前の日記(2007年04月25日) 次の日記(2007年05月13日)> 最新 編集

高木浩光@自宅の日記

目次 はじめに 連絡先:blog@takagi-hiromitsu.jp
訪問者数 本日: 1601   昨日: 1376

2007年05月12日

ログイン成功時のリダイレクト先として任意サイトの指定が可能であってはいけない

これが「脆弱性」として合意されるかどうかわからなかったが、脅威と対策をまとめてIPAに届け出てみたところ、受理され、当該サイト(複数)は修正された。以下、この問題がどういうもので、どうするべきなのか、はてなのケースを例に書いておく。

4月にこんな話が盛り上がりを見せていた。*1

  • ソーシャルブックマークユーザーのIDとPASSをいとも簡単に抜き取る手口, ホームページを作る人のネタ帳, 2007年4月6日

    Bボタンフィッシングとは何?

    記事の最後には私のブログでもおなじみの、はてなブックマークへ追加ボタンや、バザールのブックマークボタン(Bボタン)を設置しているブログを最近良く見かける。何気なく私はそれを利用したりしている。(略)『あれ?セッションがきれたのかな』と思い、自分のIDとパスワードを入れてログイン。すると次の画面へ飛ぶ。(略)

    見事な流れにフィッシングに気づかなかった (略)

    よくよくはてなの画面を見るとURLが全然違う画面が一つだけある。それはログイン画面だ。(略)

どこかのブログに貼られた「B!」ボタンを(はてなブックマークに追加するつもりで)押したときに、はてなのログイン画面のようなものが出たら、それが偽サイトであってもIDとパスワードを入れてしまう人が続出するだろうという話だ。

言うまでもなく、こういうのは、パスワードを入れようとする際にその画面のアドレスバーの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の画面が出る。

はてなのログイン画面のキャプチャ画像
図1:罠リンクを踏んで本物のはてなのログイン画面にジャンプした様子

安全なWebサイト利用の鉄則に従いアドレスバーを見ると、確かに hatena.ne.jp ドメインの画面であるから、本物サイトであると確認できるので、ユーザ名とパスワードを入れて「ログイン」ボタンを押したとする。すると、図2の画面が一瞬だけ現れるが、すぐに図3の画面に自動的にジャンプする。

「ログインしています」と書かれた、はてなの画面のキャプチャ画像
図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風画像リンクの話はどうでもいい。「再生ボタンを押すとウィルスのダウンロードが始まる」というが、ダウンロードが始まることは何ら問題がない。キャンセルすればいいのだから。そもそも、この画像の貼られたページを見に行ったのなら、その時点で別の方法でダウンロード開始させることが可能なわけで、こういう画像が云々という話は全くセキュリティリテラシに関係がない。単に素人を面白がらせるだけの話で役に立たない。

本日のTrackBacks(全4件) [TrackBack URL: http://takagi-hiromitsu.jp/diary/tb.rb/20070512]

ログイン処理なんてほとんどのWebアプリケーションに必要だから、プログラマであれば簡単に作れると思われるかもしれないが、これが意外とあなどれない。初心者プログラマがやりがちな失敗から、最終的にどうあればいいのかを順を追ってみていこうと思う。 ■1. (レベル0)..

検索

<前の日記(2007年04月25日) 次の日記(2007年05月13日)> 最新 編集

最近のタイトル

2024年07月28日

2024年07月27日

2024年07月07日

2024年04月07日

2024年04月01日

2024年03月23日

2024年03月19日

2024年03月16日

2024年03月13日

2024年03月11日

2023年03月27日

2022年12月30日

2022年12月25日

2022年06月09日

2022年04月01日

2022年01月19日

2021年12月26日

2021年10月06日

2021年08月23日

2021年07月12日

2020年09月14日

2020年08月01日

2019年10月05日

2019年08月03日

2019年07月08日

2019年06月25日

2019年06月09日

2019年05月19日

2019年05月12日

2019年03月19日

2019年03月16日

2019年03月09日

2019年03月07日

2019年02月19日

2019年02月11日

2018年12月26日

2018年10月31日

2018年06月17日

2018年06月10日

2018年05月19日

2018年05月04日

2018年03月07日

2017年12月29日

2017年10月29日

2017年10月22日

2017年07月22日

2017年06月04日

2017年05月13日

2017年05月05日

2017年04月08日

2017年03月10日

2017年03月05日

2017年02月18日

2017年01月08日

2017年01月04日

2016年12月30日

2016年12月04日

2016年11月29日

2016年11月23日

2016年11月05日

2016年10月25日

2016年10月10日

2016年08月23日

2016年07月23日

2016年07月16日

2016年07月02日

2016年06月12日

2016年06月03日

2016年04月23日

2016年04月06日

2016年03月27日

2016年03月14日

2016年03月06日

2016年02月24日

2016年02月20日

2016年02月11日

2016年02月05日

2016年01月31日

2015年12月12日

2015年12月06日

2015年11月23日

2015年11月21日

2015年11月07日

2015年10月20日

2015年07月02日

2015年06月14日

2015年03月15日

2015年03月10日

2015年03月08日

2015年01月05日

2014年12月27日

2014年11月12日

2014年09月07日

2014年07月18日

2014年04月23日

2014年04月22日

2000|01|
2003|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|05|06|07|08|09|10|11|12|
2012|02|03|04|05|06|07|08|09|
2013|01|02|03|04|05|06|07|
2014|01|04|07|09|11|12|
2015|01|03|06|07|10|11|12|
2016|01|02|03|04|06|07|08|10|11|12|
2017|01|02|03|04|05|06|07|10|12|
2018|03|05|06|10|12|
2019|02|03|05|06|07|08|10|
2020|08|09|
2021|07|08|10|12|
2022|01|04|06|12|
2023|03|
2024|03|04|07|
<前の日記(2007年04月25日) 次の日記(2007年05月13日)> 最新 編集