Skip to content

Add Passkey Security Cheat Sheet - #2369

Open
basriakkaya wants to merge 3 commits into
OWASP:masterfrom
basriakkaya:agent/add-passkey-security-cheat-sheet
Open

Add Passkey Security Cheat Sheet#2369
basriakkaya wants to merge 3 commits into
OWASP:masterfrom
basriakkaya:agent/add-passkey-security-cheat-sheet

Conversation

@basriakkaya

@basriakkaya basriakkaya commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Description

This PR adds a vendor-neutral Passkey Security Cheat Sheet for developers implementing the WebAuthn relying-party lifecycle.

It follows the scope approved in #2365 and the earlier maintainer request for a cheat sheet that covers the entire passkey topic rather than credential binding alone.

What this covers

  • Passkey and WebAuthn security properties and limitations
  • RP ID, origin, user presence, and user verification decisions
  • Registration and authentication ceremony requirements
  • Credential enrollment, revocation, and audit controls
  • Account recovery and bootstrap protections
  • Synced and device-bound credential considerations
  • A deployment and review checklist

The guidance is architecture-first, language-independent, and uses no implementation-specific code. Technical claims are linked inline to W3C WebAuthn, NIST SP 800-63B-4, and related OWASP guidance.

Validation

  • New Cheat Sheet template and writing guide followed
  • Change is limited to one new cheat sheet
  • Full Markdown lint passed
  • Full terminology lint passed
  • All internal and external links passed markdown-link-check
  • References use descriptive Markdown links
  • Registration and assertion requirements were checked against the W3C relying-party verification procedures

Scope and sourcing

  • This PR is focused: it adds only Passkey_Security_Cheat_Sheet.md.
  • Security-critical recommendations are supported by primary W3C, NIST, or OWASP sources linked inline.
  • I reviewed the cited sources and verified that they support the associated claims.

AI Tool Usage Disclosure

  • I have used AI tools to generate the contents of this PR. I have verified the contents and I affirm the results. The LLM used is OpenAI Codex (GPT-5). The prompt asked Codex to analyze the OWASP Cheat Sheet Series, identify genuine contribution candidates, and, after approval, prepare a maintainer-aligned Passkey Security Cheat Sheet covering the complete relying-party lifecycle. I independently reviewed every citation and technical claim against the cited W3C, NIST, and OWASP sources.

This PR fixes issue #2365.

@basriakkaya
basriakkaya marked this pull request as ready for review August 14, 2026 21:17
jmanico
jmanico previously approved these changes Aug 15, 2026

@jmanico jmanico left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great work, There are many things we can add or clarify, but this is a great starting point and I want to get it live.


