CVE-2026-48522
Full vulnerability record from the local CVENow database.
Description
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.
View original CVE JSON
{
"id": "CVE-2026-48522",
"sourceIdentifier": "[email protected]",
"published": "2026-05-28T16:16:29.150",
"lastModified": "2026-10-26T13:10:00.140",
"vulnStatus": "Modified",
"cveTags": [],
"descriptions": [
{
"lang": "en",
"value": "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."
},
{
"lang": "es",
"value": "PyJWT es una implementación de JSON Web Token en Python. Antes de la versión 2.13.0, PyJWKClient pasa su argumento uri directamente a urllib.request.urlopen(), que utiliza el OpenerDirector predeterminado de la biblioteca estándar de Python, registrando HTTPHandler, HTTPSHandler, FTPHandler, FileHandler y DataHandler. Actualmente no existe una opción documentada para restringir qué esquemas PyJWKClient recuperará. Si la ruta de ingesta de URL jku de una aplicación acepta URL influenciadas por el atacante (por ejemplo, desde el encabezado JWT, archivo de configuración, parámetro de flujo OAuth), el atacante puede hacer que PyJWKClient lea archivos locales arbitrarios a través de file: // (SSRF en el sistema de archivos local), hacer que PyJWKClient intente recuperaciones FTP / data-URI (superficie de SSRF más amplia), o falsificar tokens que PyJWT verifica como válidos. La biblioteca no devuelve directamente contenidos URI que no sean HTTP(S) al atacante; el escenario encadenado de ’plantar un JWKS para falsificar tokens’ descrito en el informe original requiere fallas adicionales en la capa de aplicación (acceso de escritura del atacante a una ruta del sistema de archivos, derivación jku no confiable) que esta corrección no aborda. Esta vulnerabilidad se corrige en la versión 2.13.0."
}
],
"affected": [
{
"source": "[email protected]",
"affectedData": [
{
"vendor": "jpadilla",
"product": "pyjwt",
"versions": [
{
"version": "< 2.13.0",
"status": "affected"
}
]
}
]
}
],
"metrics": {
"cvssMetricV31": [
{
"source": "[email protected]",
"type": "Secondary",
"cvssData": {
"version": "3.1",
"vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N",
"baseScore": 4.2,
"baseSeverity": "MEDIUM",
"attackVector": "NETWORK",
"attackComplexity": "HIGH",
"privilegesRequired": "NONE",
"userInteraction": "REQUIRED",
"scope": "UNCHANGED",
"confidentialityImpact": "LOW",
"integrityImpact": "LOW",
"availabilityImpact": "NONE"
},
"exploitabilityScore": 1.6,
"impactScore": 2.5
}
],
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"timestamp": "2026-06-02T15:47:07.542817Z",
"id": "CVE-2026-48522",
"options": [
{
"exploitation": "poc"
},
{
"automatable": "no"
},
{
"technicalImpact": "partial"
}
],
"role": "CISA Coordinator",
"version": "2.0.3"
}
}
]
},
"weaknesses": [
{
"source": "[email protected]",
"type": "Secondary",
"description": [
{
"lang": "en",
"value": "CWE-441"
},
{
"lang": "en",
"value": "CWE-918"
}
]
}
],
"configurations": [
{
"nodes": [
{
"operator": "OR",
"negate": false,
"cpeMatch": [
{
"vulnerable": true,
"criteria": "cpe:2.3:a:pyjwt_project:pyjwt:*:*:*:*:*:*:*:*",
"versionEndExcluding": "2.13.0",
"matchCriteriaId": "2692B308-E3F9-4586-AD28-F64C14358242"
}
]
}
]
}
],
"references": [
{
"url": "https://github.com/jpadilla/pyjwt/security/advisories/GHSA-993g-76c3-p5m4",
"source": "[email protected]",
"tags": [
"Exploit",
"Mitigation",
"Vendor Advisory"
]
},
{
"url": "https://github.com/jpadilla/pyjwt/security/advisories/GHSA-993g-76c3-p5m4",
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"tags": [
"Exploit",
"Mitigation",
"Vendor Advisory"
]
}
]
}