Skip to main content

PyJWT EUVDEUVD-2026-88479

| CVE-2026-101918 HIGH
Uncaught Exception (CWE-248)
2026-09-28 GitHub_M GHSA-42vr-xj54-vc7v
7.5
CVSS 3.1 · NVD
View

Attack ChainAIDerived

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

  1. Access
    Reach JWT-consuming endpoint unauthenticated
  2. Delivery
    Craft deeply nested JSON payload token
  3. Exploit
    Submit forged token in request
  4. Execution
    json.loads raises uncaught RecursionError
  5. Persist
    Auth handler/worker crashes (HTTP 500)
  6. Impact
    Repeat to sustain denial of service

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A10:2025 - Mishandling of Exceptional Conditions
ASVS 5.0
V16 - Security Logging and Error Handling Exception handling completeness
Exploitation Conditions

Exploitation requires the target application to parse an attacker-supplied JWT before signature verification - specifically code paths using PyJWKClient.get_signing_key_from_jwt(token) (the documented JWKS verification flow) or any call to jwt.decode(token, options={"verify_signature": False}), and secondarily PyJWKClient.fetch_data against a malicious JWKS endpoint. No valid signature, credentials, JWKS network lookup, or user interaction is needed, and the crash fires during payload parsing on default configurations. Limiting factors: the vulnerable library version must be PyJWT >= 2.0.0a1 and <= 2.14.0 (fixed in 2.15.0, which already protected the JWS header path in 2.14.0 but not the payload path), the application must actually invoke one of these pre-verification parse paths on untrusted input, and impact is confined to availability (worker crash / HTTP 500) with no data exposure or code execution.

Impact

This is a genuine but moderate-priority availability issue, not a confidentiality/integrity breach. The CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H, base 7.5) is internally consistent with the advisory: a single unauthenticated ~50KB network request with no user interaction crashes the auth handler, and impact is strictly availability (C:N/I:N), which matches CWE-248 (uncaught exception → HTTP 500 / dead worker). The signals pull in different directions on urgency. On the elevating side, SSVC marks the flaw Automatable:yes and publicly available exploit code exists (a cve-search gist), meaning weaponization is trivial and repeatable. On the moderating side, EPSS is only 0.29% (20th percentile) and the CVE is NOT in CISA KEV, so there is no confirmed active exploitation - the real-world driver here is low observed exploitation despite easy reproducibility, consistent with a DoS-only bug that yields disruption rather than data or code execution. SSVC Technical Impact is rated 'partial,' aligning with availability-only consequences. Net: treat as a priority patch for internet-facing services that call PyJWKClient.get_signing_key_from_jwt or jwt.decode(..., verify_signature=False) on attacker-supplied tokens, but it does not carry the breach risk of an RCE or auth-bypass. No conflicting data between CVSS and description was identified - the network/unauthenticated vector is corroborated by the advisory's reproduction notes.

Exploit ScenarioDerived

An attacker sends an unauthenticated HTTP request carrying a forged JWT whose payload segment is valid JSON nested ~20,000 levels deep (roughly 50KB). When the service calls PyJWKClient.get_signing_key_from_jwt or jwt.decode with verify_signature=False, json.loads raises a RecursionError that the ValueError-only handler misses, escaping as an undocumented exception and crashing the worker with an HTTP 500. Public proof-of-concept exploit code exists and the payload needs no valid signature or network access to the JWKS endpoint, so the crash is trivially repeatable to cause sustained denial of service.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
1 public PoC Patch available 0.3% 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 denial of service in the PyJWT Python library (versions 2.0.0a1 through 2.14.0) allows a remote attacker to crash the calling application's authentication handler by supplying a JWT whose payload is valid JSON but nested roughly 20,000 levels deep. The vulnerable code paths - PyJWKClient.get_signing_key_from_jwt(), the documented JWKS verification flow, and any jwt.decode(token, options={"verify_signature": False}) call - parse the attacker-controlled payload with json.loads before any signature check, and a catch clause that handles only ValueError lets RecursionError escape as an undocumented exception (CWE-248), producing an HTTP 500 or dead worker with no credentials, valid signature, user interaction, or JWKS network lookup required. Publicly available exploit code exists (a PoC gist is referenced in the advisory data) and CISA's SSVC assessment rates the issue as automatable with partial technical impact; EPSS is low at 0.29% (20th percentile) and there is no indication of confirmed active exploitation. Impact is confined to availability - no data exposure, integrity loss, or code execution.

Earlier versions of this analysis (1)
v1 Sep 28, 2026 - 20:50 CVSS 5.3

An unhandled-exception gap in PyJWT (2.0.0a1 through pre-2.15.0) lets an unauthenticated attacker send a JWT whose payload is a recursively nested JSON structure, causing json.loads to raise RecursionError that the library's documented exception handling does not catch. The affected paths are PyJWKClient.get_signing_key_from_jwt (which parses the payload before signature verification while resolving a signing key) and jwt.decode called with options={'verify_signature': False}; in both cases no valid signature is required, so exploitation is unauthenticated against the affected versions. Impact is bounded to a per-request failure such as an HTTP 500 rather than a persistent crash, which is consistent with the assessed CVSS 3.1 score of 5.3 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L), and no public exploit identified at time of analysis.

