y-kawazの日記 このページをアンテナに追加 RSSフィード Twitter

Google

2007-02-24 携帯業界の認証事情

巡回サイトの一つである高木浩光@自宅の日記で以下のようなエントリーがあった。

高木浩光@自宅の日記 - 携帯電話向けWebアプリの脆弱性事情はどうなっているのか

ここではいつもの高木氏の口調で、「携帯向けWEBアプリ開発では未だにGETパラメータでセッションIDを渡しており、それはこれまでも何度もいかんことだと言っている。」というような内容が語られている。

確かにWEB+DBの記事に対して高木氏が注釈で言っているように「IPアドレスによる制限に関して書いていない」という点に関してはWEB+DB側の落ち度だと思う。実際これを行わない限り端末IDやユーザID*1による認証が意味をなさなくなってしまうからだ。*2

但し、キャリア毎にIPアドレス制限をする限りにおいては端末IDやユーザIDは偽装不可能*3なので、むしろ他人でも入力可能なパスワード認証よりも強力な認証かもしれません。逆にいえばその認証方法があるからこそ携帯業界ではクッキー無しでのセッション管理が可能になっていると言えます。

なので高木氏の以下の批判は的外れと言えるでしょう。

そもそも、「ID/パスワードを毎回入力するのでは携帯の場合では特に面倒です」などといって、端末IDをパスワード代わりにしてはいけない。端末IDは他のサイトにも同じものが送信されるのだから、パスワード代わりになどならない。

こんな基本的なことが携帯業界では未だ常識になっていないようで困ったことだ。

高木浩光@自宅の日記 - 携帯電話向けWebアプリの脆弱性事情はどうなっているのか

同じ値の端末IDが他のサイトにも送られたからと言っても、そのIDを他人が騙ることはできないのだから問題ないはずです。パスワード認証におけるパスワードの代わりにはなりませんが、パスワード認証に代わる認証になります。


ここで一応端末IDとユーザIDが偽装できない理由を書いておきます。

まず端末IDですが、

  • DoCoMoではformタグにutn属性を付けることでそのsubmitのリクエストにおいてUser-Agentに端末IDが付加されます*4
  • Softbankでは常にUser-Agentに端末IDが付いてきます。
  • AUでは端末IDに相当するものはありません。
  • そして偽装できない理由ですが、どのキャリアでも User-Agent により送信されるものであり、携帯端末のブラウザが User-Agent の偽装を許していない為です。
  • 携帯キャリア毎のIP制限を行っている限りにおいては携帯端末でアクセスしていることが保障されるはずなので端末IDは十分信頼がおけると言えます。

次にユーザIDですが、これはキャリア毎に送信方法が異なっているので個別に説明します。

  • まず、AUの場合は x-up-subno というHTTPヘッダにより送信されます。これは User-Agent と同様に携帯ブラウザが偽装を許していないことを理由に偽装が出来ません。
  • 次に、Softbankの場合は x-jphone-uid というHTTPヘッダにより送信されます。これも同じく携帯ブラウザが偽装を許していないことを理由に偽装が出来ません。
  • 最後にDoCoMoの場合ですが、HTTPヘッダでは無く uid という名前のCGIパラメータで送信されます。高木氏はこれを見てUIDもGETで渡すのなら意味がないではないか、と危惧していました。しかしこれは以下の2つの点で間違っています。
    • まずそもそも uid=端末ID というGETパラメータが使われることはありません。通常は uid=NULLGWDOCOMO というGETパラメータを利用することになっており、DoCoMoのゲートウェイプロキシがuidの値を本物のユーザIDに書き換えてコンテンツサイトに送っているだけなのです。なのでブラウザもuid=NULLGWDOCOMOという文字列のままのURLとして認識しているので仮にRefererが漏れてもNULLGWDOCOMOという文字列が漏れるだけです。
    • 次に、仮にユーザIDが漏れたとしても*5それを偽装することは出来ないということです。偽装が出来ないことはDoCoMo特有の(変な)仕様により保障されています。

uidの偽装不能な理由は口で説明するのも良いですが以下のような簡単な実証スクリプトにアクセスした結果を見た方が分かりやすいと思います。

