
Prueba de concepto en Python que demuestra una omisión de autenticación en pac4j JWT mediante la creación de un token JWE con un JWT interno sin firmar, lo que permite la escalada de privilegios sin una clave privada.
Prueba de concepto en Python para CVE‑2026‑29000, un bypass de autenticación crítico que afecta a aplicaciones que utilizan el módulo JWT de pac4j.
La vulnerabilidad permite a los atacantes autenticarse como usuarios arbitrarios enviando un token JWE malicioso que contiene un PlainJWT sin firmar (alg: none).
Las aplicaciones pac4j pueden utilizar el siguiente flujo de tokens:
/api/auth/loginDebido al manejo incorrecto de la lógica de análisis del JWT, cuando el token interno es un PlainJWT (token sin firmar):
toSignedJWT() devuelve nullEsto permite a un atacante:
Un atacante puede:
No se requiere clave privada — solo la clave pública expuesta a través de JWKS.
Este repositorio proporciona un PoC en Python que:
Python 3.x
Instalar dependencias:
pip install jwcrypto requests
python3 poc.py \
--jwks http://target:8080/api/auth/jwks \
--user admin \
--role ROLE_ADMIN
Ejemplo de salida:
=== Malicious JWE Token ===
eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIiwiY3R5IjoiSldUIn0...
Úsalo como:
Authorization: Bearer <TOKEN>
Este repositorio se proporciona solo con fines educativos y de investigación. No utilices este código contra sistemas sin la autorización adecuada.
Ali Hussainzada Investigador de Seguridad de Aplicaciones | Bug Hunter