概要
ログイン失敗時に「メールアドレスが存在しません」と「パスワードが違います」を区別する脆弱版を注入。攻撃者が有効なメールアドレスを特定可能。
詳細
| 項目 |
値 |
| slug |
enumeration_error |
| カテゴリ |
Authentication |
| 難易度 |
Easy |
| CWE |
CWE-204 |
安全版(現在の実装)
flash.now[:alert] = "メールアドレスまたはパスワードが正しくありません。"
ユーザーが存在しない場合もパスワードが違う場合も同じメッセージ。
脆弱版(注入する実装)
def create
user = User.find_by(email: params[:email]&.downcase)
unless user
flash.now[:alert] = "このメールアドレスは登録されていません。"
return render :new, status: :unprocessable_entity
end
if user.authenticate(params[:password])
reset_session
session[:user_id] = user.id
redirect_to tasks_path
else
flash.now[:alert] = "パスワードが正しくありません。"
render :new, status: :unprocessable_entity
end
end
テスト方針
- SAFE: 存在しないメールでもパスワード間違いでも同じエラーメッセージ
- VULN: 存在しないメール → 「登録されていません」、パスワード間違い → 「パスワードが正しくありません」と区別される
注入方式
Module#prepend で SessionsController#create を上書き
参考
概要
ログイン失敗時に「メールアドレスが存在しません」と「パスワードが違います」を区別する脆弱版を注入。攻撃者が有効なメールアドレスを特定可能。
詳細
enumeration_error安全版(現在の実装)
ユーザーが存在しない場合もパスワードが違う場合も同じメッセージ。
脆弱版(注入する実装)
テスト方針
注入方式
Module#prependでSessionsController#createを上書き参考