PatchSiren cyber security CVE debrief
CVE-2026-48523 jpadilla CVE debrief
A verifier-side algorithm allow-list bypass exists in PyJWT versions 2.9.0 through 2.12.1. When `jwt.decode()` or `jwt.decode_complete()` is called with a PyJWK key, the token header's `alg` parameter is validated against the caller-supplied algorithms allow-list, but signature verification is performed using the algorithm bound to the PyJWK object rather than the header algorithm. An attacker who controls a registered JWK/JWKS private key can sign a token with a disallowed algorithm, advertise an allowed algorithm in the JWT header, and still pass verification. This affects the documented `PyJWKClient.get_signing_key_from_jwt(...)` workflow. The vulnerability is classified as CWE-347 (Improper Verification of Cryptographic Signature).
- Vendor
- jpadilla
- Product
- pyjwt
- CVSS
- MEDIUM 5.4
- CISA KEV
- Not listed in stored evidence
- Original CVE published
- 2026-05-28
- Original CVE updated
- 2026-06-01
- Advisory published
- 2026-05-28
- Advisory updated
- 2026-06-01
Who should care
Organizations using PyJWT for JWT verification with PyJWK keys, particularly those implementing OIDC or other JWK-based authentication flows, should prioritize this update. Developers using `PyJWKClient` or manually constructing PyJWK objects for token validation are affected.
Technical summary
The vulnerability stems from a separation between algorithm validation and signature verification in PyJWT's handling of PyJWK keys. When a PyJWK object is provided to `jwt.decode()` or `jwt.decode_complete()`, the library checks the JWT header's `alg` claim against the caller's `algorithms` parameter, but then uses the algorithm embedded in the PyJWK object for actual signature verification. This allows an attacker with control of a legitimate private key in a JWKS to create tokens that pass algorithm allow-list checks while being verified with a different, potentially weaker or attacker-controlled algorithm. The issue specifically impacts the `PyJWKClient.get_signing_key_from_jwt()` pattern documented for fetching signing keys from a JWKS endpoint.
Defensive priority
medium
Recommended defensive actions
- Upgrade PyJWT to version 2.13.0 or later to remediate this vulnerability
- Review JWT verification implementations that use PyJWK keys to ensure they are not relying solely on header algorithm validation
- Audit applications using `PyJWKClient.get_signing_key_from_jwt()` for potential exposure to this bypass
- Verify that JWT verification logic explicitly validates that the algorithm used for signature verification matches the allowed algorithms list
Evidence notes
The CVE description and NVD record confirm the affected version range (2.9.0 to 2.12.1) and the specific bypass mechanism involving PyJWK objects. The GitHub Security Advisory provides the authoritative fix reference.
Sources and references
Verified primary and authoritative sources
-
CVE-2026-48523 CVE Program record
Publisher, destination, and source semantics verified
URL: https://www.cve.org/CVERecord?id=CVE-2026-48523
CVE Program - Official CVE Program record with source-provided CVE metadata.
-
CVE-2026-48523 NVD vulnerability detail
Publisher, destination, and source semantics verified
URL: https://nvd.nist.gov/vuln/detail/CVE-2026-48523
NIST National Vulnerability Database - Official NIST NVD detail page and source-specific vulnerability assessment.
Supplemental references
-
Source reference
Unverified legacy reference
URL: https://github.com/jpadilla/pyjwt/security/advisories/GHSA-jq35-7prp-9v3f
Methodology and review provenance
AI-assisted synthesis based on stored public vulnerability evidence. System validation, approval state, and publication status do not by themselves establish human review of this revision. PatchSiren helps prioritize defensive review and does not prove exposure or remediation on any system.