RemediationAI

Vendor-released patch: upgrade PyJWT to 2.15.0 (https://github.com/jpadilla/pyjwt/releases/tag/2.15.0), which widens the payload try/except to (ValueError, RecursionError) and wraps the failure in DecodeError - see upstream fix commit 5fde08a6cf906aa7698de2d6391d88b73006b17b. If an immediate upgrade is not possible, apply targeted compensating controls: (1) wrap all JWT parsing calls - including PyJWKClient.get_signing_key_from_jwt() and jwt.decode(..., options={"verify_signature": False}) - in handlers that explicitly catch RecursionError as well as PyJWTError, trading a raw crash for a controlled rejection; (2) pre-validate untrusted tokens by base64url-decoding the payload segment and rejecting inputs whose byte length or nesting depth exceeds a small threshold before handing them to json.loads, at the cost of extra parsing work per request; (3) avoid exposing verify_signature=False decode paths to untrusted input entirely, since real verification paths only reach the vulnerable parse after a signature check; and (4) for the secondary PyJWKClient.fetch_data issue, only fetch JWKS documents from pinned, trusted endpoints and constrain/validate the response body size and nesting depth, rather than pointing the client at arbitrary attacker-influenced URLs. Neither workaround restores the documented exception contract as cleanly as the 2.15.0 upgrade. Advisory: https://github.com/jpadilla/pyjwt/security/advisories/GHSA-42vr-xj54-vc7v.

Affected VersionsENISA

pyjwt 2.0.0a1, < 2.15.0

Affected Packages

pypi pyjwt fix: 2.15.0
euvd pyjwt_2_0_0a1 fix: 2.15.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 2 packages in pypi, euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

PyJWT is a widely used Python implementation of the JSON Web Token (JWT) standard, tracked as cpe:2.3:a:jpadilla:pyjwt. The root cause class is CWE-248 (Uncaught Exception): in jwt/api_jwt.py _decode_payload, the payload segment of a token is parsed with json.loads inside a try block whose except clause catches only ValueError. Deeply nested JSON (about 20,000 levels) causes CPython's JSON decoder to raise RecursionError, which is not a ValueError and therefore escapes as a raw, undocumented exception type - not DecodeError, InvalidTokenError, or PyJWTError - bypassing every error-handling pattern documented in the project's usage guide. Critically, this parsing happens before signature verification and before the kid header is resolved, so an unauthenticated attacker controls the entire input. The same defect class was already remediated for the JWS header path (jwt/api_jws.py PyJWS._load catches (ValueError, RecursionError) and wraps it in DecodeError), and the v2.14.0 changelog claims handling of deeply nested JWS/JWK input, but the payload path was left catching ValueError alone. The advisory additionally identifies a second, worse instance in PyJWKClient.fetch_data (jwt/jwks_client.py), where a deeply nested JSON response from a JWKS endpoint raises the same uncaught RecursionError. Affected versions are confirmed in 2.14.0 and on the master branch (commit 4adcd02722f5011c60079d3978dfc167b9a8eaa5).

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 7.5 HIGH

Unauthenticated remote attacker (PR:N/AV:N) sends a single crafted token (AC:L/UI:N) causing a worker crash; impact is availability-only (A:H), no confidentiality or integrity effect.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/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:11 cve.org
MEDIUM 5.3

DescriptionNVD

PyJWT is a Python implementation of JSON Web Token standards. From 2.0.0a1 until 2.15.0, PyJWT PyJWKClient.get_signing_key_from_jwt is affected because payload parser catches ValueError but not RecursionError. This occurs when an attacker-controlled recursively nested payload reaches json.loads. As a result, documented PyJWT exception handling does not contain the failure. Consequently, an unauthenticated request can raise an exception that may produce an HTTP 500 response. The advisory-defined affected implementation also includes jwt/api_jwt.py, verify_signature=False. This issue is fixed in version 2.15.0.

Technical POC Analysis

CWE-248 (Uncaught Exception).

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Latest POC

1 public PoC link from github

Sign in to open the public PoC links collected for this CVE.

Executive ViewAI

Why It Matters

A high-severity denial-of-service flaw in the PyJWT Python library (versions 2.0.0a1 through 2.14.0) can let a remote attacker crash authentication handlers by supplying a specially crafted deeply nested JWT, disrupting login, API, and token-verification services that rely on PyJWT. Publicly available exploit code exists, and the issue is rated automatable, so internet-facing or authentication-critical applications are most exposed; the EPSS score is low. Leadership should prioritize remediation because successful exploitation can cause repeated HTTP 500 errors or dead workers without user interaction, affecting availability of critical authentication paths.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.3%
Top 80% exploitable
Prevalence
High
PyJWT is among the most widely used Python JWT libraries
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 Yes
EPSS 0.3%
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
Out-of-Cycle
Exploitation
Poc
System Exposure· derived
Open
Automatable
Yes
Human Impact
High
Technical Impact
Partial

Priority Score

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

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-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-2026-101917 HIGH
7.5 Sep 28

Unauthenticated attackers can amplify outbound HTTP traffic from any application that validates JWTs with PyJWT's PyJWKC

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 Not-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