<html><head><title>uid test</title></head><body>
uid=<?php echo htmlspecialchars($_GET['uid']) ?><br>
<a href="<?php echo $_SERVER['SCRIPT_URL'] ?>">1.</a>no param<br>
<a href="<?php echo $_SERVER['SCRIPT_URL'] ?>?uid=NULLGWDOCOMO">2.</a>uid=NULLGWDOCOMO<br>
<a href="<?php echo $_SERVER['SCRIPT_URL'] ?>?uid=1234567890ab">3.</a>uid=1234567890ab<br>
<a href="<?php echo $_SERVER['SCRIPT_URL'] ?>?uid=1234567890a">4.</a>uid=1234567890a<br>
<a href="<?php echo $_SERVER['SCRIPT_URL'] ?>?uid=1234567890abc">5.</a>uid=1234567890abc<br>
<a href="<?php echo $_SERVER['SCRIPT_URL'] ?>?uid=foobar">6.</a>uid=foobar<br>
<a href="<?php echo $_SERVER['SCRIPT_URL'] ?>?uid=">7.</a>uid=<br>
</body></html>

この結果は以下のようになります。

NOuidに指定した値実際に送信されてくる値
1パラメータ無し無し
2NULLGWDOCOMOユーザID
31234567890abユーザID
41234567890a1234567890a
51234567890abc1234567890abc
6foobarfoobar
7空文字空文字

つまり uid に12桁の文字列を指定した場合はそれがどんな値だろうと強制的に正しいユーザIDに書き換えられてしまうということです。

なので他人のuidを指定した場合は、それが正しいuidであれば12桁の筈なので強制的に自分のuidに書き換えられてしまうので他人のuidを騙ることはできないし、12桁でないuidの値は認証には使われるものではないので意味がありません。

携帯に関して言いたいことを纏めると以下のような感じかな。

  • 携帯の端末ID及びユーザIDは漏れても直接の問題はない。*6
  • キャリア毎のIP制限をしてあれば携帯の端末ID及びユーザIDは信用できる(偽装できない)*7
  • 携帯サイトの場合は以下の条件を満たせばセッションIDをGETパラメータに含めても良い。
    • キャリア毎のIP制限をした上で端末IDもしくはユーザIDを使って認証する。
    • 携帯用のセッションIDとPC向けのセッションIDは共有してはいけない*8
  • ゲートウェイのIPアドレス一覧情報など一般に公開されていないように思われる…。せめてIPアドレス一覧は公開してほしい。公開されてるようだ
  • 情報が少ないことにより正しい実装に関する議論が育ちにくい。
  • DoCoMoはやる気ないようだが、いい加減クッキー対応端末を出してほしい。
  • 携帯料金を安くしてほしい。
  • 実家が未だに電波通じないのを何とかしてほしい…。

追記)タイトル変更しました*9

追記)ユーザIDや端末IDの詐称可能性に関して別エントリーで追記あり。

*1:ここでは、端末IDが携帯のハードウェアである端末が持つIDで、ユーザIDはキャリアとの契約に対応するIDとして話します。(キャリア毎に呼び方が違うんだよな…)

*2:端末IDやユーザIDは簡単に漏洩するし(むしろ公開情報に近い)、一般にGETパラメータやUser-Agentは偽装可能だから。

*3:端末IDはスマートフォン等でゴニョゴニョすると偽装できる可能性があるようだ…。ユーザIDを使えということか。

*4:その際、端末IDを送信する旨のダイアログが表示されます。

*5:というかそもそもユーザIDはどのサイトに対しても同じ値が送られます。

*6:複数サイトの名寄せによる個人情報の漏洩の問題はある。

*7:偽装出来たとしたらそれは携帯端末かキャリアのゲートウェイの問題(バグ、脆弱性)であり、サイト側の責任ではない、…と思う。

*8:携帯のRefererでセッションIDが漏れた場合、それをPCブラウザで利用することでセッションハイジャックを許してしまうから。

*9:元々のタイトルは「珍しく間違った批判をしている高木先生」だったが単に情報まとめ的な意味が強い記事になってきたので。

BarBar 2007/02/25 20:58 ぼくも突っ込もうかと思ったけど、ひろみちゅ先生のようなスーパーハカーにとってソースIPアドレスは常に偽装されているものという前提なのかとおもた。

通り通り 2007/02/26 14:12 IPも偽装されうるし、UIDをすでに取得しているサービスがあって、
その中の人がそれを利用して他のサービスにアクセスする場合はどうなんですか?

