リバースブルートフォース攻撃とは何なのか

## はじめに
つい数日前にドコモの電子マネー決済サービスである「ドコモ口座」から不正にお金が引き出されるという事件がありました。
そこで「**リバースブルートフォース攻撃**」という手口が使われたのではないか？と言われています。
参考：https://news.yahoo.co.jp/byline/kubotahiroyuki/20200911-00197727/
そこで、リバースブルートフォース攻撃とは何なのか調べてまとめてみました。
この記事は初心者向けの記事なので、そこまで高度な情報は扱っていないです。

## ブルートフォース攻撃

「リバースブルートフォースアタック！」とか英語で言うとなんだか必殺技の名前みたいでかっこいいですが、これは
リバース + ブルートフォース攻撃 と分解できます。
なのでまずはブルートフォース攻撃についてまとめます。
ブルートというのは乱暴な、という意味です。
名前の通り力技でこじ開けるのがブルートフォース攻撃です。

例として、悪意のあるユーザが他人のユーザID（パスワードは不明）を使ってログインを試みたとします。
その時一番最初に思いつくのがパスワードを力技で片っ端から試す方法です。
これが**ブルートフォース攻撃**です。
**総当たり攻撃**とも言います。

例えばパスワードが数字4桁であれば
0000 - 9999までを片っ端から試すのです。
全部試せばいつかは当たるだろうということです。
以下のようなイメージです。

```
userID: takashi password: 0000
userID: takashi password: 0001
...
userID: takashi password: 9998
userID: takashi password: 9999
```
アルファベットであればa-zまでを片っ端から試します。
一つ一つ手入力するのは大変ですが、プログラムを組んだりツールを作ったりすれば簡単に不正ログインできていしまいます。
最近だとドラマ「半沢直樹」で黒崎検査官がパスワードクラッカーを使ってa-zまで全てのパターンでブルートフォース攻撃を仕掛けるシーンがありました。（ドラマ内に出てくるセキュリティ関連に関してはいろいろとツッコミどころはいっぱいあるのですが。。）

似たような攻撃として**辞書攻撃**というのもあります。
これは辞書に載ってる単語を片っ端から試すという方法で、いろんなパターンのパスワードでログインを試すという点ではブルートフォース攻撃と似ています。

また、**ジョーアカウント探索**という方法もあります。
これはIDとpasswordを同じにしているアカウントを狙い撃ちにする方法です。
ジョーというのは英語圏でよくある名前みたいですが、なんでこういったアカウントがジョーアカウントと呼ばれるようになったかはよくわかりません。


## ブルートフォース攻撃の対策

**辞書攻撃**や**ジョーアカウント探索**は複雑なパスワードに設定することで回避できます。
IDとパスワードを同じにしたり、辞書に載っているような単語をパスワードにするのは避けるべきです。

サイトによってはIDとパスワードを同じにするのを禁止していたり、一定以上複雑なパスワードを要求しているところもあります。
ですが、どんなに複雑なパスワードを設定していても時間をかければブルートフォース攻撃で突破されてしまいます。

これにもっとも有効なのが**アカウントロック**です。
多くの方が経験あると思いますが、一定回数以上パスワードを間違えてしまった場合に30分間ロックされたり、また再度認証を行わなければならないようにするのです。

30分のロックで本当に十分なのか？

と思う方もいるかもしれません。
ですが、例えば10回のミスで30分間ロックされてしまうとしても、1日で試せるのはせいぜい200通りほどなのでそれほど問題ではありません。
現在ではほとんどのサイトでブルートフォース攻撃の対策としてアカウントロックが採用されています。
銀行口座の暗証番号なども同様なので、今回事件が起きた「ドコモ口座」でも単純なブルートフォース攻撃ではアカウントロックがかかってしまうはずです。

## リバースブルートフォース攻撃とは

さて、一つのアカウントに絞ってパスワードを変えていっても何回か間違えるとロックがかかってしまいます。
ここで悪知恵が働く人はこれを突破する方法を考えます。

