PatchSiren

PatchSiren cyber security CVE debrief

CVE-2026-48522 jpadilla CVE debrief

PyJWT's PyJWKClient prior to version 2.13.0 accepts arbitrary URI schemes through its uri parameter, which is passed directly to urllib.request.urlopen(). This allows attacker-influenced URLs to trigger unintended protocol handlers including file://, ftp://, and data:// schemes. The vulnerability creates Server-Side Request Forgery (SSRF) conditions where an attacker can read arbitrary local files or cause unexpected network requests when the application passes untrusted input (such as JWT jku headers, configuration values, or OAuth parameters) to PyJWKClient. Successful exploitation for token forgery requires additional application-layer weaknesses, including attacker write access to filesystem paths and flawed jku URL derivation logic that the PyJWT fix does not address. The CVSS 3.1 score of 4.2 (Medium) reflects the attack complexity and user interaction requirements.

Vendor
jpadilla
Product
pyjwt
CVSS
MEDIUM 4.2
CISA KEV
Not listed in stored evidence
Original CVE published
2026-05-28
Original CVE updated
2026-05-28
Advisory published
2026-05-28
Advisory updated
2026-05-28

Who should care

Development teams using PyJWT for JWT verification with PyJWKClient, particularly those accepting dynamic or attacker-influenced jku URLs; security engineers reviewing authentication implementations; DevOps teams managing Python dependency updates

Technical summary

The PyJWKClient class in PyJWT versions prior to 2.13.0 does not restrict URI schemes when fetching JSON Web Key Sets. The uri parameter passes directly to urllib.request.urlopen(), enabling file://, ftp://, and data:// protocol handlers. Attackers controlling jku header values or configuration-derived URIs can induce local file reads or unintended network requests. Token forgery exploitation requires supplementary application flaws including filesystem write access and insecure jku derivation. Fixed in PyJWT 2.13.0.

Defensive priority

medium

Recommended defensive actions

  • Upgrade PyJWT to version 2.13.0 or later to obtain scheme restriction controls
  • Validate and sanitize all URI inputs passed to PyJWKClient before instantiation, rejecting non-HTTP(S) schemes at the application layer
  • Implement allowlist-based URL validation for any attacker-influenced jku header values or configuration-derived URIs
  • Review application logic that derives jku URLs from untrusted sources; ensure filesystem write permissions do not overlap with paths used in jku resolution
  • Monitor for anomalous outbound requests from applications using PyJWKClient, particularly file:// and ftp:// scheme attempts
  • Conduct code review of JWT verification implementations to identify custom PyJWKClient instantiations with user-controlled URIs

Evidence notes

CVE published 2026-05-28T16:16:29.150Z; modified 2026-05-28T18:03:16.223Z. Advisory references GitHub Security Advisory GHSA-993g-76c3-p5m4. CWE-441 (Unintended Proxy or Intermediary) and CWE-918 (Server-Side Request Forgery) identified. Fix version 2.13.0 confirmed.

Official resources

2026-05-28