CVE-2026-48525
PyJWT: Unauthenticated DoS via unbounded Base64URL decoding of unused payload segment in b64=false detached JWS
PyJWT is a JSON Web Token implementation in Python. From 2.8.0 to 2.12.1, when verifying detached JWS tokens using the unencoded-payload option ("b64": false, RFC 7797), PyJWT performs Base64URL decoding of the compact-serialization payload segment before enforcing the detached-payload rules. For b64=false, PyJWT later discards that decoded payload and replaces it with the caller-provided detached_payload. In practice, this turns the middle segment into an attacker-controlled “work amplifier”: a remote client can supply an arbitrarily large Base64URL payload segment that forces CPU work + memory allocations even if the signature is invalid. This creates an unauthenticated DoS vector against any endpoint that verifies detached JWS using PyJWT. This vulnerability is fixed in 2.13.0.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- None
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
5.3
PyJWT: Unauthenticated DoS via unbounded Base64URL decoding of unused payload segment in b64=false detached JWS
PyJWT is a JSON Web Token implementation in Python. From 2.8.0 to 2.12.1, when verifying detached JWS tokens using the unencoded-payload option ("b64": false, RFC 7797), PyJWT performs Base64URL decoding of the compact-serialization payload segment before enforcing the detached-payload rules. For b64=false, PyJWT later discards that decoded payload and replaces it with the caller-provided detached_payload. In practice, this turns the middle segment into an attacker-controlled “work amplifier”: a remote client can supply an arbitrarily large Base64URL payload segment that forces CPU work + memory allocations even if the signature is invalid. This creates an unauthenticated DoS vector against any endpoint that verifies detached JWS using PyJWT. This vulnerability is fixed in 2.13.0.
- Record
CVE-2026-48525- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400
- Updated
- 2026-11-02
EUVDEUVD-2026-32919
5.3
PyJWT is a JSON Web Token implementation in Python. From 2.8.0 to 2.12.1, when verifying detached JWS tokens using the unencoded-payload option ("b64": false, RFC 7797), PyJWT performs Base64URL decoding of the compact-serialization payload segment before enforcing the detached-payload rules. For b64=false, PyJWT later discards that decoded payload and replaces it with the caller-provided detached_payload. In practice, this turns the middle segment into an attacker-controlled “work amplifier”: a remote client can supply an arbitrarily large Base64URL payload segment that forces CPU work + memory allocations even if the signature is invalid. This creates an unauthenticated DoS vector against any endpoint that verifies detached JWS using PyJWT. This vulnerability is fixed in 2.13.0.
- Record
EUVD-2026-32919- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-w7vc-732c-9m39
5.3
PyJWT: Unauthenticated DoS via unbounded Base64URL decoding of unused payload segment in b64=false detached JWS
[!NOTE] Practical impact depends on whether request body-size limits are enforced upstream (proxy/web-server/framework). Deployments with typical body-size caps (≤2 MB) bound the amplifier significantly; deployments accepting larger token inputs are more exposed.
When verifying detached JWS tokens using the unencoded-payload option ("b64": false, RFC 7797), PyJWT performs Base64URL decoding of the compact-serialization payload segment before enforcing the detached-payload rules.
For b64=false, PyJWT later discards that decoded payload and replaces it with the caller-provided detached_payload. In practice, this turns the middle segment into an attacker-controlled “work amplifier”: a remote client can supply an arbitrarily large Base64URL payload segment that forces CPU work + memory allocations even if the signature is invalid.
This creates an unauthenticated DoS vector against any endpoint that verifies detached JWS using PyJWT.
Affected Component(s)
-
jwt/api_jws.pyPyJWS.decode()/PyJWS.decode_complete()_load()(parsing and Base64URL decoding)
Root Cause (exact logic flaw)
What happens in the code
In jwt/api_jws.py, decode_complete() does the following (order matters):
- Calls
_load(jwt)first, which decodes the token segments - Only after that, checks
header.get("b64")and ifFalse, it replacespayload = detached_payloadand rebuilds the signing input
This behavior is visible in decode_complete():
_load(jwt)happens before theb64=falsehandling- then
payload = detached_payloadandsigning_input = ... detached_payloadhappens afterward ([GitHub][1])
Inside _load(), PyJWT unconditionally performs:
payload = base64url_decode(payload_segment)This is the expensive step the attacker can amplify ([GitHub][1])
Why this becomes a vulnerability
For b64=false detached JWS, the payload segment in compact form is effectively not needed for verification in PyJWT’s own logic (since the library uses detached_payload as the real payload). Yet PyJWT still decodes it first, meaning:
- cost is paid even when signature is invalid
- the decoded bytes are discarded
- attacker controls the size of this cost via token length
Impact (evidence-driven)
Security impact
- Unauthenticated remote DoS: decoding work happens before signature rejection → attacker does not need signing key.
- CPU amplification: Base64URL decode time scales linearly with payload segment size.
- Memory amplification: decoded output allocates large byte buffers (tens of MB per request).
- Operational impact: request queueing / worker starvation under modest concurrency bursts.
Standards context (RFC 7797)
RFC 7797 explicitly notes this option is used when payload is large and/or detached, and discusses interoperability requirements around marking it critical (“crit” with “b64”). ([IETF Datatracker][2])
(PyJWT supports crit validation, but the issue here is decode order / unbounded decode of an unused segment.)
Affected Versions
- Confirmed affected: PyJWT 2.12.1 (tested from your local editable install and repo).
- Likely affected: all versions that include detached payload support for JWS decoding, which was introduced in 2.4.0 (“Add detached payload support for JWS encoding and decoding”). ([pyjwt.readthedocs.io][3])
(For GHSA, this phrasing is strong: “confirmed” + “likely since feature introduction”.)
Threat Model
Typical real deployment
A service verifies signed HTTP requests or webhooks using detached JWS:
- token is provided in JSON body / query / header
- actual payload is the HTTP request body passed as
detached_payload
Attacker
- remote unauthenticated client
- can send requests to verify endpoint
- does not need a valid signature (invalid signature still triggers the expensive decode path)
Attack…
- Record
GHSA-w7vc-732c-9m39- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400
- Updated
- 2026-11-02
NVD
5.3
PyJWT is a JSON Web Token implementation in Python. From 2.8.0 to 2.12.1, when verifying detached JWS tokens using the unencoded-payload option ("b64": false, RFC 7797), PyJWT performs Base64URL decoding of the compact-serialization payload segment before enforcing the detached-payload rules. For b64=false, PyJWT later discards that decoded payload and replaces it with the caller-provided detached_payload. In practice, this turns the middle segment into an attacker-controlled “work amplifier”: a remote client can supply an arbitrarily large Base64URL payload segment that forces CPU work + memory allocations even if the signature is invalid. This creates an unauthenticated DoS vector against any endpoint that verifies detached JWS using PyJWT. This vulnerability is fixed in 2.13.0.
- Record
CVE-2026-48525- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400
- Updated
- 2026-11-02
OSVBELL-CVE-2026-48525
5.3
- Record
BELL-CVE-2026-48525- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
OSV
5.3
PyJWT: Unauthenticated DoS via unbounded Base64URL decoding of unused payload segment in b64=false detached JWS
PyJWT is a JSON Web Token implementation in Python. From 2.8.0 to 2.12.1, when verifying detached JWS tokens using the unencoded-payload option ("b64": false, RFC 7797), PyJWT performs Base64URL decoding of the compact-serialization payload segment before enforcing the detached-payload rules. For b64=false, PyJWT later discards that decoded payload and replaces it with the caller-provided detached_payload. In practice, this turns the middle segment into an attacker-controlled “work amplifier”: a remote client can supply an arbitrarily large Base64URL payload segment that forces CPU work + memory allocations even if the signature is invalid. This creates an unauthenticated DoS vector against any endpoint that verifies detached JWS using PyJWT. This vulnerability is fixed in 2.13.0.
- Record
CVE-2026-48525- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400
- Updated
- 2026-11-02
Show 17 moreShow less
OSVDEBIAN-CVE-2026-48525
5.3
PyJWT is a JSON Web Token implementation in Python. From 2.8.0 to 2.12.1, when verifying detached JWS tokens using the unencoded-payload option ("b64": false, RFC 7797), PyJWT performs Base64URL decoding of the compact-serialization payload segment before enforcing the detached-payload rules. For b64=false, PyJWT later discards that decoded payload and replaces it with the caller-provided detached_payload. In practice, this turns the middle segment into an attacker-controlled “work amplifier”: a remote client can supply an arbitrarily large Base64URL payload segment that forces CPU work + memory allocations even if the signature is invalid. This creates an unauthenticated DoS vector against any endpoint that verifies detached JWS using PyJWT. This vulnerability is fixed in 2.13.0.
- Record
DEBIAN-CVE-2026-48525- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
OSVGHSA-w7vc-732c-9m39
5.3
PyJWT: Unauthenticated DoS via unbounded Base64URL decoding of unused payload segment in b64=false detached JWS
[!NOTE] Practical impact depends on whether request body-size limits are enforced upstream (proxy/web-server/framework). Deployments with typical body-size caps (≤2 MB) bound the amplifier significantly; deployments accepting larger token inputs are more exposed.
When verifying detached JWS tokens using the unencoded-payload option ("b64": false, RFC 7797), PyJWT performs Base64URL decoding of the compact-serialization payload segment before enforcing the detached-payload rules.
For b64=false, PyJWT later discards that decoded payload and replaces it with the caller-provided detached_payload. In practice, this turns the middle segment into an attacker-controlled “work amplifier”: a remote client can supply an arbitrarily large Base64URL payload segment that forces CPU work + memory allocations even if the signature is invalid.
This creates an unauthenticated DoS vector against any endpoint that verifies detached JWS using PyJWT.
Affected Component(s)
-
jwt/api_jws.pyPyJWS.decode()/PyJWS.decode_complete()_load()(parsing and Base64URL decoding)
Root Cause (exact logic flaw)
What happens in the code
In jwt/api_jws.py, decode_complete() does the following (order matters):
- Calls
_load(jwt)first, which decodes the token segments - Only after that, checks
header.get("b64")and ifFalse, it replacespayload = detached_payloadand rebuilds the signing input
This behavior is visible in decode_complete():
_load(jwt)happens before theb64=falsehandling- then
payload = detached_payloadandsigning_input = ... detached_payloadhappens afterward ([GitHub][1])
Inside _load(), PyJWT unconditionally performs:
payload = base64url_decode(payload_segment)This is the expensive step the attacker can amplify ([GitHub][1])
Why this becomes a vulnerability
For b64=false detached JWS, the payload segment in compact form is effectively not needed for verification in PyJWT’s own logic (since the library uses detached_payload as the real payload). Yet PyJWT still decodes it first, meaning:
- cost is paid even when signature is invalid
- the decoded bytes are discarded
- attacker controls the size of this cost via token length
Impact (evidence-driven)
Security impact
- Unauthenticated remote DoS: decoding work happens before signature rejection → attacker does not need signing key.
- CPU amplification: Base64URL decode time scales linearly with payload segment size.
- Memory amplification: decoded output allocates large byte buffers (tens of MB per request).
- Operational impact: request queueing / worker starvation under modest concurrency bursts.
Standards context (RFC 7797)
RFC 7797 explicitly notes this option is used when payload is large and/or detached, and discusses interoperability requirements around marking it critical (“crit” with “b64”). ([IETF Datatracker][2])
(PyJWT supports crit validation, but the issue here is decode order / unbounded decode of an unused segment.)
Affected Versions
- Confirmed affected: PyJWT 2.12.1 (tested from your local editable install and repo).
- Likely affected: all versions that include detached payload support for JWS decoding, which was introduced in 2.4.0 (“Add detached payload support for JWS encoding and decoding”). ([pyjwt.readthedocs.io][3])
(For GHSA, this phrasing is strong: “confirmed” + “likely since feature introduction”.)
Threat Model
Typical real deployment
A service verifies signed HTTP requests or webhooks using detached JWS:
- token is provided in JSON body / query / header
- actual payload is the HTTP request body passed as
detached_payload
Attacker
- remote unauthenticated client
- can send requests to verify endpoint
- does not need a valid signature (invalid signature still triggers the expensive decode path)
Attack…
- Record
GHSA-w7vc-732c-9m39- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400
- Updated
- 2026-11-02
OSVPYSEC-2026-178
5.3
PyJWT is a JSON Web Token implementation in Python. From 2.8.0 to 2.12.1, when verifying detached JWS tokens using the unencoded-payload option ("b64": false, RFC 7797), PyJWT performs Base64URL decoding of the compact-serialization payload segment before enforcing the detached-payload rules. For b64=false, PyJWT later discards that decoded payload and replaces it with the caller-provided detached_payload. In practice, this turns the middle segment into an attacker-controlled “work amplifier”: a remote client can supply an arbitrarily large Base64URL payload segment that forces CPU work + memory allocations even if the signature is invalid. This creates an unauthenticated DoS vector against any endpoint that verifies detached JWS using PyJWT. This vulnerability is fixed in 2.13.0.
- Record
PYSEC-2026-178- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-48525
5.3
PyJWT is a JSON Web Token implementation in Python. From 2.8.0 to 2.12.1, when verifying detached JWS tokens using the unencoded-payload option ("b64": false, RFC 7797), PyJWT performs Base64URL decoding of the compact-serialization payload segment before enforcing the detached-payload rules. For b64=false, PyJWT later discards that decoded payload and replaces it with the caller-provided detached_payload. In practice, this turns the middle segment into an attacker-controlled “work amplifier”: a remote client can supply an arbitrarily large Base64URL payload segment that forces CPU work + memory allocations even if the signature is invalid. This creates an unauthenticated DoS vector against any endpoint that verifies detached JWS using PyJWT. This vulnerability is fixed in 2.13.0.
- Record
UBUNTU-CVE-2026-48525- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
OSVAZL-93042 No score
CVE-2026-48525 affecting package python-jwt for versions less than 2.13.0-1
PyJWT is a JSON Web Token implementation in Python. From 2.8.0 to 2.12.1, when verifying detached JWS tokens using the unencoded-payload option ("b64": false, RFC 7797), PyJWT performs Base64URL decoding of the compact-serialization payload segment before enforcing the detached-payload rules. For b64=false, PyJWT later discards that decoded payload and replaces it with the caller-provided detached_payload. In practice, this turns the middle segment into an attacker-controlled “work amplifier”: a remote client can supply an arbitrarily large Base64URL payload segment that forces CPU work + memory allocations even if the signature is invalid. This creates an unauthenticated DoS vector against any endpoint that verifies detached JWS using PyJWT. This vulnerability is fixed in 2.13.0.
- Record
AZL-93042- Updated
- 2026-11-02
OSVCLSA-2026-1783299703 No score
TuxCare security update for pyjwt (4 CVEs)
TuxCare rebuilt pyjwt to address 4 CVEs. Fixed in 2.10.1.post2+tuxcare.
- Record
CLSA-2026-1783299703- Updated
- 2026-11-02
OSVCLSA-2026-1787038724 No score
TuxCare security update for pyjwt (3 CVEs)
TuxCare rebuilt pyjwt to address 3 CVEs. Fixed in 1.7.1.post3+tuxcare.
- Record
CLSA-2026-1787038724- 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-48525 No score
CVE-2026-48525 in PyJWT - Patched by Root
Root has patched CVE-2026-48525 in the PyJWT package for Root:PyPI. Multiple fixed versions available.
- Record
ROOT-APP-PYPI-CVE-2026-48525- 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.8.0 to 2.12.1 | 2.13.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 From an advisory covering 4 CVEs |
2.10.1 up to 2.10.1.post2+tuxcare, plus listed versions 2.10.1.post1+tuxcare |
2.10.1.post2+tuxcare |
pyjwtTuxCare:PyPI From an advisory covering 3 CVEs |
1.7.1 up to 1.7.1.post3+tuxcare, plus listed versions 1.7.1.post1+tuxcare1.7.1.post2+tuxcare |
1.7.1.post3+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 |
pyjwtPyPI |
2.8.0 up to 2.13.0, plus listed versions 2.10.02.10.12.11.02.12.02.12.12.9.0 |
2.13.0 |
Show 41 moreShow less
| Package | Affected | Fixed |
|---|---|---|
PyJWTRoot:PyPI |
before 2.9.0+aikido.6 | 2.9.0+aikido.62.10.1+aikido.62.8.0+aikido.52.12.0+aikido.32.12.1+aikido.32.10.1+aikido.72.12.0+aikido.42.12.0+aikido.52.8.0+aikido.62.12.1+aikido.42.12.1+aikido.5 |
python-PyJWTSUSE:Linux Micro 6.1 From an advisory covering 5 CVEs |
before 2.12.1-slfo.1.1_2.1 | 2.12.1-slfo.1.1_2.1 |
python-PyJWTSUSE:Linux Enterprise Server 16.0 From an advisory covering 5 CVEs |
before 2.12.1-160000.2.1 | 2.12.1-160000.2.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP applications 16.0 From an advisory covering 5 CVEs |
before 2.12.1-160000.2.1 | 2.12.1-160000.2.1 |
python-PyJWTSUSE:Linux Micro 6.2 From an advisory covering 5 CVEs |
before 2.12.1-160000.2.1 | 2.12.1-160000.2.1 |
python-PyJWTSUSE:Linux Micro 6.0 From an advisory covering 5 CVEs |
before 2.9.0-3.1 | 2.9.0-3.1 |
python-PyJWTSUSE:Linux Enterprise Module for Public Cloud 15 SP4 From an advisory covering 5 CVEs |
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 From an advisory covering 5 CVEs |
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 From an advisory covering 5 CVEs |
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 From an advisory covering 5 CVEs |
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 From an advisory covering 5 CVEs |
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 From an advisory covering 5 CVEs |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP4-LTSS From an advisory covering 5 CVEs |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP5-LTSS From an advisory covering 5 CVEs |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP6-LTSS From an advisory covering 5 CVEs |
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 From an advisory covering 5 CVEs |
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 From an advisory covering 5 CVEs |
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 From an advisory covering 5 CVEs |
before 2.8.0-150400.8.13.1 | 2.8.0-150400.8.13.1 |
python-PyJWTSUSE:Linux Enterprise Micro 5.5 From an advisory covering 4 CVEs |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise Module for Basesystem 15 SP7 From an advisory covering 4 CVEs |
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 From an advisory covering 4 CVEs |
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 From an advisory covering 4 CVEs |
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 From an advisory covering 4 CVEs |
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 From an advisory covering 4 CVEs |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP4-LTSS From an advisory covering 4 CVEs |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP5-LTSS From an advisory covering 4 CVEs |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP6-LTSS From an advisory covering 4 CVEs |
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 From an advisory covering 4 CVEs |
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 From an advisory covering 4 CVEs |
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 From an advisory covering 4 CVEs |
before 2.4.0-150200.3.14.1 | 2.4.0-150200.3.14.1 |
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 From an advisory covering 5 CVEs |
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 From an advisory covering 5 CVEs |
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 From an advisory covering 5 CVEs |
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 |
pyjwtUbuntu:22.04:LTS From an advisory covering 5 CVEs |
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 From an advisory covering 5 CVEs |
before 2.7.0-1ubuntu0.2, plus listed versions 2.7.0-12.7.0-1ubuntu0.1 |
2.7.0-1ubuntu0.2 |
pyjwtUbuntu:26.04:LTS From an advisory covering 5 CVEs |
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 |
python-PyJWTopenSUSE:Tumbleweed From an advisory covering 5 CVEs |
before 2.13.0-1.1 | 2.13.0-1.1 |
python-PyJWTopenSUSE:Leap 16.0 From an advisory covering 5 CVEs |
before 2.12.1-160000.2.1 | 2.12.1-160000.2.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, facts | ||
| 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-48525 is a medium vulnerability (CVSS 5.3) 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.37%, the 31st percentile. Fixed in pyjwt 2.13.0.
References
github.com/jpadilla/pyjwt/security/advisories/GHSA-w7vc-732c-9m39
nvd.nist.gov/vuln/detail/CVE-2026-48525
github.com/pypa/advisory-database/tree/main/vulns/pyjwt/PYSEC-2026-178.yaml
github.com/advisories/GHSA-w7vc-732c-9m39
docs.bell-sw.com/security/cves/CVE-2026-48525
github.com/CVEProject/cvelistV5/tree/main/cves/2026/48xxx/CVE-2026-48525.json
Show 25 moreShow less
security-tracker.debian.org/tracker/CVE-2026-48525
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-48525
cve.org/CVERecord?id=CVE-2026-48525
ubuntu.com/security/notices/USN-8823-1
ubuntu.com/security/CVE-2026-48522
ubuntu.com/security/CVE-2026-48523
ubuntu.com/security/CVE-2026-48524
ubuntu.com/security/CVE-2026-48526
Left out here: the rest of 2 source descriptions. The JSON record has them.