Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSend tokens with unknown/varying kid headers
-
ExploitUnverified header read bypasses JWKS cache
-
ExecutionEach miss forces fresh JWKS fetch + JSON parse
-
ImpactAmplified outbound requests exhaust victim and JWKS-endpoint resources
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V2 - Validation and Business Logic Resource allocation limits
MITRE ATT&CK
1 technique across 1 tactic: Impact 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 target application to validate JWTs using PyJWKClient (e.g. get_signing_key_from_jwt) against a remotely hosted JWKS endpoint, and to expose that validation path to attacker-supplied tokens. No authentication and no valid token are needed because the 'kid' is taken from the unverified token header (verify_signature=False), so any attacker-chosen unknown kid triggers a forced refresh. JWKS caching being enabled does NOT protect the app - in 2.13.0 even a repeated identical unknown kid re-fetches on every call. Limiting factors: the application must actually use the remote-JWKS PyJWKClient pattern (apps using static/HMAC keys or local key sets are unaffected), and impact is amplification/resource consumption rather than code execution or data exposure; the fix also allows setting cooldown_duration=0 to disable the new throttle, which would reintroduce exposure. |
| Impact | This is a genuine but moderate-severity availability issue, not a critical priority. The CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) correctly reflects a remote, low-complexity, unauthenticated resource-exhaustion flaw (CWE-770) with no confidentiality or integrity impact. Signals are largely consistent: SSVC marks Exploitation=poc, Automatable=yes, and Technical Impact=partial, which aligns with a verified proof-of-concept in the GHSA advisory and an amplification (not full-compromise) outcome. The CVSS A:H rating sits in mild tension with SSVC's 'partial' technical impact - the real effect is request amplification against the victim app and its JWKS endpoint rather than a guaranteed total outage, so A:H may overstate impact. EPSS is low (0.35%, 27th percentile) and the CVE is NOT on CISA KEV, indicating no evidence of widespread active exploitation despite public PoC availability. Note also that this is explicitly an incomplete-fix follow-up to CVE-2026-48524 (fixed in 2.13.0); the 2.13.0 fix closed one amplification path but did not add the negative-cache/rate-limit mitigation, so environments that patched to 2.13.0 remain exposed and must upgrade to 2.14.0. |
| Exploit ScenarioDerived | An attacker repeatedly sends unauthenticated requests carrying JWTs whose header 'kid' is unknown (or varies) to an application that validates tokens via PyJWKClient.get_signing_key_from_jwt against a remote JWKS endpoint. Because the header is read with verify_signature=False and unknown kids force a cache-bypassing refresh (lru_cache does not cache the raised exception), each request triggers a fresh outbound JWKS HTTP fetch plus full JSON parse, letting low-volume attacker traffic amplify into sustained load on both the victim server and the JWKS provider. A working proof-of-concept verified on 2.13.0 is published in the GHSA advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv2 – Oct 07, 2026
Unauthenticated attackers can amplify outbound HTTP traffic from any application that validates JWTs with PyJWT's PyJWKClient against a remote JWKS endpoint, because prior to 2.14.0 an unknown 'kid' in the token header forces a full JWKS refresh on every call with no negative cache or minimum refresh interval. One attacker request produces one outbound JWKS fetch plus full JSON parsing on the victim server, and because the 'kid' is read from the unverified token header, no valid token or authentication is required - even enabling key caching does not help, since a repeated identical unknown 'kid' re-fetches every time. A verified proof-of-concept exists (CISA SSVC records exploitation as 'poc', no CISA KEV listing), so this is treated as publicly available exploit code; EPSS is low (0.35%, 27th percentile). The issue is fixed in 2.14.0, which introduces a 30-second cooldown between forced refreshes.
Earlier versions of this analysis (1)
Unauthenticated request amplification in PyJWT's PyJWKClient (versions prior to 2.14.0) allows remote attackers to force repeated outbound JWKS fetches by submitting tokens with unknown or rapidly varying 'kid' header values. Because the library maintained no negative cache and no minimum refresh interval, every cache miss triggered a fresh HTTP request to the configured JWKS endpoint, letting modest inbound token traffic amplify into a disproportionate volume of outbound requests against both the application and its key provider. Impact is availability-only (CVSS 5.3, AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L), exploitable only where PyJWKClient fetches from a remote JWKS with caching enabled; there is no public exploit identified at time of analysis, though the flaw is trivially triggered by any crafted token.
RemediationAI
Vendor-released patch: 2.14.0. Upgrade PyJWT to 2.14.0 (commit ba4853a75fb9676362da17f67d0f64bd18afd4e1), which enables a default cooldown_duration of 30 seconds that permits at most one forced JWKS refresh per unknown-'kid' burst; review the advisory at https://github.com/jpadilla/pyjwt/security/advisories/GHSA-2gx3-rcp4-g85q and the release notes at https://github.com/jpadilla/pyjwt/releases/tag/2.14.0. Because the cooldown is bypassed when key caching is disabled, ensure cache_keys=True (JWK set cache enabled) in production, and do not set cooldown_duration=0, which disables the new throttle entirely and reintroduces the exposure - the trade-off is that a newly rotated signing key may take up to the cooldown period to become usable, so operators who expect immediate key rotation should lower cooldown_duration rather than zero it out. If upgrading is not immediately possible, compensating controls include placing a caching reverse proxy or rate limiter in front of the JWKS endpoint, restricting egress from the verifier to the expected JWKS host, and capping outbound request rates at the network layer so that per-token validation misses cannot multiply into backend load; note that these controls only dampen the amplification and do not remove the per-request refresh behavior in 2.13.0 and earlier.
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
JSON Web Key Sets (JWKS) let token issuers publish rotating signing keys that verifiers fetch over HTTP and select by the 'kid' (key ID) header of an incoming JWT. PyJWT's PyJWKClient implements this pattern: get_signing_key_from_jwt decodes the token with verify_signature=False purely to read the unverified 'kid', then looks it up in the cached key set. In versions up to and including 2.13.0, a lookup miss calls get_signing_keys(refresh=True), which bypasses jwk_set_cache unconditionally and issues a fresh fetch_data() HTTP request. No rate limit, negative cache, or minimum refresh interval exists, and because lru_cache does not memoize raised exceptions, the same unknown 'kid' re-fetches on every invocation even against an unexpired cache. The root cause is CWE-770 (Allocation of Resources Without Limits or Throttling) - attacker-controlled input drives an unbounded, unthrottled resource-consumption path. This is an incomplete fix of CVE-2026-48524 (GHSA-fhv5-28vv-h8m8), where 2.13.0 stopped fetch_data() from clearing the cache on fetch errors but never added the throttling the advisory implied. The 2.14.0 patch (commit ba4853a75fb9676362da17f67d0f64bd18afd4e1) adds a 'cooldown_duration' parameter (default 30 seconds) tracked via _last_successful_fetch and time.monotonic, guards the refresh path with a threading.RLock, and skips the forced refresh while a cooldown is active.
Know when Pyjwt 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:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Remote, unauthenticated, low-complexity request amplification with no confidentiality/integrity impact; impact is partial resource exhaustion (SSVC 'partial'), so A:L rather than A:H.
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
Primary rating from Vendor (GitHub_M).
CVSS VectorNVD
Lifecycle Timeline
4DescriptionNVD
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT get_signing_key_from_jwt is affected because unknown kid misses force refreshes without a negative cache or minimum refresh interval. This occurs when unauthenticated tokens repeatedly use the same unknown kid or varying kid values absent from the cached JWKS. As a result, each cache miss causes PyJWKClient to refresh the JWKS. Consequently, attacker traffic can amplify outbound requests to the configured JWKS endpoint. This issue is fixed in version 2.14.0.
Blast Radius
ecosystem impact- 16 pypi packages depend on pyjwt (15 direct, 1 indirect)
Ecosystem-wide dependent count for version 2.14.0.
Technical POC Analysis
Note on scoring: the supplied advisory records CVSS v3.1 5.3 (Moderate), AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L, while the CVE header supplied lists 7.5 HIGH.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Organizations using PyJWT versions prior to 2.14.0 in applications that validate JWTs against remote JWKS endpoints face a high-severity availability risk: attackers can force repeated outbound requests and JSON parsing, potentially degrading authentication services and increasing egress costs. Public exploit code exists, but there is no confirmed active exploitation in CISA KEV, and the vendor has released a patch in 2.14.0. Leadership should prioritize identifying and upgrading affected services because authentication is often business-critical.
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
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
Forged HS256 JSON Web Tokens can be accepted as authentic by PyJWT (pip package PyJWT) versions 2.13.0 through 2.13.x wh
Improper validation in PyJWT 2.1.0 through 2.14.0 allows an attacker who already holds a stolen sender-constrained (DPoP
Denial of service in PyJWT 2.9.0 through 2.13.0: a single malformed RSA JWK embedded in a JWK Set aborts construction of
Unauthenticated denial of service in the PyJWT Python library (versions 2.0.0a1 through 2.14.0) allows a remote attacker
pyjwt is a JSON Web Token implementation in Python. Rated high severity (CVSS 7.5), this vulnerability is remotely explo
Authentication bypass in PyJWT versions prior to 2.13.0 allows remote attackers to forge valid JSON Web Tokens by exploi
Reuse of a caller-supplied options mapping in PyJWT 2.11.0 through 2.13.0 can silently leave registered-claim verificati
Malformed JSON Web Token headers can cause an uncaught RecursionError in PyJWT 2.13.0 through versions before 2.14.0, re
Uncontrolled resource consumption in PyJWT 2.8.0-2.12.1 exposes any service that verifies detached JWS tokens to unauthe
Signature forgery in PyJWT before 2.14.0 allows an attacker who knows a target's asymmetric public key to forge HMAC-aut
JWKS trust-boundary bypass in PyJWT's PyJWKClient allows a configured trusted JWKS endpoint that returns an HTTP 3xx red
In PyJWT 1.5.0 and below the `invalid_strings` check in `HMACAlgorithm.prepare_key` does not account for all PEM encoded
Same technique Denial Of Service
View allVendor StatusVendor
SUSE
Severity: Moderate| Product | Status |
|---|---|
| SUSE Linux Enterprise Desktop 15 SP7 | Affected |
| SUSE Linux Enterprise High Performance Computing 12 | Affected |
| SUSE Linux Enterprise Micro 5.5 | Affected |
| SUSE Linux Enterprise Module for Basesystem 15 SP7 | Affected |
| SUSE Linux Enterprise Module for Python 3 15 SP7 | Affected |
| SUSE Linux Enterprise Server 15 SP7 | Affected |
| SUSE Linux Enterprise Server 16.0 | Affected |
| SUSE Linux Enterprise Server 16.1 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP7 | Affected |
| SUSE Linux Enterprise Server for SAP applications 16.0 | Affected |
| SUSE Linux Enterprise Server for SAP applications 16.1 | Affected |
| SUSE Linux Micro 6.0 | Affected |
| SUSE Linux Micro 6.1 | Affected |
| SUSE Linux Micro 6.2 | Affected |
| openSUSE Leap 16.0 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP4-LTSS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP5 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP5-LTSS | Affected |
| SUSE Linux Enterprise Module for Basesystem 15 SP4 | Affected |
| SUSE Linux Enterprise Module for Basesystem 15 SP5 | Affected |
| SUSE Linux Enterprise Module for Basesystem 15 SP6 | Affected |
| SUSE Linux Enterprise Module for Public Cloud 12 | Affected |
| SUSE Linux Enterprise Module for Public Cloud 15 SP4 | Affected |
| SUSE Linux Enterprise Module for Python 3 15 SP4 | Affected |
| SUSE Linux Enterprise Module for Python 3 15 SP5 | Affected |
| SUSE Linux Enterprise Module for Python 3 15 SP6 | Affected |
| SUSE Linux Enterprise Server 12 SP5 | Affected |
| SUSE Linux Enterprise Server 12 SP5-LTSS | Affected |
| SUSE Linux Enterprise Server 15 SP4 | Affected |
| SUSE Linux Enterprise Server 15 SP4-LTSS | Affected |
| SUSE Linux Enterprise Server 15 SP5 | Affected |
| SUSE Linux Enterprise Server 15 SP5-LTSS | Affected |
| SUSE Linux Enterprise Server 15 SP6 | Affected |
| SUSE Linux Enterprise Server 15 SP6-LTSS | Affected |
| SUSE Linux Enterprise Server LTSS Extended Security 12 SP5 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 12 SP5 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP4 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP5 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP6 | Affected |
| SUSE CaaS Platform 3.0 | Affected |
| SUSE CaaS Platform 4.0 | Affected |
| SUSE Enterprise Storage 6 | Affected |
| SUSE Enterprise Storage 7 | Affected |
| SUSE Enterprise Storage 7.1 | Affected |
| SUSE Linux Enterprise Desktop 15 SP1 | Affected |
| SUSE Linux Enterprise Desktop 15 SP2 | Affected |
| SUSE Linux Enterprise Desktop 15 SP3 | Affected |
| SUSE Linux Enterprise Desktop 15 SP4 | Affected |
| SUSE Linux Enterprise Desktop 15 SP5 | Affected |
| SUSE Linux Enterprise Desktop 15 SP6 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP1 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP1-ESPOS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP1-LTSS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP2 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP2-ESPOS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP2-LTSS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP3 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP3-ESPOS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP3-LTSS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP4 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP4-ESPOS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP5-ESPOS | Affected |
| SUSE Linux Enterprise Module for Basesystem 15 SP1 | Affected |
| SUSE Linux Enterprise Module for Basesystem 15 SP2 | Affected |
| SUSE Linux Enterprise Module for Basesystem 15 SP3 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP1 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP2 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP3 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP5 | Affected |
| SUSE Linux Enterprise Module for Public Cloud 15 SP1 | Affected |
| SUSE Linux Enterprise Module for Public Cloud 15 SP2 | Affected |
| SUSE Linux Enterprise Real Time 15 SP2 | Affected |
| SUSE Linux Enterprise Real Time 15 SP3 | Affected |
| SUSE Linux Enterprise Real Time 15 SP4 | Affected |
| SUSE Linux Enterprise Server 12 | Affected |
| SUSE Linux Enterprise Server 12 SP3 | Affected |
| SUSE Linux Enterprise Server 12 SP4 | Affected |
| SUSE Linux Enterprise Server 15 SP1 | Affected |
| SUSE Linux Enterprise Server 15 SP1-BCL | Affected |
| SUSE Linux Enterprise Server 15 SP1-LTSS | Affected |
| SUSE Linux Enterprise Server 15 SP2 | Affected |
| SUSE Linux Enterprise Server 15 SP2-BCL | Affected |
| SUSE Linux Enterprise Server 15 SP2-LTSS | Affected |
| SUSE Linux Enterprise Server 15 SP3 | Affected |
| SUSE Linux Enterprise Server 15 SP3-BCL | Affected |
| SUSE Linux Enterprise Server 15 SP3-LTSS | Affected |
| SUSE Linux Enterprise Server for SAP Applications 12 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 12 SP3 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 12 SP4 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP1 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP2 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP3 | Affected |
| SUSE Manager Proxy 4.0 | Affected |
| SUSE Manager Proxy 4.1 | Affected |
| SUSE Manager Proxy 4.2 | Affected |
| SUSE Manager Proxy 4.3 | Affected |
| SUSE Manager Proxy LTS 4.3 | Affected |
| SUSE Manager Retail Branch Server 4.0 | Affected |
| SUSE Manager Retail Branch Server 4.1 | Affected |
| SUSE Manager Retail Branch Server 4.2 | Affected |
| SUSE Manager Retail Branch Server 4.3 | Affected |
| SUSE Manager Retail Branch Server LTS 4.3 | Affected |
| SUSE Manager Server 3.2 | Affected |
| SUSE Manager Server 4.0 | Affected |
| SUSE Manager Server 4.1 | Affected |
| SUSE Manager Server 4.2 | Affected |
| SUSE Manager Server 4.3 | Affected |
| SUSE Manager Server LTS 4.3 | Affected |
| SUSE OpenStack Cloud 7 | Affected |
| openSUSE Leap 15.3 | Affected |
| openSUSE Leap 15.4 | Affected |
| openSUSE Leap 15.5 | Affected |
| openSUSE Leap 15.6 | Affected |
EUVD-2026-88478
GHSA-2gx3-rcp4-g85q
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB