CVE-2026-101918
PyJWT: Unauthenticated RecursionError DoS in pre-verification payload parse (PyJWKClient.get_signing_key_from_jwt / verify_signature=False)
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.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- None
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
5.3
PyJWT: Unauthenticated RecursionError DoS in pre-verification payload parse (PyJWKClient.get_signing_key_from_jwt / verify_signature=False)
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.
- Record
CVE-2026-101918- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-248
- Updated
- 2026-11-02
EUVDEUVD-2026-88479
5.3
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.
- Record
EUVD-2026-88479- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-42vr-xj54-vc7v
5.3
PyJWT: Unauthenticated RecursionError DoS in pre-verification payload parse (PyJWKClient.get_signing_key_from_jwt / verify_signature=False)
Summary
PyJWKClient.get_signing_key_from_jwt(token) — the first step of the JWKS
verification flow documented in docs/usage.rst — must decode a token's
payload before its signature can be checked, via
jwt.api_jwt.decode_complete(token, options={"verify_signature": False}).
That call parses the payload with json.loads in PyJWT._decode_payload
(jwt/api_jwt.py:297-300), whose except clause catches only ValueError.
A payload that is valid JSON but nested ~20,000 levels deep makes
json.loads raise RecursionError, which is not a ValueError and
escapes as a raw, undocumented exception type — not DecodeError,
InvalidTokenError, or PyJWTError, so every documented error-handling
pattern in docs/usage.rst misses it.
The token needs no valid signature and no network access — the crash
happens during payload parsing, before the kid is even looked up. A
single unauthenticated ~50KB request crashes the caller's auth handler
(HTTP 500 / dead worker), repeatably. The same path is reachable through
plain jwt.decode(token, options={"verify_signature": False}) too.
Notably, this project already fixed the identical bug class for the
JWS header path — PyJWS._load catches (ValueError, RecursionError)
and wraps it in DecodeError (jwt/api_jws.py:360-361), and
CHANGELOG.rst (v2.14.0, "Security") states "Handle deeply nested and
malformed JWS/JWK input without uncaught recursion errors." The payload
path — the one part of a forged token an unauthenticated attacker fully
controls — was left catching ValueError alone, so that security fix does
not fully hold.
A second, related instance: PyJWKClient.fetch_data (jwt/jwks_client.py:168)
parses a JWKS endpoint's response with json.load(response) inside a
try that only catches (URLError, TimeoutError, http.client.HTTPException)
— a deeply-nested JSON response from a JWKS endpoint raises the same raw
RecursionError, uncaught entirely (worse than the payload path, which at
least caught plain ValueError).
Affected versions: confirmed present in the current release, 2.14.0,
and on the current master branch (commit 4adcd02722f5011c60079d3978dfc167b9a8eaa5).
Reproduction
import base64, json, jwt
def b64url(b):
return base64.urlsafe_b64encode(b).rstrip(b"=")
header = b64url(json.dumps({"alg": "HS256", "typ": "JWT"}).encode())
payload = b64url(b"[" * 20_000 + b"]" * 20_000)
token = (header + b"." + payload + b"." + b64url(b"forged-sig")).decode()
jwt.decode(token, options={"verify_signature": False})
# raises: RecursionError (not DecodeError/InvalidTokenError/PyJWTError)
Control: the same deeply-nested structure moved into the token's header
instead of its payload is correctly converted to jwt.DecodeError by the
already-hardened jwt/api_jws.py:360 — confirming the payload path is
specifically the missed half of the v2.14.0 hardening, not a general gap.
Impact assessment
Unauthenticated denial-of-service via unhandled exception on an auth path.
Not an auth bypass — rated medium. With signature verification enabled,
this parse runs after _verify_signature, so only the pre-verification
paths (get_signing_key_from_jwt, explicit verify_signature=False) are
attacker-reachable pre-auth; the JWKS-endpoint variant requires control of
(or a MITM on) the configured JWKS endpoint rather than being reachable
from an arbitrary client token.
Suggested fix
In jwt/api_jwt.py:299, change except ValueError as e: to
except (ValueError, RecursionError) as e:, mirroring
jwt/api_jws.py:360 exactly. In jwt/jwks_client.py, add the same
(ValueError, RecursionError) handling around json.load(response) in
fetch_data, raising PyJWKClientError (consistent with the method's
existing documented error contract). A patch implementing both, verified
against the full test suite (457 passed, 4 skipped — pre-existing,
environment-related) and against the reproduction above (now…
- Record
GHSA-42vr-xj54-vc7v- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-248
- Updated
- 2026-11-02
NVD
5.3
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.
- Record
CVE-2026-101918- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-248
- Updated
- 2026-11-02
OSVBELL-CVE-2026-101918
7.5
- Record
BELL-CVE-2026-101918- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-07
OSV
5.3
PyJWT: Unauthenticated RecursionError DoS in pre-verification payload parse (PyJWKClient.get_signing_key_from_jwt / verify_signature=False)
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.
- Record
CVE-2026-101918- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-248
- Updated
- 2026-11-03
Show 20 moreShow less
OSVDEBIAN-CVE-2026-101918
7.5
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.
- Record
DEBIAN-CVE-2026-101918- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
OSVGHSA-42vr-xj54-vc7v
5.3
PyJWT: Unauthenticated RecursionError DoS in pre-verification payload parse (PyJWKClient.get_signing_key_from_jwt / verify_signature=False)
Summary
PyJWKClient.get_signing_key_from_jwt(token) — the first step of the JWKS
verification flow documented in docs/usage.rst — must decode a token's
payload before its signature can be checked, via
jwt.api_jwt.decode_complete(token, options={"verify_signature": False}).
That call parses the payload with json.loads in PyJWT._decode_payload
(jwt/api_jwt.py:297-300), whose except clause catches only ValueError.
A payload that is valid JSON but nested ~20,000 levels deep makes
json.loads raise RecursionError, which is not a ValueError and
escapes as a raw, undocumented exception type — not DecodeError,
InvalidTokenError, or PyJWTError, so every documented error-handling
pattern in docs/usage.rst misses it.
The token needs no valid signature and no network access — the crash
happens during payload parsing, before the kid is even looked up. A
single unauthenticated ~50KB request crashes the caller's auth handler
(HTTP 500 / dead worker), repeatably. The same path is reachable through
plain jwt.decode(token, options={"verify_signature": False}) too.
Notably, this project already fixed the identical bug class for the
JWS header path — PyJWS._load catches (ValueError, RecursionError)
and wraps it in DecodeError (jwt/api_jws.py:360-361), and
CHANGELOG.rst (v2.14.0, "Security") states "Handle deeply nested and
malformed JWS/JWK input without uncaught recursion errors." The payload
path — the one part of a forged token an unauthenticated attacker fully
controls — was left catching ValueError alone, so that security fix does
not fully hold.
A second, related instance: PyJWKClient.fetch_data (jwt/jwks_client.py:168)
parses a JWKS endpoint's response with json.load(response) inside a
try that only catches (URLError, TimeoutError, http.client.HTTPException)
— a deeply-nested JSON response from a JWKS endpoint raises the same raw
RecursionError, uncaught entirely (worse than the payload path, which at
least caught plain ValueError).
Affected versions: confirmed present in the current release, 2.14.0,
and on the current master branch (commit 4adcd02722f5011c60079d3978dfc167b9a8eaa5).
Reproduction
import base64, json, jwt
def b64url(b):
return base64.urlsafe_b64encode(b).rstrip(b"=")
header = b64url(json.dumps({"alg": "HS256", "typ": "JWT"}).encode())
payload = b64url(b"[" * 20_000 + b"]" * 20_000)
token = (header + b"." + payload + b"." + b64url(b"forged-sig")).decode()
jwt.decode(token, options={"verify_signature": False})
# raises: RecursionError (not DecodeError/InvalidTokenError/PyJWTError)
Control: the same deeply-nested structure moved into the token's header
instead of its payload is correctly converted to jwt.DecodeError by the
already-hardened jwt/api_jws.py:360 — confirming the payload path is
specifically the missed half of the v2.14.0 hardening, not a general gap.
Impact assessment
Unauthenticated denial-of-service via unhandled exception on an auth path.
Not an auth bypass — rated medium. With signature verification enabled,
this parse runs after _verify_signature, so only the pre-verification
paths (get_signing_key_from_jwt, explicit verify_signature=False) are
attacker-reachable pre-auth; the JWKS-endpoint variant requires control of
(or a MITM on) the configured JWKS endpoint rather than being reachable
from an arbitrary client token.
Suggested fix
In jwt/api_jwt.py:299, change except ValueError as e: to
except (ValueError, RecursionError) as e:, mirroring
jwt/api_jws.py:360 exactly. In jwt/jwks_client.py, add the same
(ValueError, RecursionError) handling around json.load(response) in
fetch_data, raising PyJWKClientError (consistent with the method's
existing documented error contract). A patch implementing both, verified
against the full test suite (457 passed, 4 skipped — pre-existing,
environment-related) and against the reproduction above (now…
- Record
GHSA-42vr-xj54-vc7v- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-248
- Updated
- 2026-11-02
OSVOESA-2026-4453
6.5
python-jwt security update
setup.py test %endif
Security Fix(es):
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.(CVE-2026-101917)
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.(CVE-2026-101918)
PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, PyJWS._load in jwt/api_jws.py is affected because parser catches ValueError but not RecursionError. This occurs when a deeply nested token header reaches json.loads. As a result, RecursionError escapes the documented PyJWT error hierarchy. Consequently, an unauthenticated malformed token can cause a request-level failure and HTTP 500. This issue is fixed in version 2.14.0.(CVE-2026-102265)
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.(CVE-2026-102269)
PyJWT is a Python implementation of JSON Web Token standards. From 2.1.0 until 2.15.0, PyJWT OKPAlgorithm.from_jwk in jwt/algorithms.py is affected because private-JWK import path does not compare the public key derived from d with x. This occurs when an OKP private JWK supplies non-corresponding x and d components. As a result, identity derived from x can differ from operations performed with d. Consequently, if an integration also accepts private key parameters from a proof header without rejecting them, an attacker may use a stolen sender-constrained token without the legitimate private key. This issue is fixed in version 2.15.0.(CVE-2026-102275)
- Record
OESA-2026-4453- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N - Updated
- 2026-11-02
OSVOESA-2026-4454
6.5
python-jwt security update
setup.py test %endif
Security Fix(es):
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.(CVE-2026-101918)
PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, PyJWS._load in jwt/api_jws.py is affected because parser catches ValueError but not RecursionError. This occurs when a deeply nested token header reaches json.loads. As a result, RecursionError escapes the documented PyJWT error hierarchy. Consequently, an unauthenticated malformed token can cause a request-level failure and HTTP 500. This issue is fixed in version 2.14.0.(CVE-2026-102265)
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.(CVE-2026-102269)
PyJWT is a Python implementation of JSON Web Token standards. From 2.1.0 until 2.15.0, PyJWT OKPAlgorithm.from_jwk in jwt/algorithms.py is affected because private-JWK import path does not compare the public key derived from d with x. This occurs when an OKP private JWK supplies non-corresponding x and d components. As a result, identity derived from x can differ from operations performed with d. Consequently, if an integration also accepts private key parameters from a proof header without rejecting them, an attacker may use a stolen sender-constrained token without the legitimate private key. This issue is fixed in version 2.15.0.(CVE-2026-102275)
- Record
OESA-2026-4454- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N - Updated
- 2026-11-02
OSVOESA-2026-4455
6.5
python-jwt security update
setup.py test %endif
Security Fix(es):
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.(CVE-2026-101917)
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.(CVE-2026-101918)
PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, PyJWS._load in jwt/api_jws.py is affected because parser catches ValueError but not RecursionError. This occurs when a deeply nested token header reaches json.loads. As a result, RecursionError escapes the documented PyJWT error hierarchy. Consequently, an unauthenticated malformed token can cause a request-level failure and HTTP 500. This issue is fixed in version 2.14.0.(CVE-2026-102265)
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.(CVE-2026-102269)
PyJWT is a Python implementation of JSON Web Token standards. From 2.1.0 until 2.15.0, PyJWT OKPAlgorithm.from_jwk in jwt/algorithms.py is affected because private-JWK import path does not compare the public key derived from d with x. This occurs when an OKP private JWK supplies non-corresponding x and d components. As a result, identity derived from x can differ from operations performed with d. Consequently, if an integration also accepts private key parameters from a proof header without rejecting them, an attacker may use a stolen sender-constrained token without the legitimate private key. This issue is fixed in version 2.15.0.(CVE-2026-102275)
- Record
OESA-2026-4455- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N - Updated
- 2026-11-02
OSVOESA-2026-4456
6.5
python-jwt security update
setup.py test %endif
Security Fix(es):
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.(CVE-2026-101917)
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.(CVE-2026-101918)
PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, PyJWS._load in jwt/api_jws.py is affected because parser catches ValueError but not RecursionError. This occurs when a deeply nested token header reaches json.loads. As a result, RecursionError escapes the documented PyJWT error hierarchy. Consequently, an unauthenticated malformed token can cause a request-level failure and HTTP 500. This issue is fixed in version 2.14.0.(CVE-2026-102265)
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.(CVE-2026-102269)
PyJWT is a Python implementation of JSON Web Token standards. From 2.1.0 until 2.15.0, PyJWT OKPAlgorithm.from_jwk in jwt/algorithms.py is affected because private-JWK import path does not compare the public key derived from d with x. This occurs when an OKP private JWK supplies non-corresponding x and d components. As a result, identity derived from x can differ from operations performed with d. Consequently, if an integration also accepts private key parameters from a proof header without rejecting them, an attacker may use a stolen sender-constrained token without the legitimate private key. This issue is fixed in version 2.15.0.(CVE-2026-102275)
- Record
OESA-2026-4456- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N - Updated
- 2026-11-02
OSVPYSEC-2026-4141
5.3
PyJWT: Unauthenticated RecursionError DoS in pre-verification payload parse (PyJWKClient.get_signing_key_from_jwt / verify_signature=False)
Summary
PyJWKClient.get_signing_key_from_jwt(token) — the first step of the JWKS
verification flow documented in docs/usage.rst — must decode a token's
payload before its signature can be checked, via
jwt.api_jwt.decode_complete(token, options={"verify_signature": False}).
That call parses the payload with json.loads in PyJWT._decode_payload
(jwt/api_jwt.py:297-300), whose except clause catches only ValueError.
A payload that is valid JSON but nested ~20,000 levels deep makes
json.loads raise RecursionError, which is not a ValueError and
escapes as a raw, undocumented exception type — not DecodeError,
InvalidTokenError, or PyJWTError, so every documented error-handling
pattern in docs/usage.rst misses it.
The token needs no valid signature and no network access — the crash
happens during payload parsing, before the kid is even looked up. A
single unauthenticated ~50KB request crashes the caller's auth handler
(HTTP 500 / dead worker), repeatably. The same path is reachable through
plain jwt.decode(token, options={"verify_signature": False}) too.
Notably, this project already fixed the identical bug class for the
JWS header path — PyJWS._load catches (ValueError, RecursionError)
and wraps it in DecodeError (jwt/api_jws.py:360-361), and
CHANGELOG.rst (v2.14.0, "Security") states "Handle deeply nested and
malformed JWS/JWK input without uncaught recursion errors." The payload
path — the one part of a forged token an unauthenticated attacker fully
controls — was left catching ValueError alone, so that security fix does
not fully hold.
A second, related instance: PyJWKClient.fetch_data (jwt/jwks_client.py:168)
parses a JWKS endpoint's response with json.load(response) inside a
try that only catches (URLError, TimeoutError, http.client.HTTPException)
— a deeply-nested JSON response from a JWKS endpoint raises the same raw
RecursionError, uncaught entirely (worse than the payload path, which at
least caught plain ValueError).
Affected versions: confirmed present in the current release, 2.14.0,
and on the current master branch (commit 4adcd02722f5011c60079d3978dfc167b9a8eaa5).
Reproduction
import base64, json, jwt
def b64url(b):
return base64.urlsafe_b64encode(b).rstrip(b"=")
header = b64url(json.dumps({"alg": "HS256", "typ": "JWT"}).encode())
payload = b64url(b"[" * 20_000 + b"]" * 20_000)
token = (header + b"." + payload + b"." + b64url(b"forged-sig")).decode()
jwt.decode(token, options={"verify_signature": False})
# raises: RecursionError (not DecodeError/InvalidTokenError/PyJWTError)
Control: the same deeply-nested structure moved into the token's header
instead of its payload is correctly converted to jwt.DecodeError by the
already-hardened jwt/api_jws.py:360 — confirming the payload path is
specifically the missed half of the v2.14.0 hardening, not a general gap.
Impact assessment
Unauthenticated denial-of-service via unhandled exception on an auth path.
Not an auth bypass — rated medium. With signature verification enabled,
this parse runs after _verify_signature, so only the pre-verification
paths (get_signing_key_from_jwt, explicit verify_signature=False) are
attacker-reachable pre-auth; the JWKS-endpoint variant requires control of
(or a MITM on) the configured JWKS endpoint rather than being reachable
from an arbitrary client token.
Suggested fix
In jwt/api_jwt.py:299, change except ValueError as e: to
except (ValueError, RecursionError) as e:, mirroring
jwt/api_jws.py:360 exactly. In jwt/jwks_client.py, add the same
(ValueError, RecursionError) handling around json.load(response) in
fetch_data, raising PyJWKClientError (consistent with the method's
existing documented error contract). A patch implementing both, verified
against the full test suite (457 passed, 4 skipped — pre-existing,
environment-related) and against the reproduction above (now…
- Record
PYSEC-2026-4141- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-101918
5.3
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.
- Record
UBUNTU-CVE-2026-101918- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
OSVAZL-105218 No score
CVE-2026-101918 affecting package python-jwt for versions less than 2.15.1-1
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.
- Record
AZL-105218- Updated
- 2026-11-02
OSVCLSA-2026-1791271338 No score
TuxCare security update for pyjwt (7 CVEs)
TuxCare rebuilt pyjwt to address 7 CVEs. Fixed in 2.3.0.post4+tuxcare.
- Record
CLSA-2026-1791271338- Updated
- 2026-11-02
OSVCLSA-2026-1791272473 No score
TuxCare security update for pyjwt (2 CVEs)
TuxCare rebuilt pyjwt to address 2 CVEs. Fixed in 2.10.1.post6+tuxcare.
- Record
CLSA-2026-1791272473- Updated
- 2026-11-02
OSVCLSA-2026-1791272714 No score
TuxCare security update for pyjwt (2 CVEs)
TuxCare rebuilt pyjwt to address 2 CVEs. Fixed in 2.8.0.post5+tuxcare.
- Record
CLSA-2026-1791272714- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:11994-1 No score
python313-PyJWT-2.15.1-1.1 on GA media
These are all security issues fixed in the python313-PyJWT-2.15.1-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:11994-1- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:22074-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues:
- CVE-2026-101917: attacker traffic can amplify outbound requests to the configured JWKS endpoint (bsc#1283060).
- CVE-2026-101918: unauthenticated request can raise an exception that may produce an HTTP 500 response (bsc#1283061).
- CVE-2026-102267: forwarded credentials may be disclosed or verification keys may be substituted (bsc#1283064).
- CVE-2026-102268: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283065).
- CVE-2026-102269: raw-token revocation checks can fail to recognize an equivalent modified token (bsc#1283066).
- CVE-2026-102270: an attacker can cause intensive CPU consumption (bsc#1283067).
- CVE-2026-102271: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283068).
- CVE-2026-102274: Malformed RSA JWK aborts parsing of an entire JWK Set (bsc#1283071).
- CVE-2026-102275: an attacker may use a stolen sender-constrained token without the legitimate private key (bsc#1283072).
- CVE-2026-103001: reused mutable options mapping can cause verification checks bypass on subsequent decode calls (bsc#1283829).
- Record
openSUSE-SU-2026:22074-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:24126-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues:
- CVE-2026-101917: attacker traffic can amplify outbound requests to the configured JWKS endpoint (bsc#1283060).
- CVE-2026-101918: unauthenticated request can raise an exception that may produce an HTTP 500 response (bsc#1283061).
- CVE-2026-102267: forwarded credentials may be disclosed or verification keys may be substituted (bsc#1283064).
- CVE-2026-102268: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283065).
- CVE-2026-102269: raw-token revocation checks can fail to recognize an equivalent modified token (bsc#1283066).
- CVE-2026-102270: an attacker can cause intensive CPU consumption (bsc#1283067).
- CVE-2026-102271: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283068).
- CVE-2026-102274: Malformed RSA JWK aborts parsing of an entire JWK Set (bsc#1283071).
- CVE-2026-102275: an attacker may use a stolen sender-constrained token without the legitimate private key (bsc#1283072).
- CVE-2026-103001: reused mutable options mapping can cause verification checks bypass on subsequent decode calls (bsc#1283829).
- Record
SUSE-SU-2026:24126-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:24134-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues:
- CVE-2026-101917: attacker traffic can amplify outbound requests to the configured JWKS endpoint (bsc#1283060).
- CVE-2026-101918: unauthenticated request can raise an exception that may produce an HTTP 500 response (bsc#1283061).
- CVE-2026-102267: forwarded credentials may be disclosed or verification keys may be substituted (bsc#1283064).
- CVE-2026-102268: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283065).
- CVE-2026-102269: raw-token revocation checks can fail to recognize an equivalent modified token (bsc#1283066).
- CVE-2026-102270: an attacker can cause intensive CPU consumption (bsc#1283067).
- CVE-2026-102271: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283068).
- CVE-2026-102274: Malformed RSA JWK aborts parsing of an entire JWK Set (bsc#1283071).
- CVE-2026-102275: an attacker may use a stolen sender-constrained token without the legitimate private key (bsc#1283072).
- Record
SUSE-SU-2026:24134-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:24219-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues:
- CVE-2026-101917: attacker traffic can amplify outbound requests to the configured JWKS endpoint (bsc#1283060).
- CVE-2026-101918: unauthenticated request can raise an exception that may produce an HTTP 500 response (bsc#1283061).
- CVE-2026-102267: forwarded credentials may be disclosed or verification keys may be substituted (bsc#1283064).
- CVE-2026-102268: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283065).
- CVE-2026-102269: raw-token revocation checks can fail to recognize an equivalent modified token (bsc#1283066).
- CVE-2026-102270: an attacker can cause intensive CPU consumption (bsc#1283067).
- CVE-2026-102271: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283068).
- CVE-2026-102274: Malformed RSA JWK aborts parsing of an entire JWK Set (bsc#1283071).
- CVE-2026-102275: an attacker may use a stolen sender-constrained token without the legitimate private key (bsc#1283072).
- CVE-2026-103001: reused mutable options mapping can cause verification checks bypass on subsequent decode calls (bsc#1283829).
- Record
SUSE-SU-2026:24219-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:24377-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues:
- CVE-2026-101917: attacker traffic can amplify outbound requests to the configured JWKS endpoint (bsc#1283060).
- CVE-2026-101918: unauthenticated request can raise an exception that may produce an HTTP 500 response (bsc#1283061).
- CVE-2026-102267: forwarded credentials may be disclosed or verification keys may be substituted (bsc#1283064).
- CVE-2026-102268: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283065).
- CVE-2026-102269: raw-token revocation checks can fail to recognize an equivalent modified token (bsc#1283066).
- CVE-2026-102270: an attacker can cause intensive CPU consumption (bsc#1283067).
- CVE-2026-102271: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283068).
- CVE-2026-102274: Malformed RSA JWK aborts parsing of an entire JWK Set (bsc#1283071).
- CVE-2026-102275: an attacker may use a stolen sender-constrained token without the legitimate private key (bsc#1283072).
- CVE-2026-103001: reused mutable options mapping can cause verification checks bypass on subsequent decode calls (bsc#1283829).
- Record
SUSE-SU-2026:24377-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:5064-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues:
- CVE-2026-101917: attacker traffic can amplify outbound requests to the configured JWKS endpoint (bsc#1283060).
- CVE-2026-101918: unauthenticated request can raise an exception that may produce an HTTP 500 response (bsc#1283061).
- CVE-2026-102267: forwarded credentials may be disclosed or verification keys may be substituted (bsc#1283064).
- CVE-2026-102268: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283065).
- CVE-2026-102269: raw-token revocation checks can fail to recognize an equivalent modified token (bsc#1283066).
- CVE-2026-102270: an attacker can cause intensive CPU consumption (bsc#1283067).
- CVE-2026-102271: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283068).
- CVE-2026-102275: an attacker may use a stolen sender-constrained token without the legitimate private key (bsc#1283072).
- Record
SUSE-SU-2026:5064-1- Updated
- 2026-11-03
OSVUSN-8934-1 No score
pyjwt vulnerabilities
Kingsley Olukanni discovered that PyJWT did not properly handle unknown key identifiers when retrieving signing keys. An attacker could possibly use this issue to amplify requests to the configured key endpoint, resulting in a denial of service. This issue only affected Ubuntu 22.04 LTS, Ubuntu 24.04 LTS, Ubuntu 26.04 LTS and Ubuntu 26.10. (CVE-2026-101917)
Ekalabya Ghosh discovered that PyJWT did not properly handle certain recursively nested JSON payloads. An attacker could possibly use this issue to cause an application to fail, resulting in a denial of service. (CVE-2026-101918)
Pedram Hayati discovered that PyJWT did not properly handle malformed RSA keys in a JSON Web Key Set. An attacker could possibly use this issue to cause authentication failures or a denial of service. This issue only affected Ubuntu 22.04 LTS, Ubuntu 24.04 LTS, Ubuntu 26.04 LTS and Ubuntu 26.10. (CVE-2026-102274)
It was discovered that PyJWT did not properly validate certain OKP private key components. An attacker could possibly use this issue to confuse the identity of public and private keys, and use a stolen sender-constrained token without the legitimate private key. This issue only affected Ubuntu 22.04 LTS, Ubuntu 24.04 LTS, Ubuntu 26.04 LTS and Ubuntu 26.10. (CVE-2026-102275)
- Record
USN-8934-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
pyjwtPyPI |
2.0.0a1 to 2.14.0 | 2.15.0 |
python-jwtAzure Linux:3 |
before 2.15.1-1 | 2.15.1-1 |
py3-jwtAlpaquita:25 |
2.10.1-r0 up to 2.15.1-r0 | 2.15.1-r0 |
py3-jwtAlpaquita:stream |
2.8.0-r1 up to 2.15.1-r0 | 2.15.1-r0 |
pyjwtTuxCare:PyPI From an advisory covering 7 CVEs |
2.3.0 up to 2.3.0.post4+tuxcare, plus listed versions 2.3.0.post1+tuxcare2.3.0.post2+tuxcare2.3.0.post3+tuxcare |
2.3.0.post4+tuxcare |
pyjwtTuxCare:PyPI From an advisory covering 2 CVEs |
2.10.1 up to 2.10.1.post6+tuxcare, plus listed versions 2.10.1.post1+tuxcare2.10.1.post2+tuxcare2.10.1.post3+tuxcare2.10.1.post4+tuxcare2.10.1.post5+tuxcare |
2.10.1.post6+tuxcare |
pyjwtTuxCare:PyPI From an advisory covering 2 CVEs |
2.8.0 up to 2.8.0.post5+tuxcare, plus listed versions 2.8.0.post1+tuxcare2.8.0.post2+tuxcare2.8.0.post3+tuxcare2.8.0.post4+tuxcare |
2.8.0.post5+tuxcare |
pyjwtDebian:12 |
All versions, plus listed versions 2.10.1-12.10.1-22.10.1-32.10.1-42.11.0-2 Show 8 moreShow less2.12.1-12.13.0-12.14.0-12.15.0-12.15.1-12.6.0-12.6.0-1+deb12u12.7.0-1 |
None known |
pyjwtDebian:13 |
All versions, plus listed versions 2.10.1-22.10.1-2+deb13u12.10.1-32.10.1-42.11.0-2 Show 5 moreShow less2.12.1-12.13.0-12.14.0-12.15.0-12.15.1-1 |
None known |
pyjwtDebian:14 |
before 2.15.0-1, plus listed versions 2.10.1-22.10.1-32.10.1-42.11.0-22.12.1-12.13.0-12.14.0-1 |
2.15.0-1 |
Show 38 moreShow less
| Package | Affected | Fixed |
|---|---|---|
pyjwtPyPI |
2.0.0a1 up to 2.15.0, plus listed versions 2.0.02.0.0a22.0.12.1.02.10.0 Show 14 moreShow less2.10.12.11.02.12.02.12.12.13.02.14.02.2.02.3.02.4.02.5.02.6.02.7.02.8.02.9.0 |
2.15.0 |
python-jwtopenEuler:24.03-LTS-SP4 From an advisory covering 5 CVEs |
before 2.8.0-11.oe2403sp4 | 2.8.0-11.oe2403sp4 |
python-jwtopenEuler:22.03-LTS-SP4 From an advisory covering 4 CVEs |
before 2.3.0-12.oe2203sp4 | 2.3.0-12.oe2203sp4 |
python-jwtopenEuler:24.03-LTS-SP1 From an advisory covering 5 CVEs |
before 2.8.0-11.oe2403sp1 | 2.8.0-11.oe2403sp1 |
python-jwtopenEuler:24.03-LTS-SP3 From an advisory covering 5 CVEs |
before 2.8.0-11.oe2403sp3 | 2.8.0-11.oe2403sp3 |
python-PyJWTSUSE:Linux Micro 6.2 From an advisory covering 10 CVEs |
before 2.12.1-160000.3.1 | 2.12.1-160000.3.1 |
python-PyJWTSUSE:Linux Micro 6.0 From an advisory covering 9 CVEs |
before 2.9.0-159998.1.1 | 2.9.0-159998.1.1 |
python-PyJWTSUSE:Linux Enterprise Server 16.0 From an advisory covering 10 CVEs |
before 2.12.1-160000.3.1 | 2.12.1-160000.3.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP applications 16.0 From an advisory covering 10 CVEs |
before 2.12.1-160000.3.1 | 2.12.1-160000.3.1 |
python-PyJWTSUSE:Linux Micro 6.1 From an advisory covering 10 CVEs |
before 2.12.1-slfo.1.1_3.1 | 2.12.1-slfo.1.1_3.1 |
python-PyJWTSUSE:Linux Enterprise Module for Public Cloud 15 SP4 From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise Module for Python 3 15 SP7 From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP4-LTSS From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP5-LTSS From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP6-LTSS From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP Applications 15 SP4 From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP Applications 15 SP5 From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP Applications 15 SP6 From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
pyjwtUbuntu:Pro:16.04:LTS |
before 1.3.0-1ubuntu0.1+esm4, plus listed versions 1.0.0-0ubuntu11.3.0-11.3.0-1ubuntu0.11.3.0-1ubuntu0.1+esm11.3.0-1ubuntu0.1+esm21.3.0-1ubuntu0.1+esm3 |
1.3.0-1ubuntu0.1+esm4 |
pyjwtUbuntu:Pro:18.04:LTS |
before 1.5.3+ds1-1ubuntu0.1+esm4, plus listed versions 1.4.2-1.11.5.3+ds1-11.5.3+ds1-1ubuntu0.11.5.3+ds1-1ubuntu0.1+esm11.5.3+ds1-1ubuntu0.1+esm21.5.3+ds1-1ubuntu0.1+esm3 |
1.5.3+ds1-1ubuntu0.1+esm4 |
pyjwtUbuntu:Pro:20.04:LTS |
before 1.7.1-2ubuntu2.1+esm4, plus listed versions 1.7.0-21.7.1-11.7.1-2ubuntu11.7.1-2ubuntu21.7.1-2ubuntu2.11.7.1-2ubuntu2.1+esm11.7.1-2ubuntu2.1+esm21.7.1-2ubuntu2.1+esm3 |
1.7.1-2ubuntu2.1+esm4 |
pyjwtUbuntu:22.04:LTS |
before 2.3.0-1ubuntu0.6, plus listed versions 1.7.1-2ubuntu22.1.0-12.3.0-12.3.0-1ubuntu0.12.3.0-1ubuntu0.22.3.0-1ubuntu0.32.3.0-1ubuntu0.42.3.0-1ubuntu0.5 |
2.3.0-1ubuntu0.6 |
pyjwtUbuntu:24.04:LTS |
before 2.7.0-1ubuntu0.4, plus listed versions 2.7.0-12.7.0-1ubuntu0.12.7.0-1ubuntu0.22.7.0-1ubuntu0.3 |
2.7.0-1ubuntu0.4 |
pyjwtUbuntu:26.10 |
before 2.13.0-1ubuntu1.1, plus listed versions 2.10.1-4ubuntu12.12.1-12.13.0-12.13.0-1ubuntu1 |
2.13.0-1ubuntu1.1 |
pyjwtUbuntu:26.04:LTS |
before 2.10.1-4ubuntu1.3, plus listed versions 2.10.1-22.10.1-32.10.1-3build12.10.1-42.10.1-4ubuntu12.10.1-4ubuntu1.12.10.1-4ubuntu1.2 |
2.10.1-4ubuntu1.3 |
pyjwtUbuntu:Pro:16.04:LTS From an advisory covering 4 CVEs |
before 1.3.0-1ubuntu0.1+esm4, plus listed versions 1.0.0-0ubuntu11.3.0-11.3.0-1ubuntu0.11.3.0-1ubuntu0.1+esm11.3.0-1ubuntu0.1+esm21.3.0-1ubuntu0.1+esm3 |
1.3.0-1ubuntu0.1+esm4 |
pyjwtUbuntu:Pro:18.04:LTS From an advisory covering 4 CVEs |
before 1.5.3+ds1-1ubuntu0.1+esm4, plus listed versions 1.4.2-1.11.5.3+ds1-11.5.3+ds1-1ubuntu0.11.5.3+ds1-1ubuntu0.1+esm11.5.3+ds1-1ubuntu0.1+esm21.5.3+ds1-1ubuntu0.1+esm3 |
1.5.3+ds1-1ubuntu0.1+esm4 |
pyjwtUbuntu:Pro:20.04:LTS From an advisory covering 4 CVEs |
before 1.7.1-2ubuntu2.1+esm4, plus listed versions 1.7.0-21.7.1-11.7.1-2ubuntu11.7.1-2ubuntu21.7.1-2ubuntu2.11.7.1-2ubuntu2.1+esm11.7.1-2ubuntu2.1+esm21.7.1-2ubuntu2.1+esm3 |
1.7.1-2ubuntu2.1+esm4 |
pyjwtUbuntu:22.04:LTS From an advisory covering 4 CVEs |
before 2.3.0-1ubuntu0.6, plus listed versions 1.7.1-2ubuntu22.1.0-12.3.0-12.3.0-1ubuntu0.12.3.0-1ubuntu0.22.3.0-1ubuntu0.32.3.0-1ubuntu0.42.3.0-1ubuntu0.5 |
2.3.0-1ubuntu0.6 |
pyjwtUbuntu:24.04:LTS From an advisory covering 4 CVEs |
before 2.7.0-1ubuntu0.4, plus listed versions 2.7.0-12.7.0-1ubuntu0.12.7.0-1ubuntu0.22.7.0-1ubuntu0.3 |
2.7.0-1ubuntu0.4 |
pyjwtUbuntu:26.10 From an advisory covering 4 CVEs |
before 2.13.0-1ubuntu1.1, plus listed versions 2.10.1-4ubuntu12.12.1-12.13.0-12.13.0-1ubuntu1 |
2.13.0-1ubuntu1.1 |
pyjwtUbuntu:26.04:LTS From an advisory covering 4 CVEs |
before 2.10.1-4ubuntu1.3, plus listed versions 2.10.1-22.10.1-32.10.1-3build12.10.1-42.10.1-4ubuntu12.10.1-4ubuntu1.12.10.1-4ubuntu1.2 |
2.10.1-4ubuntu1.3 |
python-PyJWTopenSUSE:Tumbleweed From an advisory covering 9 CVEs |
before 2.15.1-1.1 | 2.15.1-1.1 |
python-PyJWTopenSUSE:Leap 16.0 From an advisory covering 10 CVEs |
before 2.12.1-160000.3.1 | 2.12.1-160000.3.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, aliases, references | OSV | |
| affected | OSV | |
| affected, aliases, facts, references | OSV | |
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-101918 is a medium vulnerability (CVSS 5.3) in Jpadilla Pyjwt, published September 28, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.41%, the 35th percentile. Fixed in pyjwt 2.15.0.
References
github.com/jpadilla/pyjwt/security/advisories/GHSA-42vr-xj54-vc7v
github.com/jpadilla/pyjwt/commit/5fde08a6cf906aa7698de2d6391d88b73006b17b
github.com/jpadilla/pyjwt/releases/tag/2.15.0
nvd.nist.gov/vuln/detail/CVE-2026-101918
github.com/advisories/GHSA-42vr-xj54-vc7v
docs.bell-sw.com/security/cves/CVE-2026-101918
Show 45 moreShow less
github.com/CVEProject/cvelistV5/tree/main/cves/2026/101xxx/CVE-2026-101918.json
security-tracker.debian.org/tracker/CVE-2026-101918
github.com/jpadilla/pyjwt
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-4453
nvd.nist.gov/vuln/detail/CVE-2026-101917
nvd.nist.gov/vuln/detail/CVE-2026-102265
nvd.nist.gov/vuln/detail/CVE-2026-102269
nvd.nist.gov/vuln/detail/CVE-2026-102275
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-4454
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-4455
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-4456
pypi.org/project/pyjwt
suse.com/support/update/announcement/2026/suse-su-202624126-1
bugzilla.suse.com/1283060
bugzilla.suse.com/1283061
bugzilla.suse.com/1283064
bugzilla.suse.com/1283065
bugzilla.suse.com/1283066
bugzilla.suse.com/1283067
bugzilla.suse.com/1283068
bugzilla.suse.com/1283071
bugzilla.suse.com/1283072
bugzilla.suse.com/1283829
suse.com/security/cve/CVE-2026-101917
suse.com/security/cve/CVE-2026-101918
suse.com/security/cve/CVE-2026-102267
suse.com/security/cve/CVE-2026-102268
suse.com/security/cve/CVE-2026-102269
suse.com/security/cve/CVE-2026-102270
suse.com/security/cve/CVE-2026-102271
suse.com/security/cve/CVE-2026-102274
suse.com/security/cve/CVE-2026-102275
suse.com/security/cve/CVE-2026-103001
suse.com/support/update/announcement/2026/suse-su-202624134-1
suse.com/support/update/announcement/2026/suse-su-202624219-1
suse.com/support/update/announcement/2026/suse-su-202624377-1
suse.com/support/update/announcement/2026/suse-su-20265064-1
ubuntu.com/security/CVE-2026-101918
cve.org/CVERecord?id=CVE-2026-101918
ubuntu.com/security/notices/USN-8934-1
ubuntu.com/security/CVE-2026-101917
ubuntu.com/security/CVE-2026-102274
ubuntu.com/security/CVE-2026-102275
suse.com/security/cve/CVE-2026-102266
suse.com/security/cve/CVE-2026-102272
Left out here: the rest of 3 source descriptions. The JSON record has them.