Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify Authlib verifier resolving empty HMAC secret
-
ExploitCraft JWT with arbitrary attacker claims
-
ExecutionCompute deterministic HS256 signature with empty key
-
ImpactSubmit forged token for authenticated access
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Authentication mechanism validation
MITRE ATT&CK
2 techniques across 2 tactics: Defense Evasion, 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 the deploying Authlib-based verifier to resolve its symmetric (oct) HMAC verification key to an empty string or empty bytes at runtime - for example os.environ.get('JWT_SECRET', ''), a config/database value whose default is '', or a key-resolver returning '' on a lookup miss - and the token must use an HMAC algorithm (HS256, HS384 or HS512). Under those conditions a remote unauthenticated attacker (PR:N) can forge valid tokens, because OctKey.import_key/validate_raw_key in versions <1.9.1 perform only a type check and never reject zero-length material, so hmac.new(b'', ...) yields a publicly reproducible digest. The key LIMITING factor (reflected in AC:H) is that this is NOT a default-configuration flaw: applications that always supply a non-empty secret are not exploitable, and asymmetric (RS/ES) verification paths are unaffected. |
| Impact | This is a genuine authentication-bypass flaw but one whose real-world risk is strongly gated by a deployment precondition rather than being universally exploitable. The supplied CVSS vector (AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N) correctly captures this: network reach, no privileges and no user interaction, but AC:H because exploitation requires the victim application to verify tokens with a zero-length HMAC secret. Note a data conflict: the input header lists CVSS 7.4 while the GHSA advisory and the provided vector compute to 8.1 - the vector string, not the 7.4 base figure, governs this analysis. No EPSS score and no KEV listing are present in the input, and the vuln.today decision label is 'this_week' (not act_now/emergency), so there is no signal of active or widespread exploitation; this is a serious but not emergency-grade item. A public PoC reference exists in the GHSA advisory and the fix-commit test, but it is a conceptual/prose reproduction, not verified weaponized exploit code. The decisive variable is configuration: applications that always load a real secret are not affected, so defenders should prioritize auditing their Authlib secret-resolution paths rather than treating every Authlib deployment as exposed. |
| Exploit ScenarioDerived | An OAuth 2.0 resource server or OIDC relying party built on Authlib resolves its HMAC verification secret from a source that can be empty at runtime - e.g. os.environ.get('JWT_SECRET', ''), a config/DB column defaulting to '', or a key resolver that returns '' on a miss. A remote unauthenticated attacker crafts a JWT with arbitrary claims (elevated scopes or another user's subject), computes the deterministic HS256/384/512 signature using an empty key, and Authlib accepts the forged token as authentic. The GHSA advisory documents a prose reproduction and the fix commit adds a forging test, but no weaponized exploit is published. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 22, 2026
Token forgery in the Authlib Python library before 1.9.1 lets a remote, unauthenticated attacker mint HS256, HS384 or HS512 tokens carrying arbitrary claims that Authlib accepts as genuinely signed, whenever the deploying application's HMAC verification key resolves to an empty string or empty bytes (for example an unset environment variable defaulted to '', a config column defaulting to '', or a key-resolver returning '' on a lookup miss). The exposure is strongly gated by that deployment precondition: applications that always supply a non-empty secret are not exploitable, and asymmetric RS/ES verification paths are unaffected, which is why the vector carries AC:H rather than a universally applicable rating. No public exploit code has been identified at time of analysis (the advisory supplies a prose reproduction description rather than weaponized code), CISA KEV does not list this issue, and the vendor has released 1.9.1 as the fix.
RemediationAI
Vendor-released patch: upgrade to Authlib 1.9.1 (release tag v1.9.1), which adds a check in OctKey.import_key raising ValueError("oct key material must not be empty") before any key reaches hmac.new, and which raises the minimum dependency to joserfc>=1.6.8 - the same guard the maintainer's joserfc library already implements, so deployments pinning joserfc should move to 1.6.8 or later as well. The advisory and commit are at https://github.com/authlib/authlib/security/advisories/GHSA-8m4g-j4wp-wgcg and https://github.com/authlib/authlib/commit/4ff30db442c70e29486e1982cb0ad37c037f5f4b. Because the flaw only manifests when the application resolves its HMAC key to an empty value, the complementary control is to make key resolution fail closed: ensure the secret lookup cannot return '' or b'' (no os.environ.get('JWT_SECRET', '') defaults, no config columns defaulting to empty, no resolver returning '' on a miss) and abort startup or reject the request if the resolved key is zero-length. The trade-off is that strict startup validation will hard-fail misconfigured deployments that previously started and silently accepted forged tokens, which is the intended behavior but must be staged into rollouts; applications that verify only with asymmetric RS/ES keys are unaffected by the vulnerable code path and need the library upgrade only for hygiene.
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
The defect sits in Authlib's JOSE layer, in authlib/jose/rfc7518/oct_key.py and authlib/jose/rfc7518/jws_algs.py, and is classified primarily as CWE-287 (Improper Authentication) with CWE-326 (Inadequate Encryption Strength) and CWE-1391 (Use of Weak Credentials) as related weaknesses. OctKey.validate_raw_key performs only a type check (isinstance(key, bytes)) and OctKey.import_key rejects solely material beginning with known unsafe PEM/SSH prefixes, so a zero-length b'' or '' passes every gate; get_op_key then returns the raw key without any length validation. HMACAlgorithm.prepare_key calls OctKey.import_key, and sign/verify feed the resulting op key straight into hmac.new(op_key, msg, hash_alg) and hmac.compare_digest. With an empty key this degrades to hmac.new(b'', ...), producing a deterministic digest that any party can reproduce because the key contributes no secret entropy - hence a valid-looking signature for arbitrary header and payload. RFC 7518 section 3.2 requires an HMAC key at least as long as the hash output, and the upstream fix adds exactly that guard. This is a member of a cross-language empty-HMAC-key family already assigned CVE-2026-44351 (fast-jwt, npm) and CVE-2026-45363 (ruby-jwt, RubyGems), and it is distinct from Authlib's earlier JWT advisories - CVE-2026-27962/GHSA-wvwj-cvrp-7pv5 (JWS JWK header injection, the key=None case), CVE-2026-28802/GHSA-7wc2-qxgw-g8gg (alg:none blank-signature bypass) and GHSA-5357-c2jx-v7qh (asymmetric/symmetric algorithm confusion) - none of which reject zero-length oct material. The maintainer's newer joserfc library already raises ValueError on empty oct material and warns below 112 bits, PyJWT raises InvalidKeyError for zero-length HMAC keys, and jwcrypto enforces an RFC 7518 minimum length; the guard was simply missing from the older, far more widely deployed Authlib rfc7518 package.
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:U/C:H/I:H/A:N
AV:N and PR:N as the attacker is remote and unauthenticated; AC:H because exploitation depends on the target application verifying with an empty secret; C:H/I:H for full token forgery, A:N as availability is unaffected.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Authlib is a Python library which builds OAuth and OpenID Connect servers. Prior to 1.9.1, Authlib's OctKey.import_key() and HMAC signing and verification path accept zero-length key material. If an application's secret lookup can return an empty string or empty bytes, a remote attacker can compute the deterministic HS256, HS384, or HS512 signature for arbitrary token claims and have Authlib treat the token as authentic. This issue is fixed in version 1.9.1.
Technical POC Analysis
CWE-287 (Improper Authentication), with CWE-326 and CWE-1391 as secondary classifications.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
CVE-2026-114616 is a high-severity flaw in the Authlib Python library (versions before 1.9.1) that allows token forgery when an application's HMAC secret is empty, potentially enabling unauthorized access to systems relying on Authlib for authentication. Leadership should prioritize remediation because affected applications with misconfigured secrets could be compromised, though the risk is significantly lower for properly configured deployments.
Apply vendor patch.
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
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
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
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
Server-side request forgery in Authlib's RFC 9101 JWTAuthenticationRequest (JAR) extension lets unauthenticated remote a
EUVD-2026-108517
NVD
CVE.org
EPSS
GitHub
Exploit-DB