Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessRegister public client via dynamic registration
-
DeliverySubmit http://localhost:80@attacker.example redirect URI
-
ExploitUserinfo prefix bypasses is_secure_transport TLS guard
-
ExecutionVictim initiates RP-initiated logout
-
ImpactCleartext 302 redirect leaks state parameter
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V3 - Web Frontend Security Redirect URL validation
MITRE ATT&CK
1 technique across 1 tactic: Initial 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 a deployment that relies on is_secure_transport() to reject cleartext non-loopback URLs supplied by an external party, on Authlib versions >=0.13 and <=1.7.2. The primary realistic path is an OpenID Provider with OIDC dynamic client registration AND RP-Initiated Logout enabled, where a public client (token_endpoint_auth_method 'none') registers a post_logout_redirect_uris entry of the form http://localhost:80@attacker.example/cb (also http://localhost:@attacker.example/, http://127.0.0.1:...@attacker.example/, http://[::1]:...@attacker.example/). A secondary path is a relying party calling AuthorizationServerMetadata.validate() on a discovery document the attacker can influence. Limiting factors: the dynamic-registration/RP-logout features are not enabled by default and must be configured; the end-user must actually initiate the logout flow (UI:R) for the redirect to fire; the flaw does not bypass OAuth redirect-URI exact matching and yields no token forgery or authentication bypass. The AUTHLIB_INSECURE_TRANSPORT env var is unrelated to the bypass. |
| Impact | This is a genuinely low-priority issue and the signals are consistent rather than conflicting. The CVSS 3.1 vector (AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:N/A:N, base 2.6) and the vuln.today 'monitor' decision label both point to minor severity, matching the vendor's own framing of a defense-in-depth / spec-conformance failure. The attack is network-reachable but gated by high complexity (crafted userinfo URL plus a non-default provider configuration), low privileges, and required user interaction (the victim must initiate logout). Impact is limited to confidentiality (C:L - the OAuth 'state' value sent over cleartext) with no integrity or availability effect; the advisory explicitly states it does NOT bypass redirect-URI exact matching and does NOT forge tokens or authenticate users. There is no CISA KEV listing and no EPSS score in the supplied data, so there is no evidence of active exploitation; this is 'no public exploit identified' in the KEV sense, though a detailed proof-of-concept is published in the GHSA advisory. Net: a real, confirmed bug worth patching on a normal maintenance cadence, not an emergency. |
| Exploit ScenarioDerived | An OpenID Provider built on Authlib that enables OIDC dynamic client registration and RP-Initiated Logout lets a public client register a post_logout_redirect_uris value of http://localhost:80@attacker.example/cb; is_secure_transport() accepts it because the 'http://localhost:' prefix matches the userinfo component rather than the real host (evil/attacker.example), so when a victim later logs out the provider 302-redirects their browser to the attacker's cleartext endpoint carrying the state parameter. A working proof-of-concept is published in the GHSA advisory. The network vector with AC:H and UI:R means exploitation depends on the non-default config and on the user initiating logout. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 22, 2026
Authlib's is_secure_transport() TLS guard can be satisfied by a plain-HTTP URL whose userinfo component merely looks like a loopback host, so crafted values such as http://localhost:80@attacker.example/cb are treated as secure even though the parsed host is an external system. The flaw affects authlib versions 0.13 through 1.7.2 and matters where the check is trusted to reject externally supplied URLs - notably OIDC dynamic client registration combined with RP-Initiated Logout (where a public client can register a cleartext non-loopback post_logout_redirect_uris target) and relying parties that call AuthorizationServerMetadata.validate() on an attacker-influenced discovery document. Per the assessed vector (AV:N/AC:H/PR:L/UI:R) the outcome is limited to cleartext redirection and acceptance of cleartext endpoints with low confidentiality impact, requires configured features and end-user logout interaction, and does not bypass OAuth redirect-URI exact matching or forge tokens; a public PoC reference exists in the project's advisory, but it is not verified as working end-to-end exploit code, and there is no CISA KEV entry - the decision label is monitor.
RemediationAI
Vendor-released patch: Authlib 1.8.0 (commit 95ad1f90acf0c7b9cf2a8f25e6eb3f1135b8dc70), published at https://github.com/authlib/authlib/releases/tag/v1.8.0, with the advisory at https://github.com/authlib/authlib/security/advisories/GHSA-jj7h-c3hg-m23x; upgrade any installation in the 0.13 through 1.7.2 range. The patched function parses the URI with urlsplit() and accepts only https, or http with a parsed hostname of localhost or an address for which ipaddress.ip_address(...).is_loopback is true, so the loopback exemption no longer needs an explicit port. If upgrading is deferred, apply the advisory's guidance at the affected call sites: reject any URI whose parsed username or password is non-empty before passing it to OIDC RP-Initiated Logout registration, authorization-server metadata validation and end_session_endpoint checks, with the trade-off that legitimate loopback redirect URIs containing userinfo (unusual in practice) will also be refused; additionally restrict or disable dynamic client registration for public clients (token_endpoint_auth_method "none") where post_logout_redirect_uris are accepted, acknowledging that this removes a feature some OIDC deployments rely on for RP-Initiated Logout. Do not rely on the AUTHLIB_INSECURE_TRANSPORT environment variable as a mitigation, as it is unrelated to this bypass and globally disables the transport check.
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
The weakness sits in authlib/common/security.py, where is_secure_transport() enforces the OAuth 2.0 / OIDC requirement that endpoints use TLS while allowing the RFC 8252 §7.3 exemption for loopback http:// URIs. The old implementation lower-cased the whole string and ran str.startswith() against a fixed tuple ("https://", "http://localhost:", "http://127.0.0.1:", "http://[::1]:"). Per RFC 3986 §3.2 an authority is [ userinfo "@" ] host [ ":" port ], so in http://localhost:80@evil.example/cb the userinfo is "localhost:80" and the host is evil.example; the raw prefix still matches, and the trailing colon intended to force a host:port shape is satisfied by the user:password separator. None of the consumers independently reject userinfo: authlib/oidc/rpinitiated/registration.py validates post_logout_redirect_uris after an is_valid_url() check that only requires a scheme and hostname; authlib/oauth2/rfc8414/models.py uses the same helper for issuer, authorization_endpoint, token_endpoint, jwks_uri, registration_endpoint, revocation_endpoint and introspection_endpoint; authlib/oidc/rpinitiated/discovery.py uses it for end_session_endpoint; and the rfc6749/rfc5849 error modules use it for redirect_uri rendering. The provided CWE is CWE-601 (URL redirection to an untrusted site), which matches the open-redirect consequence at the registration sink; the upstream advisory classifies the root cause as CWE-319/CWE-693 (cleartext transmission / improper restriction of operations within a security boundary). The fix in 1.8.0 replaces the prefix match with urlsplit() plus ipaddress.ip_address(...).is_loopback, returning True only for https, or for http with hostname localhost or a loopback IP, and drops the requirement for an explicit port; the commit also adds tests covering userinfo lookalikes, bracketed IPv6 forms and non-loopback IPs such as 0.0.0.0.
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:L/UI:R/S:U/C:L/I:N/A:N
Network-reachable but needs a crafted userinfo URL plus non-default provider config (AC:H), a registered public client (PR:L), and victim-initiated logout (UI:R); only the cleartext state leak gives C:L, no I/A.
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. From 0.13 until 1.8.0, authlib.common.security.is_secure_transport() uses a textual prefix comparison for loopback HTTP exemptions, so a URL whose userinfo begins with a loopback host can be accepted even when its parsed host is an external non-loopback system. An external party able to supply a URL to OIDC RP-Initiated Logout registration, authorization-server metadata validation, or another call site can bypass the TLS-required guard and cause cleartext redirection or acceptance of cleartext endpoints. The issue does not bypass redirect URI exact matching and does not by itself forge tokens or authenticate users. The vulnerable authlib.common.security.is_secure_transport() implementation in authlib/common/security.py misinterprets the userinfo component before OIDC RP-Initiated Logout dynamic client registration and other consumers enforce transport security. This issue is fixed in version 1.8.0.
Blast Radius
ecosystem impact- 24 pypi packages depend on authlib (18 direct, 6 indirect)
Ecosystem-wide dependent count for version 1.8.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
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-108513
GHSA-jj7h-c3hg-m23x
NVD
CVE.org
EPSS
Exploit-DB