トップ 最新

ただのにっき

2014-02-07(金) [長年日記]

数字6桁の暗証番号が危険なのは総当りで簡単に解かれてしまうから、というわけではない

JALマイレージバンクの不正アクセスが発覚して数日、いろんな人の意見を読んでいるのだけど「数字6桁の暗証番号*1は今どきのPCなら総当りでもすぐに解けてしまうから脆弱だ」という意見がみられて、それはまぁそうなんだけど、今回のような事件に関しては適切な表現ではないと思う。

ちなみに、'000000'から'999999'までバカ正直に順番にMD5を計算し、結果を別途計算してあった正解と比較するプログラムを実行すると、手元の環境ではたった1.5秒しかかからない*2。それでもJMBの会員2700万人分を計算すると450日余りかかることになるが、これだって今どきならクラウドで100コア分調達すれば4日ちょいで解ける計算だ*3

じゃあやっぱり総当りで解けちゃうから危ないじゃんと思うかも知れないが、この計算が成り立つには「別途計算してあった正解」が手元にあることが前提だ。つまりどういうことかというと暗証番号のハッシュを含めた会員データが漏洩しているということを意味する。これはもうとんでもない事件なわけで「暗証番号の変更を呼びかけ」なんてのんびりやってる場合じゃない、(JMB側で)漏洩ルートを閉じた上で即座に暗証番号を強制リセットすべき案件だ。類似の事件として最近ではAdobeの事件Yahoo! Japanの事件がある。いずれも漏洩が判明したのちすぐにパスワードを(サービス側で)リセットしている。これをやれば犯人の手元にあるデータは無効になるのでとりあえず安心できる*4

JMBがこれらの事例にならって暗証番号をリセットしていないのは、今回の事案がデータの漏洩を伴っているわけではないと判断しているからだ*5。犯人の手元に暗証番号のハッシュがないということは、CPUにものを言わせて力技で解くのではなく、1件ごとにJMBのWebサーバに問い合わせて、その暗証番号が正しいかどうかを確認しなければならない。ローカルでは100万分の1秒で試せた行為が、この状況では1秒近くかかってしまう。先ほどの数値をすべて100万倍すれば、この攻撃が現実的でないのはすぐにわかるだろう。

じゃあ実際にはどんな攻撃が行われたの? という解説をしようと思っていたんだけど、先に徳丸さんが解説を書いてくれたので、ぜひとも読んでもらいたい。これね、もう本当にすばらしくわかりやすいです。

というわけで、少なくとも今回の事件に関しては「総当たり攻撃に弱いから」数字6桁の暗証番号が危険というわけではないとわかったと思う。徳丸さんの記事にも出てきたが、数字6桁だと同じ暗証番号を持つ会員が2700万人のうち数十人いると期待できる*6、つまりオンラインのリバースブルートフォース攻撃がとても効率的になってしまう点が問題なのだ。

さらに言えば、ユーザ側の工夫でこれを避けることができない点が問題だ。例えば英数字と記号を使った数十文字からなるパスワードを使えるようになっていれば、ユーザが十分に複雑なパスワードを使うことでリバースブルートフォース攻撃を簡単に無効にできる。数字6桁という制約の中ではこういう工夫がほとんどできない*7。サービス提供者はこのようにユーザが自身の工夫でリスクを回避する手段を奪わないよう、気を配って欲しいものですね。

こちらからは以上です。

Tags: security

*1 パスワードと呼ぶにはあまりにアレなので暗証番号と呼ぶべきだろう。

*2 VirtualBox上のLinux、ruby 2.1を利用、並列実行なし。

*3 ちなみにANAは4桁なのでPC1台あれば十分である。

*4 言い換えると「オフラインの総当たり攻撃に対抗するにはパスワードリセットが有効」ということになる。

*5 もちろん調査が進むにつれてそういうことが判明する可能性はある。

*6 人は覚えやすい暗証番号をつけたがるはずなので実際はこの数倍から数十倍の率になるだろう。今回の被害者が数十人ということは、この事件の試行回数は想像以上に少ない可能性がある。

*7 逆に言えば十分に複雑なパスワードを指定可能な環境でわざわざクラックされやすい簡素なパスワードをつけていたら、それはユーザ側の責任だ。