Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain valid public client_id
-
DeliverySend crafted /authorize with attacker request_uri
-
ExploitUnsafe get_request_object() fetches chosen URL
-
ExecutionDistinguish targets via error/timing oracle
-
ImpactReach 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
Affected Packages
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
AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:L/A:N
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.
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, 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
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
Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.
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
Authentication bypass in the joserfc Python library before 1.7.4 lets remote, unauthenticated attackers submit a JWS Gen
Token forgery in the Authlib Python library before 1.9.1 lets a remote, unauthenticated attacker mint HS256, HS384 or HS
Authentication bypass in Authlib's deprecated-but-still-shipped authlib.jose module (1.3.1 through 1.8.0, fixed in 1.9.0
Authlib's default RFC 7523 JWT bearer grant, in all releases prior to 1.9.0, fails to bind an incoming JWT assertion to
EUVD-2026-108522
NVD
CVE.org
EPSS
GitHub
VulDB
Exploit-DB