検索
連載

間違いだらけの「かんたんログイン」実装法再考・ケータイWebのセキュリティ(2)(1/3 ページ)

“特殊だ”と形容されることの多い日本の携帯電話向けWebサイト。そこには、さまざまな思い込みや性善説の上しか成り立たないセキュリティが横行しています。本連載は、ケータイWebの特殊性をていねいに解説し、正しいケータイWebセキュリティのあるべき姿を考えます(編集部)

PC用表示 関連情報
Share
Tweet
LINE
Hatena

情報漏えい事故にもつながった「かんたんログイン」の問題

 第1回「『PCでは見えないはず』に頼ることの危険性」を公開してから今回まで、しばらく間が空いてしまいましたが、その間、携帯電話向けWebサイトをめぐってはいろいろな動きがありました。

 ざっと振り返ってみても、2010年夏モデルからソフトバンクの携帯電話でもJavaScriptが正式に対応となりましたし、2011年6月末からソフトバンクのゲートウェイ方式のSSLが廃止されることが決まりました。これらの動きはいずれも、セキュリティ上の影響を及ぼすものです。

 2010年10月には、宅配便大手の携帯電話向けサイトで「かんたんログイン」の脆弱性が原因となって個人情報1件が流出する事故が発生しました。

【関連記事】
クイックログインに“穴”、ヤマト運輸の携帯Webサイトに脆弱性(ITmedia News)
http://www.itmedia.co.jp/news/articles/1010/25/news044.html

 今回は、そのかんたんログインの問題点について説明します。

「契約者固有ID」を用いるかんたんログイン

 かんたんログインとは、携帯電話の「契約者固有ID」を用いたログイン手法です。

 第1回で説明したように、携帯電話のブラウザのリクエストヘッダには契約者固有IDと呼ばれるIDを付けることができます。契約者固有IDは、携帯電話事業者によって詳細は異なりますが、すべての携帯電話事業者が対応しています。

図1 リクエストヘッダに含まれるiモードID(契約者固有ID)
図1 リクエストヘッダに含まれるiモードID(契約者固有ID)

 図1は、NTTドコモの携帯電話がサポートしている契約者固有IDである「iモードID」がサーバに送信される様子です。この情報は、ユーザーがそれと意識することなく送信されます。携帯電話のかんたんログインとは、契約者固有IDのみを用いて認証を行い、ログイン機能を実現することです。

 かんたんログインは、ベーシック認証のようにIDとパスワードを管理する必要もなく、Cookieのように対応する端末を考慮する手間がいらず、ワンタイムパスワードなどに比べ追加コストもほぼ不要なことから、携帯電話向けWebアプリケーション(ケータイWeb)で広く利用されています。しかし、安易な実装によってセキュリティ上の問題を引き起こすことも事実です。

 そこで今回は、A社が提供する「グダグダSNS」という架空のSNSサイトを舞台にかんたんログインの問題点を説明し、最後に実施可能な対策を紹介します。この例を読んでいただければ、脆弱性の指摘を受けるたびに場当たり的に対処することの危険性がお分かりいただけると思います。

ネットを参考に「かんたんログイン」対応したものの……

 A社は「グダグダSNS」サイトを携帯電話に対応させることを決め、かんたんログインもサポートすることにしました。しかしA社はそれまでかんたんログインを実装した経験がありませんでした。

 そこでインターネットの情報などを参考に、「契約社固有IDを取得して、会員データベースと突き合わせて、登録されている場合はログイン成功と見なす」という以下のスクリプトを作成し、運用を開始しました(注意:この方法には脆弱性があります)。

$guid = '';
$carrier = '';
if ($_SERVER['HTTP_X_DCMGUID']) {           // NTTドコモの場合
$carrier = 'docomo';
$guid = $_SERVER['HTTP_X_DCMGUID'];
} else if ($_SERVER['HTTP_X_UP_SUBNO']) {   // auの場合
$carrier = 'au';
$guid = $_SERVER['HTTP_X_UP_SUBNO'];
} else if ($_SERVER['HTTP_X_JPHONE_UID']) { // ソフトバンクの場合
$carrier = 'softbank';
$guid = $_SERVER['HTTP_X_JPHONE_UID'];
} else if ($_SERVER['HTTP_X_EM_UID']) {     // イー・モバイルの場合
$carrier = 'emnet';
$guid = $_SERVER['HTTP_X_EM_UID'];
} else {
// エラー(携帯電話からのアクセスではありません)
} 
リスト1 かんたんログインの契約者固有ID取得部分(PHP言語)

「PCからなりすましログインできるんですが?」

 「グダグダSNS」のかんたんログインは順調に稼働しているように見えました。ところがある日、「別人になりすましてログインできてしまう」という指摘を受けたのです。

 攻撃手法の一例を紹介しましょう。PC上でFirefoxの「Modify Headers」というアドインソフトを用いて、「X-DCMGUIDヘッダ」(キャリアのゲートウェイからiモードIDを取得できる)を送信するよう設定を変更すると、ドコモユーザーになりすましできるというものです(画面1)。

画面1 Modify Headersを用いれば、X-DCMGUIDヘッダを送信するように設定を変更できる
画面1 Modify Headersを用いれば、X-DCMGUIDヘッダを送信するように設定を変更できる

 このような手法を用いてHTTPリクエストヘッダを指定すれば、実際にはPCからのアクセスであるにもかかわらず、サーバは携帯電話からのリクエストと判断して処理します。つまり、誰かが任意の利用者になりすまし、個人情報を盗み見るといったことが可能になるのです。

 PCを用いたHTTPリクエストヘッダ改変に対抗する手法として、携帯電話のゲートウェイのIPアドレスを確認し、携帯電話以外からのアクセスには応答を拒否するという方法があります。

 A社は当初、携帯電話事業者のIPアドレスの確認方法を知りませんでした。そこでまたもやインターネットで検索すると、親切にも設定済みの.htaccessファイルが紹介されていることが分かりました。A社は早速それをApacheに導入して、IPアドレス制限を掛けることにしました(注意:この方法は間違っています)。

.htaccess
Order Deny,Allow
Deny from all
# docomo
Allow from 210.153.84.0/24 210.136.161.0/24 210.153.86.0/24
...
リスト2 .htaccessへの変更

 .htaccess設定後にPCからもう一度接続してみると、画面2のように403エラーが表示されます。これでもう大丈夫だと判断しました。

画面2 403エラーが表示されるので一安心、と思ったが……
画面2 403エラーが表示されるので一安心、と思ったが……

 これで一件落着と思ったのですが……そうはいきません。

Copyright © ITmedia, Inc. All Rights Reserved.

       | 次のページへ
ページトップに戻る