がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

MACアドレスでの認証があずましくない理由

UDIDの話は先日書いたわけなのですが( http://d.hatena.ne.jp/gallu/20130415/p1 )。
そうすると次は「んぢゃMACアドレス」という話が耳に入りまして。


ってなわけで第二弾「MACアドレスでの認証やめれ」をお送りいたします(拍手@サクラの群れ)。
先に結論を書くと「UUIDv4使おう」になりますので、そのように認識をしつつ以下をご覧くださいまっしょ。
UDIDなんで一端「iPhoneの話」をしますが、Androidでも大して変わりゃしませんので、そのようにご認識いただきたく。


さて。
簡単に、MACアドレスを使うのを止めるべき理由は
・プライバシ(名寄せ)にまつわる問題
・クラックしやすいぢゃん問題
の2つになります。
ちと経緯的に「下の状況」が発生しているので、そちらをメインに話を進めさせていただきます。
プライバシ周りは、例えば「固有IDのシンプル・シナリオ( http://www.hyuki.com/techinfo/uniqid.html )」などを適宜ご覧ください。


MACアドレスによる認証ですが、一撃で屠ると
・長さが足りなくて簡単に墜とせる
で片付きます。で、ここが片付いちゃうと「他人になりすませる」ので、「認証が必要」なはずのPageで、それはもぉ心置きなく思う存分「ひゃっほい」出来るという事になります。


かみ砕いて。
上述が成立するには「他人の、かつ"サービスに登録されている、有効なMACアドレス"」をゲトる必要があります。


入手手段その1:無線LANネットワークの傍受等
MACアドレスは、適当に無線LANの一つも設置すれば「簡単に入手」できます。
「この人のアカウントを乗っ取りたい」ならともかく、「とりあえず有効なMACアドレスが欲しい」くらいなら、手段はぶっちゃけなんぼでも。
大分と古い記事ですが、こちらが参考になるかもしれません。
無線LANMACアドレス制限の無意味さがあまり理解されていない( https://takagi-hiromitsu.jp/diary/20071103.html )」


入手手段その2:総当たり(ブルートフォース)
MACアドレスアドレス空間は48ビット(281兆個)。
ただしベンダーIDは「このメーカ(iPhoneの場合、apple)である」というところで固定できるので、事実上24ビット(1677万)。ちなみにアップル社は現在、ベンダーIDを100個ほど持っているらしいってことは100程度しかバリエーションがない。
一端「ベンダーIDを1つ」と仮定して、1677万回で「全てのアドレス」へのチャレンジが出来る。秒あたり50アクセスすると、わずか93時間。
もちろん「可能性のあるあらゆるMACアドレス」を頑張れば93時間の100倍かかるわけなのだけど、実際にそこまで「恣意的にランダムにしている」とは考えにくく、おそらく「割とすぐに分かる規則性」が見て取れるので、つまり「そこそこ時間かければ」認証用MACアドレス、ゲットだぜ!! になる。


結論として、しゃれにならないくらい「弱い」。
ちなみに「hash化したら」というのは常に耳にする愚考で。ンなもんは「レインボーテーブル」作れば終わる。以上。
入り口で入ってくるデータ(MACアドレス)のアドレス空間が狭いんだから、ナニやったって無理。


ちなみにUUIDv4は128ビット。一部「バージョン番号とかで固定部分があるから実質、ランダムなのは122ビット」って話も書いてあったのですが、エビデンスは取れず。
まぁ短い方がよいので、一端「122ビット」で考察をしてみましょう。
アドレスの個数(範囲)は5.3169e+36。…えっと…日本の表記で「5.3澗」。
澗ってなによ?って話なのですが。
万、億、兆、京、垓、じょ(漢字でない…)、穣、溝、澗、という並びの、澗。
数字で書くと、こんな桁。…多分あってると思うけど、数えてミスがあったら突っ込んでちょw
5,316,900,000,000,000,000,000,000,000,000,000,000
…気が遠くなりそうな桁だ(苦笑


MACアドレスで「百時間未満」程度で出来た力技アタックですが。…桁数多すぎて計算できませんが、確か記憶が間違いなければ、億年単位くらいかかったような。
まぁ普通の用途なら「100年かかる」くらいの強度があれば大丈夫だと思いますので、強度的には「十二分」かと思われます。


上述のような理由があるので。
「間違っても」MACアドレスを認証に使おう、とか思っちゃいけません。
UUID、iPhoneならそんなに苦労なく使えるはずなので、ちゃんと素直に、UUIDのv4を、適切な疑似暗号ロジック使って、生成しましょう。