utsuroi auth labs 知識ベース 02 / 02 — 攻撃と防御
Attack Methods & Defense · Knowledge Base
02

認証攻撃と防御

Enumeration, brute force, credential stuffing — and how to slow each

認証への攻撃は「ユーザを特定する」段階と「パスワードを破る」段階で異なります。それぞれの攻撃を知り、レート制限、パスワードポリシー、MFA、リスクベース認証で多層防御を組みます。

1. ユーザ列挙の手法 #enumeration

「このメールアドレスは登録されているか」を判定する方法は複数ある。

ユーザ列挙の入口は、ログインフォームだけではありません。次のような場所が典型的な漏洩源です:

全ての入口で「ユーザ存在の有無」を漏らさない統一的な応答を返す必要があります。

2. レスポンス時間からの漏洩 #timing-leak

エラーメッセージを統一しても、応答時間で漏れる。

エラーメッセージは統一したが、サーバ内部のロジックがこうなっていたら:

if user = lookup_user(email):
    if password_hash_verify(user.password_hash, input_password):
        login_success()
    else:
        return "メールアドレスまたはパスワードが正しくありません"
else:
    return "メールアドレスまたはパスワードが正しくありません"

ユーザが存在する場合はハッシュ検証(bcrypt や Argon2 で 100ms〜500ms かかる)が走り、存在しない場合は即座にエラーが返る。応答時間の差で「ユーザの存在」が漏れます

// タイミング攻撃対策
user = lookup_user(email)
if user:
    valid = password_hash_verify(user.password_hash, input_password)
else:
    // ダミーのハッシュ検証で時間を消費
    password_hash_verify(DUMMY_HASH, input_password)
    valid = false

if not valid:
    return "メールアドレスまたはパスワードが正しくありません"

ユーザの存在に関わらず常にハッシュ検証を実行することで、レスポンス時間を均一化します。

3. ブルートフォース #brute-force

特定ユーザ × 多数のパスワード候補。

ユーザ列挙で得たメールアドレス一覧に対して、よくあるパスワード(password123qwertypassword1 等)を片っ端から試す攻撃。

ブルートフォースを成立させる条件は2つ:

  1. ターゲットアカウントが存在する(ユーザ列挙の結果)
  2. レート制限がない、または弱い

レート制限がなければ、単純なパスワード一覧 1万件を1秒で試行可能。Have I Been Pwned 等の漏洩データから流通している弱いパスワード辞書は数百万件あります。

4. クレデンシャル・スタッフィング #credential-stuffing

他社で漏れた ID/パスワードのペアを、貴社で試す。

人は同じパスワードを複数のサービスで使い回す傾向があります。攻撃者は別サービスの漏洩リスト(数億件規模が流通)を入手し、そのままうつろい EC のログインフォームで試行します。

ブルートフォースとの違い:

対策:

5. レート制限 #rate-limit

時間あたりの試行回数を制限する。

ブルートフォース対策の基本。実装には複数の軸を組み合わせます:

具体的な制限値の例:

過度に厳しいロックアウトは、攻撃者が DoS として利用する(意図的に他人のアカウントを大量にロックする)リスクもあるので、CAPTCHA や時限ロック等で被害を限定するのが実務的。

6. 多要素認証(MFA) #mfa

「パスワードが盗まれる」前提で守る最後の砦。

パスワードだけでは突破される前提で、別カテゴリの認証要素を追加で要求する設計。詳細は KB 01 §2 参照。

実装の選択肢を強さ順に並べると:

  1. FIDO2 / WebAuthn(YubiKey、Passkey 等) — フィッシング耐性あり、最強
  2. TOTP(Google Authenticator 等) — オフライン動作、SIM スワップ攻撃を受けない
  3. プッシュ通知(Microsoft Authenticator 等) — UX 良好、ただし「MFA 疲労攻撃」のリスク
  4. SMS/メールのワンタイムコード — 一定の効果はあるが SIM スワップやメール乗っ取りで突破される
MFA も実装ミスで突破される

MFA 自体は強力ですが、実装ミスで素通りされる事例があります:
・「MFA をスキップ」の隠しエンドポイントが残っている
・MFA コード検証時にレート制限がなく、6桁の総当たりで突破される
・「次回からスキップ」を任意の Cookie 値で実装(改ざん可能)
・MFA 設定変更時に MFA 確認を要求しない(攻撃者が乗っ取った後に MFA を勝手に再設定)
これらは Lab 03〜05 で扱う予定の典型的な落とし穴です。