Skip to main content

Authlib EUVDEUVD-2026-108522

| CVE-2026-114620 MEDIUM
Server-Side Request Forgery (SSRF) (CWE-918)
2026-10-22 GitHub_M
5.4
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Obtain valid public client_id
  2. Delivery
    Send crafted /authorize with attacker request_uri
  3. Exploit
    Unsafe get_request_object() fetches chosen URL
  4. Execution
    Distinguish targets via error/timing oracle
  5. Impact
    Reach cloud metadata or internal-only services

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V4 - API and Web Service URL allowlisting, SSRF prevention
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Credential Access

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires ALL of the following: the RFC 9101 JWTAuthenticationRequest (JAR) extension is enabled (support_request_uri defaults to True); the integrator implemented the abstract get_request_object() hook as an unrestricted outbound HTTP fetch (e.g. requests.get(request_uri)) as shown in Authlib's own documentation; and the attacker knows a valid client_id, which is a public, non-secret identifier. The sink is reached before user or client authentication, so per the CVSS PR:N it is unauthenticated. Limiting factors that remove the risk entirely: deployments whose custom get_request_object() already applies a secure allowlist, destination/scheme controls, and retrieval limits are explicitly not affected, and the exfiltration is blind (response bodies are consumed as a JWT and never reflected), so the primitive yields an error/timing oracle for internal discovery rather than direct data exfiltration.

Impact

This is a medium-severity, highly conditional SSRF (CVSS 5.4, CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:L/A:N) whose real-world risk is substantially lower than the network/unauthenticated metrics suggest, because the flaw only becomes exploitable in deployments whose integrator implemented the abstract get_request_object() hook as an unrestricted outbound fetch - exactly as Authlib's documentation demonstrated. Authlib itself performs no network request, so the signal to weigh is AC:H (the explicit dependence on an unsafe, integrator-supplied hook plus the blind oracle nature) against PR:N (any party knowing a valid, public, non-secret client_id can reach the sink pre-authentication). No EPSS score was provided and the vulnerability is not on CISA KEV, so there is no evidence of active exploitation; the vuln.today priority is 'this_month' rather than act_now/emergency, consistent with a serious-but-not-urgent issue. A public PoC reference exists in the GHSA advisory, but it only demonstrates library-level reachability (the unvalidated URI reaching the hook) and is not verified as a working end-to-end SSRF exploit. Net: a real priority for organizations running RFC 9101 JAR with a documentation-style fetch hook, but a non-issue for deployments that already allowlist destinations - defenders must verify their own hook implementation rather than treat the CVSS alone as the risk.

Exploit ScenarioDerived

In an authorization server that enabled RFC 9101 JAR (support_request_uri defaults to True) and implemented get_request_object() as the documented requests.get(request_uri), a remote attacker who knows any valid public client_id sends an unauthenticated /authorize request with request_uri set to http://169.254.169.254/ or an internal host. The server fetches the attacker-chosen URL, and because a falsy fetch raises InvalidRequestUriError while a fetched non-JWT body raises InvalidRequestObjectError, the differing errors plus response timing form an oracle for blind internal host and port discovery. A public PoC reference in the advisory demonstrates the unvalidated URI reaching the hook pre-authentication, though it is not verified as a working network exploit.

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

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

Alert me

AnalysisAIv1 – Oct 22, 2026

Server-side request forgery in Authlib's RFC 9101 JWTAuthenticationRequest (JAR) extension lets unauthenticated remote attackers who know any valid public client_id drive the authorization server's outgoing fetch of an attacker-chosen request_uri. The flaw only materialises in deployments that implemented the abstract get_request_object() hook as an unrestricted outbound fetch, exactly as Authlib's own docstrings demonstrated; the library itself performs no network request, so installations whose override already enforces a scheme/destination allowlist and retrieval limits are unaffected. Affected releases are 1.6.0 through 1.8.x, fixed in 1.9.0, and a public PoC reference exists (demonstrating the unvalidated URI reaching the hook with no network egress); it is not verified as working exploit code, and there is no KEV or active-exploitation signal. Impact is a blind primitive: fetched bodies are consumed as a JWT and never reflected, so attackers get an error-type and timing oracle for internal host and port discovery rather than direct data exfiltration.

RemediationAI