Passkeys are [WebAuthn public key credentials](https://www.w3.org/TR/webauthn-3/#sctn-use-cases) that let a user authenticate without sending a shared secret to the application. The authenticator keeps the private key and the relying party stores a public key. A passkey is scoped to a relying party identifier (RP ID), which provides phishing resistance when the ceremony and server-side verification are implemented correctly.

This cheat sheet is for developers who build the relying-party side of passkey registration, authentication, credential management, and account recovery. The main recommendations are:

@randomstuff randomstuff Aug 15, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this a passkey Cheat Sheet and not a WebAuthn cheet sheet?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@randomstuff - Excellent point. All newly purchased passkeys today support WebAuthn, but they can support other things like FIDO2 (which is broader than WebAuthn). In fact, I have a really old Yubico Yubi Key that supports FIDO (now, FIDO1) but predated WebAuthn and all I use if for now is to with my password manager for some of the password vaults where I just using it as a 2FA mechanism. If this were truly about passkeys, this would have to be broader than what it is and cover use cases beyond just WebAuthn. But renaming the cheat sheet as WebAuthn can solve this.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @randomstuff , I am not sure whether can I reply to your comment in this PR , because this PR is not related to me. But I totally and definitely agree to your question, because most of the security controls here are fundamentally related to WebAuthn implementation controls. Especially passkey describes user facing category of WebAuthn credientials.

@randomstuff randomstuff Aug 17, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, I'll clarify the intent of my question. 🙇

My understanding was that passkey was defined as "WebAuthn credentials stored in software" (eg. stored in the browser) in contrasted to backed by a FIDO2 hardware. Apparently, some people out there might use the term passkey for both "software" and "FIDO2-backed" WebAuth credentials. So my question was whether this Cheat Sheet was intending to covered only software implementations and whether it should cover both software and FIDO2 WerbAuthn credentials.

In any case, maybe it might be useful to clarify that this covers both forms of WebAuthn credentials (or not).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for clarifying. I kept the Passkey Security scope approved in #2365, but made the protocol boundary explicit. The introduction now states that this covers the WebAuthn relying-party side of passkey deployment across platform and roaming authenticators, including security keys that support discoverable credentials, and both synced and device-bound passkeys. It also distinguishes legacy FIDO U2F/CTAP1 second-factor credentials as out of scope and explains the WebAuthn/FIDO2/CTAP relationship.


### Handle Signature Counters Conservatively

An increasing signature counter can provide a signal that some authenticators have been cloned. The WebAuthn [signature counter considerations](https://www.w3.org/TR/webauthn-3/#sctn-sign-counter) explain why it is not a universal clone-detection mechanism. Some authenticators do not implement a counter, and a synced credential may be used from multiple authenticator instances whose counter behavior is not strictly monotonic.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An increasing signature counter can provide a signal

Shouldn't that be "decreasing" (or more correctly "non-increasing")?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch. I changed this to “non-increasing” and aligned the explanation with the WebAuthn verification guidance: it is a signal, not proof, and may also indicate an authenticator malfunction or out-of-order assertion processing.

@kwwall kwwall left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree with @randomstuff that this should be renamed WebAutn_Security_Cheat_Sheet.md. And I meant to get to submit this yesterday, but my wife and I went out for dinner and when I got back, I forgot to finish it.


Passkeys are [WebAuthn public key credentials](https://www.w3.org/TR/webauthn-3/#sctn-use-cases) that let a user authenticate without sending a shared secret to the application. The authenticator keeps the private key and the relying party stores a public key. A passkey is scoped to a relying party identifier (RP ID), which provides phishing resistance when the ceremony and server-side verification are implemented correctly.

This cheat sheet is for developers who build the relying-party side of passkey registration, authentication, credential management, and account recovery. The main recommendations are:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@randomstuff - Excellent point. All newly purchased passkeys today support WebAuthn, but they can support other things like FIDO2 (which is broader than WebAuthn). In fact, I have a really old Yubico Yubi Key that supports FIDO (now, FIDO1) but predated WebAuthn and all I use if for now is to with my password manager for some of the password vaults where I just using it as a 2FA mechanism. If this were truly about passkeys, this would have to be broader than what it is and cover use cases beyond just WebAuthn. But renaming the cheat sheet as WebAuthn can solve this.

@jmanico

jmanico commented Aug 17, 2026

Copy link
Copy Markdown
Member

Kevin, I think we may be conflating a passkey with an authenticator. A YubiKey is an authenticator that can store and use a passkey; it is not itself a passkey. Users do not necessarily need to purchase a dedicated hardware authenticator. Passkeys can also be managed by platform authenticators built into phones and laptops, and they may be device-bound or even synchronized across several devices.

For that reason, I do not think we should rename this as a WebAuthn-only cheat sheet. The document covers substantially more than invoking the WebAuthn API.

It addresses the full lifecycle required to deploy passkeys securely, including server-side verification and credential storage, registration and authentication, credential enrollment and revocation, account recovery, and the security differences between synchronized and device-bound passkeys.

Passkey Security Cheat Sheet therefore describes the intended scope more accurately.

@kwwall

kwwall commented Aug 17, 2026 via email

Copy link
Copy Markdown
Collaborator

@basriakkaya

Copy link
Copy Markdown
Contributor Author

Thanks everyone. I pushed a focused scope clarification rather than renaming the file while the naming discussion remains split. The sheet now explicitly covers WebAuthn RP deployment of passkeys across platform and roaming authenticators, synced and device-bound credentials, and distinguishes legacy U2F/CTAP1 second-factor credentials. I also corrected the signature-counter condition. Markdown, terminology, and link checks all pass. @kwwall, would you please re-review whether this clarification addresses your change request?

@jmanico

jmanico commented Aug 17, 2026

Copy link
Copy Markdown
Member

Kevin, I think we are conflating the credential with the authenticator.

More precisely, a passkey is a discoverable FIDO public-key credential. A YubiKey is a FIDO authenticator/security key that can create and store device-bound passkeys. The YubiKey itself is not a passkey.

It is also important to distinguish passkeys from FIDO2 credentials generally. FIDO2 supports both discoverable and non-discoverable credentials; the discoverable credentials are what the current standards terminology calls passkeys.

FIDO2 is the umbrella consisting of WebAuthn and CTAP. WebAuthn defines the registration and authentication ceremonies used by the relying party and client, including the server-side verification model. CTAP is used when the client platform communicates with an external authenticator such as a YubiKey.

Therefore, I do not think “Passkeys for WebAuthn” makes the title more accurate. Passkeys are already WebAuthn discoverable credentials. The Cheat Sheet should explain the complete passkey implementation model: WebAuthn, relevant CTAP concepts, relying-party validation, credential-record storage, account recovery, credential lifecycle, user verification, attestation, and support for multiple passkeys.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants