CVE-2026-114618
Medium · 6.8CVSS
6.8
EPSS
0.4%
Published
Oct 22, 2026
CISA due date
—
Cloudanix analysis
A login library used by many apps failed to properly check which service a security token was meant for, letting attackers reuse a token from one app on another when the apps shared the same security key.
- Exploitation
- Remote Authenticated
- Attacker needs
- Low Privilege
- Complexity
- Moderate
- Impact
- Privilege Gain
- Component
- Library
- Class
- Authentication Bypass
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Default JWTBearerGrant.get_audiences() returns empty list so verify_claims() accepts any aud claim when the signing key is shared across trust boundaries, allowing cross-service assertion replay.
Why it matters to the business
Organizations using Authlib defaults for JWT bearer grants face unauthorized access token issuance across service boundaries until they upgrade, increasing exposure window for shared-key deployments.
How an attack unfolds
Attacker obtains a valid JWT assertion issued for a different service that shares the signing key, presents it to the vulnerable authorization server using the default grant, and receives an access token without audience validation.
How to fix it
Upgrade Authlib to version 1.9.0 or later. Implementations that override get_audiences() to return the server's valid audience identifiers are unaffected.
How to confirm the fix worked
Confirm Authlib version is 1.9.0 or newer; review custom JWTBearerGrant subclasses to ensure get_audiences() returns explicit audience values rather than relying on the default empty list.
Typical attack path
- Identify target authorization server using Authlib <1.9.0 with shared signing key and default JWTBearerGrant
- Obtain legitimate JWT assertion issued for another service
- Send assertion to the target server's token endpoint
- Receive access token valid for the target service
How to detect it
Search application and authentication logs for JWT assertions presented to token endpoints where the aud claim does not match expected server identifiers; review token issuance events from JWTBearerGrant paths.
What your security team should do
- Upgrade all Authlib deployments to 1.9.0 immediately given the authentication bypass
- Audit all JWTBearerGrant usages for shared signing keys across services
- Add explicit audience validation in custom grant classes where upgrade is delayed
The record
Authlib is a Python library which builds OAuth and OpenID Connect servers. Prior to 1.9.0, the default RFC 7523 JWTBearerGrant.get_audiences() returns an empty list, causing JWTBearerGrant.verify_claims() to require only that an aud claim exists without matching the current authorization server. An attacker holding a legitimate assertion for another service can present it to a server that shares the signing key and uses the default grant, obtaining an access token across a trust boundary. Implementations that override get_audiences() with the server's valid audience identifiers are not affected. This issue is fixed in version 1.9.0.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|
Related vulnerabilities
- CVE-2026-63398 Coop is an open source review and moderation tool from ROOST. CWE-287
- CVE-2026-116239 In server mode pgAdmin 4 keeps an account per authentication source, so the same username… CWE-287
- CVE-2026-62264 PDF Reader MCP is a Model Context Protocol server for reading PDF documents. CWE-287
- CVE-2026-61739 SOCFortress CoPilot focuses on providing a single pane of glass for all your security… CWE-287
- CVE-2026-110799 Vvveb is a powerful and easy to use CMS with page builder to build websites, blogs or… CWE-287
- CVE-2026-119572 Traefik from 3.7.0-ea.1 before 3.7.15 contains an authentication bypass vulnerability in… CWE-287
- CVE-2026-118194 The Page and Post Restriction plugin for WordPress is vulnerable to Authentication Bypass… CWE-287
- CVE-2026-114443 The Security Plugin, Firewall & Malware Scanner with Auto Removal WordPress plugin before… CWE-287