y-kawazy-kawaz 2007/02/26 14:34 TCPでのIP偽装は簡単にできるものだと思えないのでそれはちょっと置いておいて、他人のUIDを取得してもそれを利用する(騙る)ことは少なくともドコモでは出来ないです、と本文に書いてあります。

通り通り 2007/02/26 16:21 的外れなことをいっていたらすみません。
ドコモで他人のUIDを取得しても利用できないのはUser-Agentを偽れないからというりかいでよろしいですか?
しかし、IPの偽装が知識がある人なら簡単にできたとして、さらに携帯からではなくPCからUser-Agentを容易に書き換えられるブラウザでアクセスした場合はどうなるのでしょうか?

あのーあのー 2007/02/26 17:51 高木さんの日記を素直に読めば、「IPアドレス制限をしないで、端末IDをパスワード代わりにしてはいけない」と書いてあるので、決して”的外れ”な事を書いてあるようには見えませんけど…?

y-kawazy-kawaz 2007/02/26 19:17 高木さんは「端末IDは他のサイトにも同じものが送信されるのだから」と書いていることから端末IDを「パスワード認証におけるパスワード」の代わりに使われると考えているようですが、端末ID(ユーザID)を使うことは「端末ID(ユーザID)認証」をすることであり「パスワード認証」は関係ないと言いたいのです。IPアドレス制限以前に論点がずれていると思うのです。

y-kawazy-kawaz 2007/02/27 13:23 あと、高木さんは端末IDとユーザIDをごっちゃに語っているぽいのも気になった。そもそもWEB+DBが言っている端末IDがどちらを指しているのかも引用部分からは曖昧なのだが…。

名無し名無し 2007/02/27 15:34 端末IDがパスワード認証と関係ないというのはどういうことですか?よくわかりません。
あと、端末IDとユーザーIDの区別がどう重要なのですか?

あのーあのー 2007/02/27 16:47 ご回答ありがとうございます。
注釈に、「(IPアドレスを確認すればそれで本当になりすまし不可能にできるのかは知らない。…(略))」と書いてあることからも、私は、”IPアドレスチェックをしない事を前提”に説明されているように思うのですが、読む人によって受け取り方が違うんですね。。
おっしゃりたい事は理解できています。ありがとうございました。

kaiyujinkaiyujin 2007/02/27 22:28 y-kawazさんの文章全体で気になる点が一点あります。
携帯電話は必ず同一人物が使用すると仮定していませんか?

”パスワード認証の代わりの認証になります。”
と書いておられますが、端末を勝手に使われた場合全部見れちゃうわけですよね。
データを他のサーバに置いているのに全てのデータが。
これはデータを外部に保管する意味が薄れるような。
PCでいったら、起動時のパスワードやらHDパスワードがかかっていない状態
と考えます。問題ないとは思えないのですがいかがでしょう?

y-kawazy-kawaz 2007/02/28 08:43 ID認証に関しては、携帯電話は必ず同一人物が使用することを前提に話しています。つまり「ID認証=携帯電話端末という物理鍵による認証」と同等という意識が必要だと考えています。「端末を勝手に使われたら全部見れてしまいます」というのは当然のことで、それは自宅の鍵は気軽に人に渡さずにキチンと管理しましょうというのと同じことです。なのでユーザとしては携帯サイトにおいては携帯端末が鍵と等しい意味を持つというよう啓蒙される必要があるのかもしれないですね。

質問質問 2007/03/02 01:27 勉強になります。一つ疑問なのは、このユーザID送信機能はハードレベルでの組み込みなのでしょうか。(そもそも携帯アプリの運用について無知なのですが、)将来的に勝手ブラウザなどが配布され、そこでHTTPヘッダに関してルーズなアプリが出回ると上記に関してまったく無効になると思うのですが、これは運用や端末の仕組み的にあり得ないことなのでしょうか。

y-kawazy-kawaz 2007/03/02 03:12 以下は僕の憶測であり実際のところは知りません。ユーザIDに関しては各キャリアのゲートウェイが行うもので、その正統性の保証も各キャリアが各種対策を施し続けて維持するモノだと思っています。ただ端末IDに関してはゲートウェイでは無く端末側が自主的に(各キャリアの通信仕様に則って)送信しているんじゃないかと思われるので今後海外製の端末やルーズなアプリが出回ることで詐称出来てしまう(キャリア側で制御しきれなくなってくる)んじゃないかなと思っています。なのでユーザIDは信頼して良く、端末IDは疑ってかかった方が良いのかな、というのが個人的な見解です。