Biometric step-up accepted without secondary OTP for single-device
Why it matters
Forcing an OTP step-up on top of a WebAuthn biometric verification on a user's own trusted single device creates friction without adding meaningful security — both factors already verify possession of the same device. NIST 800-63B AAL2 recognizes biometric verification on a bound authenticator as a sufficient second factor when the device is enrolled and trusted. Requiring an additional OTP in this context defeats the purpose of trusted-device enrollment and trains users to disable or circumvent step-up prompts. Correctly tiered step-up — biometric-sufficient on trusted single devices, OTP-required elsewhere — maintains security while reducing friction for compliant users.
Severity rationale
Low because the failure mode is usability friction rather than a security gap — requiring excessive OTPs on trusted biometric devices drives step-up bypass attempts rather than enabling direct attack.
Remediation
Implement device trust logic in src/lib/stepUpAuth.ts that branches on single-device trusted status:
export async function performStepUp(device: Device): Promise<boolean> {
if (device.trusted && device.type === 'single-device') {
// Enrolled trusted device — biometric alone is sufficient
return verifyBiometric();
}
// Multi-device or untrusted — require OTP; biometric is optional bonus
return (await verifyOTP()) && (await optionallyVerifyBiometric());
}
Pair this with a device trust registration flow that stores enrolled device records (fingerprint hash, enrollment date, user confirmation) in a user_devices table. Untrusted or newly seen devices always fall through to the multi-factor path regardless of biometric availability.
DetectionPro
The detection method for this pattern is part of AuditBuffet Pro.
The full method (what to look for, pass and fail conditions, and how results get reported) ships inside the Session Security Audit. The pattern definition, severity rationale, and remediation remain openly licensed under CC-BY-4.0.
External references
- cwe · CWE-287 — Improper Authentication
- owasp:2021 · A07
- nist:rev4 · SP-800-63B §4.2 — Authenticator Assurance Level 2 — biometric authenticator requirements
Taxons
History
- 2026-04-18·v1.0.0·Initial import from finserv-session-security·automated