「パスワードを1つに固定して、アカウントの方を変えていけばロックに引っかからないのでは？」

このようにブルートフォース攻撃の方法を「反転させた」方法を**リバースブルートフォース攻撃**といいます。
以下のようなイメージです。

```
userID: takashi password: 1234
userID: hanako password: 1234
userID: taro password: 1234
userID: naoki password: 1234
```
こうすれば一つのアカウントあたりの施行回数は一回だけなので、アカウントロックはかかりません。
いろんなIDを片っ端から試していけばいつかパスワードを「1234」に設定している人が見つかるかもしれません。
これが今回のドコモ口座の不正利用で行われたのではないかと言われる方法です。

似たような方法として**パスワードスプレー攻撃**があります。
これはいくつかのパスワード候補を変えながらいろんなアカウントで試す方法です。

```
userID: takashi password: 1234
userID: hanako password: 1234
userID: taro password: 1234
userID: takashi password: 1111
userID: hanako password: 1111
userID: taro password: 1111
...
```

僕が読んでいる「安全なwebアプリケーションの作り方」という本には上記のように**リバースブルートフォース攻撃**と**パスワードスプレー攻撃**は区別されています。
ただ、ネットで調べると「名前は違うが意味は同じ」と書いてあるページもあるため詳しい事情をご存知の方は教えて欲しいです。。

## リバースブルートフォース攻撃の対策

リバースブルートフォース攻撃の対策として有効なものの一つが*二段階認証*です。
7 payの不正利用の時にも話題になりましたね。

スマートフォンにSMSを送るなどして認証を一段階増やす方法です。
二段階認証を用いれば、ユーザーIDとパスワードが分かっていても、本人の電話番号に紐づいたスマホを持っていなければSMSを受け取れません。
そのため、有効な手段の一つとなります。

今回のドコモ口座の場合、ドコモユーザであればドコモの携帯電話を使っているためSMS認証ができましたが、auやソフトバンクなどの他社の携帯を使っている場合は２段階認証なしでもドコモ口座を作ることが可能だったようです。

ドコモユーザだけに絞っていればこのような事件は起きなかったかもしれません。
https://news.yahoo.co.jp/byline/kandatoshiaki/20200909-00197418/

毎回ログインのたびに二段階認証を行うのは流石にユーザ側からするとめんどくさいですが、初回ログインや重要な作業においては二段階認証を行うのが非常に重要だと言われています。

他に**ログイン失敗率を監視**したり、**パスワードポリシー**を厳しくするなどの方法もあります。

リバースブルートフォース攻撃が行われた場合、同一のIPアドレスから何度もログインに失敗することになります。
なので、そういったおかしな挙動が起きた場合に特定IPを遮断するなどの処置が有効です。
ただ、この場合個々のIPの挙動を監視しなければならないためコストが高いです。

また、後者のパスワードを厳しくする方法も有効です。
リバースブルートフォース攻撃はあくまでパスワードをよくあるものに「固定」して行われるため、安易なパスワードを禁止することでこういった被害をある程度防ぐことができます。

## その他の攻撃

他に**パスワードリスト攻撃**というものもあります。
これはある脆弱なサイトからuserIDとパスワードが流出してしまった場合、他のサイトでその組み合わせを試すというものです。

例えばtakashiさんがAというサイトで以下のuserIDとパスワードを設定していたとします。

```
userID: takashi password: QT13xd809
```

takashiさんはこのパスワードを別のBやCというサイトでも使い回していた場合、Aのサイトの情報が漏洩しただけで別のBやCというサイトでも不正ログインされてしまう可能性があります。
ここで重要なのは、パスワードを使い回している限り、いくら強固なパスワードを設定していたとしても意味がないということです。

## まとめ

- ユーザ側は強固なパスワードを設定して、パスワードの使い回しを避けることが大事
- サイト側は、二段階認証などを取り入れて既知の攻撃に備えることが大事

参考文献：「安全なWebアプリケーションの作り方 第二版 著 徳丸浩」
https://www.amazon.co.jp/dp/B07DVY4H3M/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1