Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessCapture victim ID token bearing nonce_supported:false
-
ExploitReplay token into attacker-controlled session
-
Executionparse_id_token() reads claim and skips nonce check
-
ImpactRP establishes authenticated session as victim
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Replay attack prevention
|
| Exploitation Conditions | Exploitation requires ALL of the following: (1) the relying party uses OIDC implicit or hybrid flow, OR calls OpenIDMixin.parse_id_token() directly on externally supplied ID tokens - plain authorization code flow is NOT affected because the token is fetched over TLS after a state lookup; (2) the attacker possesses a captured, validly signed ID token belonging to the victim that passes signature, iss, and aud validation; and critically (3) that captured token must itself carry the nonce_supported claim as a JSON boolean false - the attacker cannot add or alter this claim without invalidating the signature, so the issuing authorization server must emit it (the Apple-style provider case per issue #259). A string value "false" does NOT trigger the bypass. Affects both sync and async integrations (Flask, Django, Starlette) on authlib <= 1.8.0. The strong limiting factor is condition (3): only tokens originally issued with nonce_supported:false are exploitable, which is why complexity is high. No RP-side authentication or special configuration is required of the attacker. No integrator-side mitigation exists; upgrading to 1.9.0 is the only fix. |
| Impact | Signals are moderate and partially conflicting. The NVD CVSS 3.1 vector (AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N = 4.2) and the GHSA advisory vector agree on exploitability metrics but diverge sharply on impact: GHSA rates C:H/I:H (6.8, account takeover at the relying party) while NVD rates C:L/I:L (4.2) - this impact disagreement should be resolved toward GHSA's view, since a successful replay authenticates the attacker as the victim and grants full access to the victim's RP account. No EPSS score and no CISA KEV entry are present in the input, so there is no evidence of active or widespread exploitation; the vuln.today Decision label is 'this_month', not act_now or emergency, consistent with a fix-in-normal-cycle priority. A detailed proof-of-concept (full poc.py with reproduced three-case output) is published in the GHSA advisory. The AC:H rating is well-founded: exploitation requires a validly signed victim token that already carries the nonce_supported JSON boolean false claim (the attacker cannot inject it without breaking the signature), and the RP must use implicit/hybrid flow or call parse_id_token() directly. These stacked preconditions make this a real but targeted authentication-bypass risk rather than a mass-exploitable critical issue - a genuine priority for affected OIDC relying parties, but not an emergency. |
| Exploit ScenarioDerived | An attacker obtains a victim's validly signed OIDC ID token that carries nonce_supported:false (captured from browser history, a Referer header, proxy/server logs, or a shared device, where the issuing authorization server emits that claim). The attacker replays the token into their own session at a relying party that uses implicit/hybrid flow or that passes externally supplied tokens to parse_id_token(); nonce-to-session binding is skipped and the RP establishes an authenticated session as the victim. A working proof-of-concept demonstrating acceptance of a mismatched-nonce token is published in the GHSA advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 22, 2026
Authlib's OpenID Connect client integrations accept an ID token that disables its own nonce check: OpenIDMixin.parse_id_token() reads the nonce_supported claim from the untrusted token payload and, when it is the JSON boolean false, sets the expected nonce to None so both the nonce presence and equality checks are skipped. This lets an attacker who holds a captured, validly signed victim ID token that itself carries nonce_supported:false replay it into an attacker-controlled session and be authenticated as the victim at the relying party; only implicit/hybrid-flow relying parties or applications calling parse_id_token() directly on externally supplied tokens are exposed, while plain authorization code flow is unaffected because the ID token is fetched over TLS after a state lookup. The vendor rates it moderate (assessed CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N, 6.8); exploitation is unauthenticated from the attacker's side but requires user interaction and is gated by the strong precondition that the captured token was originally issued with a literal boolean nonce_supported:false claim, which the attacker cannot add without breaking the signature. The upstream security advisory includes a proof-of-concept script reproducing acceptance of a mismatched nonce on 1.8.0, and no public exploitation activity is indicated.
RemediationAI
Upgrade to Authlib 1.9.0 (release tag v1.9.0), which removes the token-driven nonce_supported branch from both authlib/integrations/base_client/sync_openid.py and async_openid.py; the fix is carried in PR https://github.com/authlib/authlib/pull/949 and commit 6563f6f7a8c2f71d2f85ee7511d72a4fbae3acc0, with details in advisory https://github.com/authlib/authlib/security/advisories/GHSA-c5mf-xmp2-59rc. There is no integrator-side workaround: the check lives inside parse_id_token() and no parameter or configuration option is exposed to disable or override the nonce handling, so upgrading is the only complete fix - the vendor states no mitigation is available to integrators. Where an immediate upgrade is not possible, the practical exposure reduction is architectural: relying parties that use authorization code flow are unaffected, so moving implicit or hybrid relying parties to the authorization code flow removes the attack path (at the cost of a client-side redirect flow change), and applications that call parse_id_token() directly on externally supplied ID tokens should avoid doing so or independently verify the nonce claim against their session before establishing authentication (a custom wrapper must be maintained as it duplicates the library's validation logic and is not sanctioned by the vendor). Note that the captured token must itself contain nonce_supported:false, so exposure depends on the issuing provider emitting that claim.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in pypi
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Authlib is a Python library for building OAuth 2.0 and OpenID Connect clients and servers, with framework integrations such as Flask, Django and Starlette built on the shared OpenIDMixin in authlib/integrations/base_client/sync_openid.py and async_openid.py. The flaw is a trust-boundary error in parse_id_token(): after jwt.decode() verifies the signature and produces token.claims, the code builds an IDToken claims object from that decoded payload and then executes 'if claims.get("nonce_supported") is False: claims.params["nonce"] = None'. Because the flag is resolved against the token payload rather than server metadata or client configuration, the data under validation controls whether nonce validation happens. IDToken.validate_nonce() in authlib/oidc/core/claims.py only compares values when the expected nonce is truthy, so assigning None suppresses both the MissingClaimError and InvalidClaimError paths and claims.validate() completes normally. The branch was introduced in commit 3ca7333c ('Skip verifying nonce for Apple case', per issue #259) to accommodate a provider emitting nonce_supported; the fix removes it entirely rather than sourcing it from load_server_metadata(), so token claims can no longer influence the expected nonce. The comparison uses 'is False', so only a JSON boolean false triggers it and a string "false" does not. Root causes map to CWE-294 (authentication bypass by capture-replay) and CWE-807 (relying on an untrusted input in a security decision); the nonce is the binding between an ID token and the browser session that requested it, so neutralizing it removes replay protection for genuine tokens captured from browser history, Referer headers, proxy or server logs, or shared devices. Signature, iss and aud validation still apply, so token forgery or impersonation of an arbitrary subject is not possible; plain authorization code flow is out of scope because the ID token cannot be substituted by an attacker there.
Know when Authlib gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N
AC:H because the captured token must already carry nonce_supported:false and the RP must use implicit/hybrid/direct parse; PR:N as no RP auth is needed; successful replay yields victim account takeover, so C:H/I:H.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
Authlib is a Python library which builds OAuth and OpenID Connect servers. Prior to 1.9.0, OpenIDMixin.parse_id_token() reads the nonce_supported decision from the untrusted ID token being validated and sets the expected nonce to null when that claim is the JSON boolean false. In implicit and hybrid relying parties, or applications that directly accept externally supplied ID tokens, an attacker with a captured validly signed token can bypass the nonce-to-session binding and replay the victim's token into an attacker-controlled session. Plain authorization code flow is not affected, and the token must still pass signature, issuer, and audience validation. OpenIDMixin.parse_id_token() trusts nonce_supported in both authlib/integrations/base_client/sync_openid.py and authlib/integrations/base_client/async_openid.py to disable the expected nonce. This issue is fixed in version 1.9.0.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
Authlib is a Python library which builds OAuth and OpenID Connect servers. [CVSS 5.7 MEDIUM]
Authentication bypass in Authlib (Python OAuth/OpenID Connect library) versions 1.6.5 through 1.6.6 allows remote attack
Authlib is a Python library which builds OAuth and OpenID Connect servers. Rated high severity (CVSS 7.5), this vulnerab
Authlib's JOSE/JWS verification path (through 1.6.4, with 1.6.5 as the fix) decodes attacker-supplied JWT/JWS header and
lepture Authlib before 1.3.1 has algorithm confusion with asymmetric public keys. Rated high severity (CVSS 7.5), this v
Unbounded DEFLATE decompression in Authlib's JWE zip=DEF handling (authlib/jose/rfc7518/jwe_zips.py) lets a small, valid
Signature verification bypass in Authlib 1.7.2 and earlier allows unauthenticated remote attackers to have crafted JWS J
Poisoned OAuth/OIDC discovery metadata in Authlib 1.7.2 and earlier allows an attacker who controls or intercepts the me
Resource exhaustion in joserfc (versions 1.3.4-1.6.5) is possible because the RFC7797 unencoded-payload (b64=false) JWS
Authentication bypass in the joserfc Python library before 1.7.4 lets remote, unauthenticated attackers submit a JWS Gen
Authlib 0.15 through 1.9.0 can let a party holding any valid RFC 7592 registration access token read, modify, or delete
Token forgery in the Authlib Python library before 1.9.1 lets a remote, unauthenticated attacker mint HS256, HS384 or HS
EUVD-2026-108519
GHSA-c5mf-xmp2-59rc
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB