Skip to main content

Authlib EUVDEUVD-2026-108519

| CVE-2026-114617 MEDIUM
Authentication Bypass by Capture-replay (CWE-294)
2026-10-22 GitHub_M GHSA-c5mf-xmp2-59rc
4.2
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Capture victim ID token bearing nonce_supported:false
  2. Exploit
    Replay token into attacker-controlled session
  3. Execution
    parse_id_token() reads claim and skips nonce check
  4. Impact
    RP 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

authlib < 1.9.0

Affected Packages

pypi authlib fix: 1.9.0

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

Vendor (GitHub_M) PRIMARY 4.2 MEDIUM
AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N
vuln.today AI 6.8 MEDIUM

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.

3.1 AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N
4.0 AV:N/AC:H/AT:N/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N
Red Hat 6.8 MEDIUM

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
Required
Scope
Unchanged
Confidentiality
Low
Integrity
Low
Availability
None

Lifecycle Timeline

1
Patch available
Oct 22, 2026 - 22:03 EUVD

DescriptionCVE.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

EPSS Score
0.2%
Top 92% exploitable
Prevalence
Medium
popular Python OAuth/OIDC library, but vulnerable flows are a subset of deployments
Threat Intel
1
1 source
Social Media
1
Sightings
Data Quality
5 sources
Confidence: Medium
EUVD NVD CVE.org EPSS Vulnrichment GHSA Vendor CIRCL GitHub VulDB

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

21
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +21
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

CVE-2025-68158 HIGH POC
8.8 Jan 08

Authlib is a Python library which builds OAuth and OpenID Connect servers. [CVSS 5.7 MEDIUM]

CVE-2026-28802 HIGH POC
7.7 Mar 06

Authentication bypass in Authlib (Python OAuth/OpenID Connect library) versions 1.6.5 through 1.6.6 allows remote attack

CVE-2025-59420 HIGH POC
7.5 Sep 22

Authlib is a Python library which builds OAuth and OpenID Connect servers. Rated high severity (CVSS 7.5), this vulnerab

CVE-2025-61920 HIGH POC
7.5 Oct 10

Authlib's JOSE/JWS verification path (through 1.6.4, with 1.6.5 as the fix) decodes attacker-supplied JWT/JWS header and

CVE-2024-37568 HIGH POC
7.5 Jun 09

lepture Authlib before 1.3.1 has algorithm confusion with asymmetric public keys. Rated high severity (CVSS 7.5), this v

CVE-2025-62706 MEDIUM POC
6.5 Oct 22

Unbounded DEFLATE decompression in Authlib's JWE zip=DEF handling (authlib/jose/rfc7518/jwe_zips.py) lets a small, valid

CVE-2026-96760 CRITICAL
9.8 Sep 28

Signature verification bypass in Authlib 1.7.2 and earlier allows unauthenticated remote attackers to have crafted JWS J

CVE-2026-104056 CRITICAL
9.8 Oct 01

Poisoned OAuth/OIDC discovery metadata in Authlib 1.7.2 and earlier allows an attacker who controls or intercepts the me

CVE-2026-48990 MEDIUM POC
5.3 Jun 17

Resource exhaustion in joserfc (versions 1.3.4-1.6.5) is possible because the RFC7797 unencoded-payload (b64=false) JWS

CVE-2026-102946 CRITICAL
9.1 Oct 15

Authentication bypass in the joserfc Python library before 1.7.4 lets remote, unauthenticated attackers submit a JWS Gen

CVE-2026-116672 HIGH
8.8 Oct 27

Authlib 0.15 through 1.9.0 can let a party holding any valid RFC 7592 registration access token read, modify, or delete

CVE-2026-114616 HIGH
7.4 Oct 22

Token forgery in the Authlib Python library before 1.9.1 lets a remote, unauthenticated attacker mint HS256, HS384 or HS

Vendor StatusVendor

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy