Every CVE Search/ Get API key

CVE-2026-101918

PyJWT: Unauthenticated RecursionError DoS in pre-verification payload parse (PyJWKClient.get_signing_key_from_jwt / verify_signature=False)

5.3 MediumFix available

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

0.41%Up 0.1 points since Sep 29, 2026
90%50%10%1%

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 MediumCVSS: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 MediumCVSS: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 MediumCVSS: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 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
CVSS 3.1
7.5 HighCVSS: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 HighCVSS: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 MediumCVSS: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 HighCVSS: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 MediumCVSS: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 MediumCVSS: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 MediumCVSS: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 MediumCVSS: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 MediumCVSS: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 MediumCVSS: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 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
CVSS 3.1
7.5 HighCVSS: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

Affected packages
PackageAffectedFixed
pyjwt
PyPI
2.0.0a1 to 2.14.0
2.15.0
python-jwt
Azure Linux:3
before 2.15.1-1
2.15.1-1
py3-jwt
Alpaquita:25
2.10.1-r0 up to 2.15.1-r0
2.15.1-r0
py3-jwt
Alpaquita:stream
2.8.0-r1 up to 2.15.1-r0
2.15.1-r0
pyjwt
TuxCare: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
pyjwt
TuxCare: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
pyjwt
TuxCare: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
pyjwt
Debian: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 less
2.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
pyjwt
Debian: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 less
2.12.1-12.13.0-12.14.0-12.15.0-12.15.1-1
None known
pyjwt
Debian: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
Affected packages
PackageAffectedFixed
pyjwt
PyPI
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 less
2.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-jwt
openEuler:24.03-LTS-SP4
From an advisory covering 5 CVEs
before 2.8.0-11.oe2403sp4
2.8.0-11.oe2403sp4
python-jwt
openEuler:22.03-LTS-SP4
From an advisory covering 4 CVEs
before 2.3.0-12.oe2203sp4
2.3.0-12.oe2203sp4
python-jwt
openEuler:24.03-LTS-SP1
From an advisory covering 5 CVEs
before 2.8.0-11.oe2403sp1
2.8.0-11.oe2403sp1
python-jwt
openEuler:24.03-LTS-SP3
From an advisory covering 5 CVEs
before 2.8.0-11.oe2403sp3
2.8.0-11.oe2403sp3
python-PyJWT
SUSE:Linux Micro 6.2
From an advisory covering 10 CVEs
before 2.12.1-160000.3.1
2.12.1-160000.3.1
python-PyJWT
SUSE:Linux Micro 6.0
From an advisory covering 9 CVEs
before 2.9.0-159998.1.1
2.9.0-159998.1.1
python-PyJWT
SUSE: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-PyJWT
SUSE: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-PyJWT
SUSE: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-PyJWT
SUSE: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-PyJWT
SUSE: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-PyJWT
SUSE: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-PyJWT
SUSE: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-PyJWT
SUSE: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-PyJWT
SUSE: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-PyJWT
SUSE: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-PyJWT
SUSE: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-PyJWT
SUSE: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-PyJWT
SUSE: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-PyJWT
SUSE: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-PyJWT
SUSE: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
pyjwt
Ubuntu: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
pyjwt
Ubuntu: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
pyjwt
Ubuntu: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
pyjwt
Ubuntu: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
pyjwt
Ubuntu: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
pyjwt
Ubuntu: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
pyjwt
Ubuntu: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
pyjwt
Ubuntu: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
pyjwt
Ubuntu: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
pyjwt
Ubuntu: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
pyjwt
Ubuntu: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
pyjwt
Ubuntu: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
pyjwt
Ubuntu: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
pyjwt
Ubuntu: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-PyJWT
openSUSE:Tumbleweed
From an advisory covering 9 CVEs
before 2.15.1-1.1
2.15.1-1.1
python-PyJWT
openSUSE:Leap 16.0
From an advisory covering 10 CVEs
before 2.12.1-160000.3.1
2.12.1-160000.3.1

History

History
RecordedChangedSources
affected, aliases, referencesOSV
affectedOSV
affected, aliases, facts, referencesOSV
first indexedCVE 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

Show 45 moreShow less
This page doesn't list everything

Left out here: the rest of 3 source descriptions. The JSON record has them.

MoveEnter Open