utsuroi auth labs Lab 02 / 5 — Practitioner
02

タイミング攻撃 — エラーは統一されたが応答時間で漏洩

Username enumeration via response time

Lab 01 の指摘を受けて、うつろい EC はログインエラーメッセージを統一した。
「メールアドレスまたはパスワードが正しくありません」のみ。一見対策完了。

しかしサーバ内部のロジックは:

if user = lookup_user(email):
    if password_hash_verify(user.password_hash, input_password):  # ~250ms
        login_success()
    else:
        return error  # 検証は走った
else:
    return error  # 即座に返る

ハッシュ検証は遅い(bcrypt で 200〜300ms)。応答時間の差から、ユーザの存在/不在が判別できてしまう。

下のメールアドレス候補8件に対して「タイミング測定」を実行し、応答時間の差から登録会員4名を特定してください。

(まだ測定していません — 「タイミング測定」を押してください)
サーバ内部のタイミング差
# ユーザ存在 → bcrypt 検証(~250ms)
[lookup user (~5ms)] + [bcrypt verify (~250ms)] = ~255ms

# ユーザ不在 → 即座にエラー(~10ms)
[lookup user (~5ms)] + [no further work] = ~10ms

# 差は約 245ms — 1回の測定では誤差に埋もれるが、
# 複数回の平均を取れば確実に判別可能
正解(ネタバレ)

「タイミング測定」を押すと、各候補に対して10回のリクエストを送り、平均応答時間を計測します。100ms 以上の応答は「ハッシュ検証が走った=会員」と判定。Lab 01 と同じ4名(store_adminmiharu.tachibanayuki.nomurakanae.morita)が特定されます。