Authorized design and assessment of OAuth Demonstrating Proof of Possession (DPoP) and sender-constrained access tokens in the RFC 9449 style: DPoP proofs, htm/htu binding, nonce challenges, cnf.jkt key thumbprints, and Bearer vs DPoP enforcement. Use when AS/RS traffic shows DPoP headers, token_type=DPoP, cnf.jkt, or when stolen Bearer tokens must not replay from another client.
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Um comando direto ignora o prompt de revisão. Verifique a origem antes de executá-lo.
Instruções da origem · Visualização somente leitura
name
oauth-token-binding-dpop
description
Authorized design and assessment of OAuth Demonstrating Proof of Possession (DPoP) and sender-constrained access tokens in the RFC 9449 style: DPoP proofs, htm/htu binding, nonce challenges, cnf.jkt key thumbprints, and Bearer vs DPoP enforcement. Use when AS/RS traffic shows DPoP headers, token_type=DPoP, cnf.jkt, or when stolen Bearer tokens must not replay from another client.
OAuth Token Binding (DPoP / RFC 9449)
Focused methodology for OAuth DPoP and sender-constrained access tokens
(RFC 9449-style): proof JWTs, htm/htu binding, server nonces, and key
confirmation at AS and RS. Complements device PoP and JWT crypto; not a substitute
for OAuth redirect/PKCE review.
Scope And Authorization
Authorized / lab / owned only. Named engagement targets, CTFs, apps you own.
Do not attack third-party IdPs or production clients outside written scope.
Treat DPoP private keys, proofs, tokens, and nonces as credentials: redact,
store offline, rotate after production demos.
Prefer dual-client accept/reject evidence with keys you control. No
unauthorized exploit PoCs, bulk third-party token replay, or out-of-scope key theft.
Implementation work pairs with code-quality-standards.
Confirm role split and baseline
Record AS token endpoint, RS APIs, client type (public vs confidential), and
whether DPoP is required or optional. Capture one successful issuance and one
successful RS call with a lab-controlled proof key.
POST /token HTTP/1.1
Host: as.example
DPoP: <proof_jwt>
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=...&code_verifier=...
GET /resource HTTP/1.1
Host: api.example
Authorization: DPoP <access_token>
DPoP: <proof_jwt>
Decode the DPoP proof JWT
Header: typ: dpop+jwt, asymmetric alg (ES256/RS256…), embedded public jwk.
Payload: htm (method), htu (URI without fragment), iat, jti, optional
ath (hash of access token at RS), optional nonce (when DPoP-Nonce issued).
Good: ES256; jwk matches token cnf.jkt; htm/htu match the wire
request; fresh iat; unique jti; ath present at RS. Bad: HS256 “proof”; missing jwk; wrong/loose htu; forever-reusable
jti; no ath while claiming RFC 9449 RS mode.
Key binding vs Bearer (dual-client probes)
With two clients and keys you control:
#
Probe
Secure outcome
1
Token as Authorization: Bearer (no DPoP)
Reject if DPoP-only; else document Bearer fallback
High severity: stolen access token works from a second client with no
matching DPoP private key (classic Bearer replay).
Nonce challenge path
If AS/RS returns DPoP-Nonce: bare proof fails; proof with matching nonce
claim succeeds. Good: short-lived/single-use. Bad: ignored, static, or
not tied to the proof key.
Issuance binding and coverage
Confirm access token cnf.jkt matches the DPoP key used at the token endpoint;
note token_type (DPoP vs Bearer) and whether refresh shares PoP policy.
Partial route enforcement (e.g. only /payments) is a binding gap. Hand refresh
rotation/reuse to jwt-refresh-token-patterns when lifecycle dominates.
Soft claims and handoffs device_id without crypto PoP is not DPoP—stolen JWT still replays. JWT crypto
→ api-auth-and-jwt-abuse; OAuth redirect/code → oauth-oidc-misconfiguration;
mTLS/device umbrella → device-binding-tokens.
Remediation themes
Require DPoP at AS and RS; reject unbound Bearer under sender-constrained policy.
Enforce signature, htm/htu, iat, jti, ath, nonce, and cnf.jkt. Short
access TTL; bind refresh consistently. DPoP is not XSS defense. Tests: wrong-key,
missing proof, htm/htu mismatch, jti replay, nonce fail.