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.
Security readout for executives and security teams
Plain-English summary
PyJWT before 2.13.0 can fetch JWKS URLs through PyJWKClient using unsafe URI schemes, not just HTTP(S). Business risk is mainly for applications that let untrusted input influence JWKS or jku URLs. Impact can include limited local file access behavior, broader SSRF exposure, and possible token forgery when additional application flaws are present.
Executive priority
Treat this as a targeted authentication-stack fix, not a broad emergency. Prioritize internet-facing services and identity flows that process third-party JWTs or dynamically resolve JWKS URLs. Upgrade promptly because authentication trust decisions are affected, even though exploitation appears conditional.
Technical view
PyJWKClient passed its uri directly to urllib.request.urlopen(), inheriting handlers for HTTP, HTTPS, FTP, file, and data schemes. Without a scheme allowlist, attacker-influenced JWKS URL selection can trigger non-HTTP(S) fetches. The reported token-forgery chain requires extra application-layer weaknesses beyond the library issue.
Likely exposure
Exposure is limited to Python applications using PyJWT PyJWKClient versions before 2.13.0 where JWKS or jku URL selection can be influenced by attackers through JWT headers, configuration, OAuth parameters, or similar flows.
Exploitation context
The source bundle does not report active exploitation, and KEV is false. Exploitation is not automatic: an attacker needs influence over the PyJWKClient URI, and stronger outcomes require separate application flaws such as untrusted jku derivation or attacker-controlled JWKS placement.
Researcher notes
The important boundary is application-controlled versus attacker-influenced URI selection. The library issue expands URI handling through urllib defaults; it does not directly return fetched non-HTTP(S) content to attackers. Token forgery depends on additional weaknesses not fixed solely by this advisory.
Mitigation direction
Upgrade PyJWT to version 2.13.0 or later.
Restrict JWKS and jku sources to trusted HTTPS URLs only.
Reject file, ftp, data, and other unexpected URI schemes in application logic.
Review OAuth and JWT configuration paths for attacker-controlled JWKS URL input.
Check the GitHub advisory for any vendor-specific guidance updates.
Validation and detection
Inventory Python services using PyJWT and PyJWKClient.
Confirm deployed PyJWT versions are 2.13.0 or later.
Review code paths deriving PyJWKClient URIs from JWT headers or request parameters.
Generated from the cited source records. This long-tail analysis has not been individually reviewed by a named human.
Potential ATT&CK relevance
Conservative CVE-to-ATT&CK context
These mappings and lookup hints may be relevant to the vulnerability behavior, CWE, affected product, or exposure path. Glexia-inferred context is not an official MITRE, ATT&CK, CWE, or CVE Program mapping.
ATT&CK lookup starting points
Use these exact CWE pages and searches to review the Glexia ATT&CK library from this CVE's weakness and description context.
cwe · low confidence lookup
CWE-441: Exact CWE lookup
Use the exact CWE identifier as the starting point before reviewing related ATT&CK behavior. Open the exact CWE lookup page first, then review the ATT&CK searches from that MITRE weakness context. This is a Glexia lookup hint, not an official ATT&CK mapping.
CWE-918: Information exposure and cloud metadata lookup
Information exposure and SSRF weaknesses can make discovery, cloud metadata, and credential material review relevant. Open the exact CWE lookup page first, then review the ATT&CK searches from that MITRE weakness context. This is a Glexia lookup hint, not an official ATT&CK mapping.
The CVE wording references authentication or credential exposure, so valid-account and credential-access review may help. This is a Glexia inferred lookup path, not an official MITRE, ATT&CK, or CVE Program mapping.
The CVE wording references SSRF or metadata access, so cloud discovery and credential material review may help. This is a Glexia inferred lookup path, not an official MITRE, ATT&CK, or CVE Program mapping.
These fields come from the CVE record and ADP containers, not from Glexia's Take. They preserve time-varying source decisions such as CISA SSVC, KEV status, CVSS metrics, and provider references.
We collect every scored CVSS vector available in the official CNA and ADP containers. When more than one version is present, the table keeps the source vectors side by side instead of collapsing them into the highest score.