Vendor-released patch: upgrade Authlib to 1.9.0 or later, available from https://github.com/authlib/authlib/releases/tag/v1.9.0 and detailed in advisory https://github.com/authlib/authlib/security/advisories/GHSA-x4rv-c3wx-4cr8. The 1.9.0 changes introduce a validate_request_uri(request_uri, client) policy method that is consulted before get_request_object(), defaulting to rejecting every URI, so any application that genuinely supports request_uri must now implement that policy explicitly; they also tighten the get_request_object() contract to require HTTPS-only retrieval, no redirect following, blocking of private destinations including resolved IPs (DNS rebinding), response size and time limits, and an application/oauth-authz-req+jwt media-type check. If upgrading immediately is not possible, deployments can eliminate the exposure without the library fix by overriding get_request_object() to reject all request_uri values or by hosting request objects locally instead of fetching them (side effect: JAR clients that rely on request_uri will fail with invalid_request_uri, so any legitimately registered request_uris must be served from a controlled store), by disabling the RFC 9101 extension or setting support_request_uri to False (side effect: JAR request_uri support stops entirely, though request-object-by-value continues to work), and by enforcing the existing request_uris client metadata and require_request_uri_registration server metadata in the override so only pre-registered URIs are fetched. Any outbound fetch that remains should use an explicit scheme/host allowlist, no redirects, short timeouts and a bounded response size; these controls remove the discovery oracle but add latency and maintenance overhead. Because the fix commit also alters id_token nonce handling around the nonce_supported claim, retest OIDC client flows after upgrading.

Affected VersionsENISA

authlib < 1.9.0

Affected Packages

euvd authlib fix: 1.9.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

RFC 9101 JWT-Secured Authorization Requests let a client pass a request_uri to the authorization endpoint so the server retrieves a signed request object. In authlib/oauth2/rfc9101/authorization_server.py the extension registers on the before_get_authorization_grant hook, runs before any user or client authentication, and enables request_uri handling by default (support_request_uri=True). The only precondition is that client_id names an existing client, and client identifiers are public, non-secret values. The raw parameter is forwarded unfiltered to get_request_object(), an abstract hook (CWE-918: server-side request forgery) that Authlib leaves to integrators and documents as requests.get(request_uri). Notably the pre-registration model the extension should consult already exists in the library - request_uris as client metadata (rfc7591/claims.py) and require_request_uri_registration as server metadata (rfc8414/models.py) - but the rfc9101 package never references either, and none of the RFC 9101 Section 10.4.1 controls (unexpected-location check, application/oauth-authz-req+jwt media-type check, retrieval timeout, no recursive GET) is implemented. Two distinguishable outcomes give the blind SSRF its oracle: a falsy fetch result raises invalid_request_uri while a successfully fetched non-JWT body raises invalid_request_object, with response timing as a secondary signal. The 1.9.0 fix (PR #949) adds a validate_request_uri() policy method invoked before the hook with a default of rejecting every URI, and rewrites the hook docstring to demand HTTPS, no redirects, resolved-IP destination checks, response size/time limits and media-type validation.

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 5.4 MEDIUM
AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:L/A:N
vuln.today AI 5.4 MEDIUM

Unauthenticated via public client_id (PR:N); AC:H because exploitation depends on an integrator's unsafe fetch hook and a blind oracle; scope changes as the server reaches other systems; blind SSRF gives only low C/I.

3.1 AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:L/A:N
4.0 AV:N/AC:H/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:L/SI:L/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
None
Scope
Changed
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, Authlib's RFC 9101 JWTAuthenticationRequest passes the unauthenticated, client-controlled request_uri parameter to the abstract get_request_object() hook before applying a destination or registration policy; the hook itself performs no network request, while the documentation demonstrates an unrestricted HTTP fetch. In deployments whose integrator implements that hook as an unrestricted outbound fetch, a remote attacker who knows a valid public client identifier can make the authorization server request internal, link-local, or otherwise unintended URLs and can distinguish fetch outcomes through different error responses and timing. Deployments whose custom hook already applies a secure allowlist, destination controls, and retrieval limits are not affected. The JWTAuthenticationRequest implementation in authlib/oauth2/rfc9101/authorization_server.py forwards request_uri to get_request_object() before an application-approved retrieval policy accepts the destination. This issue is fixed in version 1.9.0.

Threat Intelligence Overview

EPSS Score
0.3%
Top 80% exploitable
Prevalence
Medium
widely-used Python OAuth/OIDC library, but not ubiquitous infrastructure
Social Media
1
Sightings
Data Quality
6 sources
Confidence: High

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.3%
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· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact· derived
Medium

Priority Score

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

Attack Technique

Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.

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

CVE-2026-114615 HIGH
7.4 Oct 22

Authentication bypass in Authlib's deprecated-but-still-shipped authlib.jose module (1.3.1 through 1.8.0, fixed in 1.9.0

CVE-2026-114618 MEDIUM
6.8 Oct 22

Authlib's default RFC 7523 JWT bearer grant, in all releases prior to 1.9.0, fails to bind an incoming JWT assertion to

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