「リバースブルートフォース攻撃」という言葉、恥ずかしながら聞いたことなかったので、勉強メモも兼ねて。
既報の通り、2月3日に日本航空ののマイル会員向けサイト「JALマイレージバンク」(以下JALマイル)に、何者かが不正にログインを行い、会員のマイルが盗まれる(他人のAmazonポイントに換金)という事件がありました。
2月4日時点では65人が被害に遭っている可能性があり、確認がとれた範囲では40人が被害に遭っているとのこと。
現在のところ犯人の攻撃手段は明らかにされていませんが、事件発生後真っ先に高木浩光氏が反応しています。
ガタっ、ついに来たか。
--
JALマイレージWebサイトに不正アクセス、約2700万人にパスワード変更を依頼 http://t.co/Uf1gWZ1FAY @nikkeibpITproさんから
— Hiromitsu Takagi (@HiromitsuTakagi) 2014, 2月 3
このツイートから始まる関連ツイートを見ていただくとわかるように、JALマイルは、最近流行のパスワードリスト型攻撃ではなく、いわゆる「リバースブルートフォース攻撃」を受けた可能性があるとのこと。
理由は、JALマイルの認証方式が、会員番号(7桁または9桁の数字)と、パスワード(6桁の数字)の組み合わせを使うものだからです。
高木氏はJALと、同様の認証方式を使うANAに10年以上前からこの種の攻撃の危険性があるのでシステムを改めるよう抗議(電凸)したり、本職の活動の方で啓蒙活動をしたり(安全なWebサイト設計の注意点 「6.パスワードを4桁数字にしない」)していました。
しかし、JALは2004年にパスワードの桁数を4桁から6桁に増やしただけでした。ANAは未だに4桁です。
流行りの「パスワードリスト攻撃」の場合
最近よく話題になるのは「パスワードリスト攻撃」です。これは、セキュリティの脆弱なサイトから攻撃または漏洩等で入手したユーザー名とパスワードのリストを使って、同じユーザー名とパスワードの組を他のサイトでも試すというもの。
ユーザー名とパスワードを使い回しにしている人は一定数いるので、リストが十分大きければ「当たり」を引くことができます。また、ユーザー1人につきパスワードは1回試すだけなので、パスワードを3回間違えてアカウントロック、みたいなことになって攻撃がバレる心配もありません。
この攻撃方法は特定の誰かを狙うのではなく、狙う相手は誰でもいい場合に有効です。転売目的で不特定の個人情報を得たり、換金可能なポイント等を盗んだり、あるいはさらなる犯罪に使うため他人になりすましたり、という場合です。
この攻撃の被害を受けた場合は、専らその責任はリストの漏洩元サイトにあり、パスワードを使い回しにするユーザー側の自己責任も若干ある、という具合で、この攻撃を受けたサイトの責任は問うのは難しいでしょう。
サイト側ができる対策は Google や Facebook などで導入されている「2段階認証」を導入することですが、Google でも Facebook でも2段階認証を強制にはしていません。ユーザーの利便性を損ないますし、ユーザー側で対策可能だからです。
JALマイル事件で「パスワードリスト攻撃」が使えない理由
パスワードリスト攻撃は「換金可能なポイント等を盗んだり」する目的で「狙う相手は誰でもいい」場合に有効なので、まさにJALマイル事件のようなケースで使われそうなものですが、JALマイルの場合はこの攻撃は困難です。
理由はJALマイルの独特な認証方式にあります。JALマイルでは、ユーザー名に相当するのがJAL側が発行した会員番号で、パスワードに相当するのが数字6桁の暗証番号です。一般的なWebサービスで使っている一般的なユーザー名・パスワードを使い回すことは不可能なのです。
高木氏はこんなことを言ってます。
予定していたブログのタイトルは「パスワードリスト型攻撃に最も強いのはズバリ航空業界」。昨今、他のサイトから流出したID・パスワードのリストを用いた不正ログイン被害が続発する中、その攻撃に最も強いのはANAとJAL。なぜならパスワードが他と共通じゃないから。というもの。
— Hiromitsu Takagi (@HiromitsuTakagi) 2014, 2月 3
もちろんこれは皮肉です。
もちろんそれは皮肉。それ以前に、いわゆる「リバースブルートフォース攻撃」で簡単に被害者が続出するわけで、その指摘は、10年以上前にANAとJALにメールと電話で私は抗議した。その後、JALは数字4桁から数字6桁に「改善」したが、ANAは何もしなかった。ええかげんにせえよという…
— Hiromitsu Takagi (@HiromitsuTakagi) 2014, 2月 3
高木氏が指摘する「リバースブルートフォース攻撃」の前に、一般に言われる「ブルートフォース攻撃」について検討します。
よくある「ブルートフォース攻撃」(パスワード総当たり)の場合
「ブルートフォース攻撃」は文字通り力わざの攻撃、つまり、パスワードの手がかりとなる情報なしで、とにかく数打ちゃ当たるで大量の認証を繰り返す攻撃方法です。よくあるのがパスワードの総当たりです。
ZIPファイルのパスワードに6桁の数字など付けようものなら、そのへんにあるフリーウェアであっという間に解読されてしまいますが、そこで使われているのがこの攻撃方法です。
JALマイルのパスワードにたった6桁の数字しか使えない(組み合わせは100万通り)ことから、よくある「ブルートフォース攻撃」、つまりパスワードの総当たりで突破されたのではないかと考える方もいるかもしれません。
しかし、JALマイルといえども、パスワードを数回も間違えれば一定期間アカウントロックするような仕組みはあるでしょうし、*1 アカウントロックが繰り返されれば攻撃が滞るだけでなく、攻撃があったことがユーザー本人やシステム管理者にばれてしまいます。
なので、60人以上のユーザーに対して気付かれずに認証に成功するまで攻撃を続けられるとは思えません。1人を狙い撃ちにするならゆっくり攻撃を続けることで気付かれずに突破できるかもしれませんが、今回は不特定多数がターゲットです。
ZIPファイルのパスワード破り(オフライン攻撃)では全然頼りない100万通りまでのパスワード制限ですが、Webサービスへの攻撃(オンライン攻撃)で、これだけの被害を出すほどのものではないように見えます。
しかし同じ「力わざ」でも、JALマイル事件のような「狙う相手は誰でもいい」場合なら、もっと効率のよい方法があります。それが、いわゆる「リバースブルートフォース攻撃」です。
いわゆる「リバースブルートフォース攻撃」の場合
いわゆる「リバースブルートフォース攻撃」*2 は、先に述べた「よくある」ブルートフォース攻撃とは逆に、パスワードではなく、ユーザー名の方を総当たりする攻撃方法です。これは「狙う相手は誰でもいい」場合で、パスワードの組み合わせに対してユーザーが十分多い場合に有効です。
JALマイルの場合、会員が2700万人、パスワードは100万通りですから、例えば適当なパスワードを1つに決めて、2700万人の会員番号に対して総当たりをかけると、パスワードの分布がランダムなら、確率的には27人ぐらいの「当たり」を引けるはずです。
この方法はパスワードリスト攻撃と同様で、ユーザー1人につきパスワードは1回試すだけなので、パスワードの間違いを繰り返すことによるアカウントロックに引っ掛かることはありません。
なお、パスワードを1つに決めることは必須ではありません。毎回ランダムなパスワードを使っても確率的には同じです。ありがちなパスワードのリスト(西暦2桁+日付4桁の組み合わせなど)から毎回ランダムに選んでいけば「当たり」を引く確立を高めつつ、アクセスパターンが不自然にならないように偽装できます。
「リバースブルートフォース攻撃」の実例
セキュリティコンサルタントの徳丸浩氏が、実際にあった GitHub へのリバースブルートフォース攻撃の事例を挙げていました。
これはいわゆるリバースブルートフォースアタックですが、防ぐのが非常に難しい。GitHubに対するアタックのようにIPアドレスを変えながら「ゆっくり」試行すると、閾値を用いた防御策の効果がない…
— 徳丸 浩 (@ockeghem) 2014, 2月 4
GitHubに対する「ゆっくりした」攻撃の説明はこちら GitHubに大規模な不正ログイン試行 | 徳丸浩の日記 http://t.co/bwxo2FubcU
— 徳丸 浩 (@ockeghem) 2014, 2月 4
徳丸氏の解説記事によると GitHub への攻撃では、
- アカウントあたり少ない試行で留めてアカウントロックを回避
- 4万のIPアドレスからの分散攻撃でIPアドレス単位のロックや監視を回避
- 試行の間隔をあけて「ゆっくり」攻撃することで試行回数によるロックや監視を回避
することで、一部のアカウントに対して不正ログインに成功していたそうです。ブルートフォースにはIPアドレス単位の監視やブロックで対抗できそうですが、実際にこのような分散攻撃で回避されています。
4万ものIPアドレスをどうやって調達したのかわかりませんが、おそらくスパム送信やDDoS攻撃等の犯罪に利用されているボットネットが流用されたのではないでしょうか。
JALマイル事件は「リバースブルートフォース攻撃」なのか?
もちろん今のところは不明ですし、疑問点も若干あります。
上の説明ではさらっと「2700万人の会員番号に対して総当たりをかける」などと書きましたが、会員番号が連番等ではなくてランダムに発行されていたら、攻撃は困難になります。JALマイルの場合会員番号は9桁なので総当たりの数は10億通りにふくれあがってしまい、バレないようにゆっくり攻撃して、あれだけの被害を与えるのは非現実的です。*3
犯人が何らかの方法で会員番号リストを入手したか、あるいは会員番号はランダムではなく何らかの規則性があって、犯人がそれ知って存在しない会員番号での試行を避ける工夫をしていたのかもしれません。
あるいはバレるの覚悟で一気に攻撃を仕掛けたのかもしれません。JALのWebサイトのページビューは月間2億だそうで、*4 相当の負荷に耐えられるようになっているでしょう。*5 攻撃を検知してもJALマイル側にはサービス停止ぐらいしか打つ手はないので、JALへの嫌がらせも兼ねた攻撃ならそれもあり得なくはないです。
いずれにせよ、
- パスワードリスト攻撃はありそうにない。
- パスワード総当たりもありそうにない。
- メールサーバー乗っ取り + パスワードリセット攻撃は難しい。
- JALマイルのパスワードリセットには個人情報の入力が必要。
- JAL側から直接パスワードの漏洩があればこの程度の被害では済まないはず。
- 被害に気付いた会員からの問い合わせが発覚の端緒だった。
- 不正ログインにすぐ気付いてシステムを止めて被害拡大を防いだわけではなさそう。
- 会員側からパスワードが漏れたにしては被害が大きすぎるように思える。
という諸々を考えると、リバースブルートフォース攻撃だった可能性は高いと思います。
「リバースブルートフォース攻撃」は防げるか?
リバースブルートフォース攻撃の際のアクセスパターンは、パスワードリスト攻撃と似た性質を持っているため、攻撃を受けるサイト側は認証方式を改善しない限り防御できないでしょう。
しかし2段階認証なんて必要ありません。単純にパスワードの桁数や使用できる文字種を普通のWebサービス並に増やして可能なパスワードの数を十分に増やせばこの攻撃は成り立たなくなります。
もっとも、多くの会員が今の数字6桁のパスワードを使い続けるなら攻撃は成立しますし、GitHub への攻撃例のように弱いパスワードを狙い撃ちする攻撃が成立する可能性は常にありますが、発生した被害の責任は、基本的には弱いパスワードを使っている会員の自己責任になります。
パスワードの変更に意味はあるか?
事件を受けて、JAL側は全会員にパスワードの変更を呼びかけていますが、もし今回の事件がリバースブルートフォース攻撃によるものならば、パスワードの変更には意味がありません。
もちろん今回被害を受けた人は継続して被害を受けないために(とりあえずは)パスワードを変更するべきですが、そうでない人がパスワードを変更しても次の攻撃で「当たり」になる人が入れ替わるだけで、今後被害を受ける確率は変わりません。
ひろみちゅ先生もこの通り。
リバースブルートフォース攻撃であったことが確認されたとき用の新聞向けコメントを置いておきます。
(暗証番号の変更を呼びかけているとの対応に対し)「暗証番号を何回変更したところで防ぐ効果は皆無。今後も繰り返し被害が発生するだろう。」
— Hiromitsu Takagi (@HiromitsuTakagi) 2014, 2月 3
と、ここまで書いてたら…
徳丸さんが今回の事件と「リバースブルートフォース攻撃」についてわかりやすく説明している記事が公開されていました…
なんと「被害にあった利用者の被害者はすべて同一のIPアドレスからアクセスされた」とのこと。
徳丸: こちらの記事によると、被害にあった利用者の被害者はすべて同一のIPアドレスからアクセスされたようです。ということは、IPアドレス毎に連続したログイン試行の監視やロックをしていなかったと思われます。
JALの不正ログイン事件について徳丸さんに聞いてみた | 徳丸浩の日記
これはJAL側の過失責任がより厳しく問われることになりそうですね。。。
*1:JALマイル会員ではないので確認はしていませんが、実際あるようです。
*2:正式な技術用語ではないそうです。ブルートフォース攻撃に含まれる方法なので「リバース」を付けて別物みたいに言うのは変なので。
*3:1秒に1回試行しても30年かかります。ただし7桁の会員番号(1000万通り)もあるので、そちらの方に空きが十分なかったらヤバいです。
*4:ITproまとめ - 日本航空(JAL):ITproより
*5:もっとも認証系にそこまでの負荷がかかることを想定しているかは疑問ですが…