Skip to main content

PyJWT EUVDEUVD-2026-88478

| CVE-2026-101917 HIGH
Allocation of Resources Without Limits or Throttling (CWE-770)
2026-09-28 GitHub_M GHSA-2gx3-rcp4-g85q
7.5
CVSS 3.1 · NVD
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Send tokens with unknown/varying kid headers
  2. Exploit
    Unverified header read bypasses JWKS cache
  3. Execution
    Each miss forces fresh JWKS fetch + JSON parse
  4. Impact
    Amplified 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv2 – 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)
v1 Sep 28, 2026 - 20:49 CVSS 5.3

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

pyjwt < 2.14.0

Affected Packages

pypi pyjwt fix: 2.14.0

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

Vendor (GitHub_M) PRIMARY MEDIUM
NVD 7.5 HIGH
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
vuln.today AI 5.3 MEDIUM

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.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
SUSE 5.3 MEDIUM
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
Red Hat 5.3 MEDIUM

Primary rating from Vendor (GitHub_M).

CVSS VectorNVD

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
High

Lifecycle Timeline

4
Severity Changed
Oct 07, 2026 - 21:07 NVD
MEDIUM HIGH
CVSS changed
Oct 07, 2026 - 21:07 NVD
5.3 (MEDIUM) 7.5 (HIGH)
Patch available
Sep 28, 2026 - 21:02 EUVD
CVE Published
Sep 28, 2026 - 20:07 cve.org
MEDIUM 5.3

DescriptionNVD

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
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 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

Why It Matters

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.

Business Impact: Medium
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.4%
Top 73% exploitable
Prevalence
High
PyJWT is a very widely deployed Python JWT library across web backends
Threat Intel
1
1 sources
Data Quality
7 sources
Confidence: High

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
Yes
Human Impact
Medium
Technical Impact
Partial

Priority Score

38
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +38
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

More in Pyjwt

View all
CVE-2026-102266 CRITICAL POC
9.1 Sep 28

Forged HS256 JSON Web Tokens can be accepted as authentic by PyJWT (pip package PyJWT) versions 2.13.0 through 2.13.x wh

CVE-2026-102275 HIGH POC
8.2 Sep 28

Improper validation in PyJWT 2.1.0 through 2.14.0 allows an attacker who already holds a stolen sender-constrained (DPoP

CVE-2026-102274 HIGH POC
7.5 Sep 28

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

CVE-2026-101918 HIGH POC
7.5 Sep 28

Unauthenticated denial of service in the PyJWT Python library (versions 2.0.0a1 through 2.14.0) allows a remote attacker

CVE-2024-53861 HIGH POC
7.5 Nov 29

pyjwt is a JSON Web Token implementation in Python. Rated high severity (CVSS 7.5), this vulnerability is remotely explo

CVE-2026-48526 HIGH POC
7.4 May 28

Authentication bypass in PyJWT versions prior to 2.13.0 allows remote attackers to forge valid JSON Web Tokens by exploi

CVE-2026-103001 MEDIUM POC
6.5 Sep 30

Reuse of a caller-supplied options mapping in PyJWT 2.11.0 through 2.13.0 can silently leave registered-claim verificati

CVE-2026-102265 MEDIUM POC
5.3 Sep 28

Malformed JSON Web Token headers can cause an uncaught RecursionError in PyJWT 2.13.0 through versions before 2.14.0, re

CVE-2026-48525 MEDIUM POC
5.3 May 28

Uncontrolled resource consumption in PyJWT 2.8.0-2.12.1 exposes any service that verifies detached JWS tokens to unauthe

CVE-2026-102268 CRITICAL
9.1 Sep 28

Signature forgery in PyJWT before 2.14.0 allows an attacker who knows a target's asymmetric public key to forge HMAC-aut

CVE-2026-102267 CRITICAL
9.1 Sep 28

JWKS trust-boundary bypass in PyJWT's PyJWKClient allows a configured trusted JWKS endpoint that returns an HTTP 3xx red

CVE-2017-11424 HIGH
7.5 Aug 24

In PyJWT 1.5.0 and below the `invalid_strings` check in `HMACAlgorithm.prepare_key` does not account for all PEM encoded

Vendor 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

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy