Passkeys: optional settings to let a passkey satisfy AAL2 and stand in for the current password #51228
Unanswered
DruidChiron
asked this question in
Feature Requests
Replies: 1 comment
|
Additional context: with passkeys counting toward AAL2 (or treated as a second factor by apps, as we do via the passkey AMR), there's a binding gap. Today a password-only aal1 session can register a user's first passkey (step-up only applies once a verified TOTP exists). That means the password alone can mint a credential that later satisfies a "second factor" check. If this enhancement is adopted, it would help to also have an option to require AAL2 or an existing-factor ceremony for all passkey registrations, including the first, or at least to expose on the session/AMR whether the passkey used was registered from an AAL2 session. Our workaround in the meantime is to require a TOTP for admin-tier accounts. |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Summary
With the new passkey support in Supabase Auth, a session established by signing in with a passkey is
aal1(AMRpasskey), the same assurance level as a password sign-in. That is a sensible, conservative default. But there is currently no way for a project to choose otherwise, which has two consequences:updateUserpassword change, managing passkeys while MFA is enabled).Observed behaviour
Local Supabase CLI stack,
supabase_flutter2.18, Chrome on Windows 11, user with a verified TOTP factor and a registered passkey:auth.sessions.aal = 'aal1',mfa_amr_claims.authentication_method = 'passkey'.updateUser({ password })→ refused withinsufficient_aaluntil a TOTP challenge is completed.Why this should be configurable rather than fixed
Whether a passkey deserves AAL2 depends on the passkey and on the project's risk profile:
UVflag) combines possession of a private key with a biometric or device PIN, and it is phishing-resistant (origin-bound). In many contexts it can reasonably be treated as AAL2; NIST SP 800-63B and its 2024 supplement on syncable authenticators allow this under conditions.UVflag, and the backup eligibility/backup state flags (BE/BS), which tell a relying party whether a credential is syncable or has been synced.Secure by default: passkeys should stay
aal1unless a project explicitly opts in.Proposal
UV=1,BS=0), or any passkey with user verification.current_password. Recovery sessions keep their existing exemption.aal1session to step up with a passkey assertion, the waymfa.challenge/mfa.verifyworks for TOTP, without a full sign-out and sign-in (subject to setting 1).UV/BE/BS(or a derived "synced"/"device-bound" field) in the passkey list, so apps can show users which kind they have. Today users usually can't tell; for example, the Windows prompt doesn't say whether a passkey is stored only on the device or synced.Impact today
Applications that want admin actions protected by a second factor must either (a) ask passkey users for a TOTP code anyway, or (b) read the AMR claim themselves and treat
passkeyas a second factor in their own RLS, which then disagrees with Auth's ownaal. We currently do (b) for our own policies and still hit (a) wherever Auth enforces AAL2 itself, such as password updates.Happy to provide more detail or test a preview.
All reactions