web-dev-qa-db-ja.com

2要素の総当たり攻撃からの保護

TOTPを使用して2要素認証を実装する場合、(明らかに)TOTP値の単純な総当たり攻撃から保護する必要があります。

パスワードのログインに成功した後でTOTP値を要求すると、攻撃者は有効なパスワードをすでに知っています。 TOTP値のデフォルトの長さは6桁なので、ブルートフォースは簡単です。

可能な解決策:

  • ユーザーアカウントをブロックする:ブロックを解除できない方法で正当なユーザーをブロックすることの欠点。
  • IPのブロック:機能する可能性がありますが、ボットネットを利用することで回避される可能性があります。 IPv6で複数のIPをブロックする必要があります。

機能しないソリューション:

  • 現在のセッションをブロック:攻撃者がパスワードを知っていて、別のセッションを開くことができるため、機能しません。

どのようにブルートフォース保護を実装して、正当なユーザーをロックアウトせずに、可能な限り攻撃をブロックすることができますか?

5
kelunik

TOTPトークンをブルートフォースで強制することに関して重要なことは、正しいと推測する必要があるということです適切なタイミングで。したがって、試行がx回失敗した後にユーザーをロックアウトしたくない場合(これは一般的な方法です)、失敗した試行を遅くして、TOTPを正しく取得する確率が統計的に重要ではなくなるようにすることができます。

たとえば、6桁のTOTPトークンには1,000,000の可能性があります。ただし、正しいキーは(TOTPの標準実装では)30秒ごとに変化するため、成功ウィンドウは、トークンスペース全体を使い尽くすのにかかる時間ではなく、特定の期間に攻撃者が通過できるトークンの数をトークンスペースで割った数です。 、そしてそれでもチャンスのみが成功します。トークンスペースを30秒で通過できないようにし、攻撃をギャンブルに減らします。

例:攻撃者は1秒あたり1回の推測を取得します。与えられたトークンの推測は30回しかできないため、成功の確率は基本的にランダムです。確率変数のベルヌーイプロセス(失敗の確率と推測の数の積)を使用して、24時間この方法で攻撃(86,400回の推測)すると、成功の確率は8.2%にすぎません。 10日で57%に上昇します。そのため、ユーザーにパスワードを変更するよう説得するか、その割合が非常に高くなる前に攻撃者を(IPなどによって)ブロックする他の方法を見つけてください。

8
Jeff Meden