リバースブルートフォース攻撃対策手法

一言で言えば、リバースブルートフォース対策=脆弱なパスワードの禁止。

ブルートフォースとの相違点

『リバースブルートフォース』と呼ばれる攻撃は、多くのユーザーが使っていそうな少数のパスワード辞書と、多数のアカウント名を用いてログイン試行を繰り返す手法。

少数のアカウントに対して多数のパスワードを試す、通常のブルートフォース攻撃であれば、アカウント毎にログイン失敗回数の上限を設けてアカウントロックすることで防げる。 ところが、リバースブルートフォースは攻撃対象アカウントが変化するため、この単純な方法では防げない。 また、ボットネットを使えばリバースブルートフォースはいくらでも並列に行うことができるため、単純なIPアドレス当りのアクセス頻度制限でも防げない。[JALの不正ログイン事件について徳丸さんに聞いてみた]

リバースブルートフォースを防ぐにはアカウント名(ID)かパスワードを、予測不能なもの、つまり十分長くかつ攻撃者の辞書に載っていないものにする必要がある。

アカウント名は内部・外部で利用されうるので、アカウント名を予測不能にするのは難しい。後者を保証するためには、よく利用されるパスワードの利用を禁止することになる。

「よく使われるパスワード」というものは一定ではなく、実際のユーザーによって変化していく(qwertyが禁止されれば、qwerty123456の頻度が増えるだろう)。攻撃側も、随時パスワード辞書を更新して、実態に近いより効率的な攻撃を考えている。

理想的にはどのユーザーも同じパスワードを使うことがないように出来ればいいのだが、これを実装してしまうと、生パスワードかソルト(nonce)が同じハッシュを永久的に保管することになり、漏洩時のリスクから見て好ましくなく、他のユーザーが使っているパスワードを調べる方法を攻撃者に与えてしまう。

パスワードあたりログイン失敗回数

リバースブルートフォース対策としてはアカウントロックの反対、つまりパスワード(のハッシュ)毎のログイン失敗回数を記録して、失敗回数が閾値に達したら、そのパスワードは攻撃者の持っている辞書に載った脆弱なパスワードになったと判定し、無効なパスワード辞書に追加して使用不能にする、という方法がある。

例えば、ある18文字のパスワード"NagaiNagaiPassword"は登録時のパスワードチェックでは、安全な長いパスワードと判定されてしまうかもしれない。 もしこのパスワードでのログイン失敗が何度もあったら、なんらかの攻撃の徴候と考えられる。"NagaiNagaiPassword"は攻撃者が使う「よくあるパスワードリスト」に載ってしまった可能性が高い。

以降"NagaiNagaiPassword"はそのサイトでパスワードとして登録出来なくなり、"NagaiNagaiPassword"をパスワードにしているアカウントはロックされてパスワード以外の認証、たとえばメール認証を要求される。

新しいパスワードを攻撃者がブルートフォースに使い始める理由は

  • ユーザーがパスワードを他の場所でも使い回していて、それが漏洩した
  • 攻撃者が独自に統計をとったり、偶然に思いついて辞書に追加した

のいずれかとなる。 アカウントを忘れた本当のユーザーが単に何度も間違ったアカウント名で試し続けている、という誤検出はありえるが、パスワードが失効するのは本人のアカウントだけなので問題はないだろう。

この方法は、パスワードリスト保持のためにメモリが必要という欠点を除けば単純で、脆弱なパスワード辞書をアップグレードするためのデータも与えてくれる。

なお、ログイン失敗したパスワードは本物のパスワードのtypoである可能性があるので、生パスワードでは保存せず、定期的に消去したりソルトを変更することが望ましい。

問題点

この手法があまり使われないのは、『危険なパスワードを使うことが出来ない』という問題があるためだろう。

本当に安全な(乱数で生成した長いパスワードで漏洩経験がない)パスワードを使っているなら、ブルートフォースに使われることはよほど運が悪くない限り突然パスワードが使えなくなることはない。

しかし実際にパスワードを暗記しているほとんどの人が脆弱なパスワードを使っているがために、脆弱なパスワードの禁止はそれ自体不便なシステムと見られてしまう。

この手の手法を導入していても、ユーザーへのリスク通知にとどめているウェブサービスは多いのではないかと思う。