
Biblioteca de laboratorio de prueba de concepto que demuestra la CVE-2026-29000 en pac4j-jwt, comparando versiones vulnerables y parcheadas con Docker para mostrar la aceptación y el rechazo de JWT falsificados.
Este repositorio contiene un PoC a nivel de librería para CVE-2026-29000 en pac4j-jwt.
Compara el comportamiento vulnerable y el corregido con dos casos:
| Versión | Caso base | Ataque | Resultado |
|---|
6.0.3 | ✅ | ✅ | Vulnerable |
6.0.4.1 | ✅ | ✅ | Vulnerable |
6.3.3 | ✅ | ❌ | Corregida |
Este PoC demuestra la creación de perfiles autenticados con subject y roles controlados por el atacante en versiones vulnerables, mientras que la versión corregida rechaza el token falsificado.
Esto no es una demo de aplicación web.
Es un pequeño programa Java que llama a JwtAuthenticator directamente y compara múltiples versiones de pac4j-jwt dentro de Docker.
El objetivo es demostrar tres cosas:
Las versiones probadas fueron elegidas deliberadamente:
Esto le da al laboratorio tres puntos de referencia útiles:
.
├── docker-compose.yml
├── Dockerfile
├── pom.xml
└── src/main/java/lab/Repro.java
docker-compose.yml
Define la matriz de pruebas para cada versión.
Dockerfile
Compila y ejecuta el PoC dentro de un contenedor.
pom.xml
Define las dependencias y compila un fat JAR ejecutable.
src/main/java/lab/Repro.java
El harness real del PoC.
El archivo docker-compose.yml define tres servicios:
v603 = probar pac4j-jwt 6.0.3v6041 = probar pac4j-jwt 6.0.4.1patched = probar pac4j-jwt 6.3.3Entonces estos comandos significan "ejecutar el PoC una vez contra esa versión específica":
docker compose run --rm v603
docker compose run --rm v6041
docker compose run --rm patched
--rm significa que el contenedor temporal se elimina después de que finaliza la ejecución.
docker compose build --no-cache
docker compose run --rm v603
docker compose run --rm v6041
docker compose run --rm patched
Para cada versión, el programa ejecuta dos casos.
Genera un token legítimo y lo valida a través de JwtAuthenticator.
Resultado esperado:
Genera un token falsificado con claims controladas por el atacante y lo valida a través de JwtAuthenticator.
Resultado esperado:
Deberías ver algo como esto:
[case] baseline
result: ACCEPTED
observed_subject: alice
observed_roles: [ROLE_USER]
[case] attack
result: ACCEPTED
observed_subject: admin#override
observed_roles: [ROLE_SUPERUSER, ROLE_ADMIN]
[summary]
conclusion: VULNERABLE: forged token accepted
Significado:
Deberías ver algo como esto:
[case] baseline
result: ACCEPTED
observed_subject: alice
observed_roles: [ROLE_USER]
[case] attack
result: REJECTED
reason: CredentialsException: A non-signed JWT cannot be accepted as signature configurations have been defined
[summary]
conclusion: PATCHED: forged token rejected
Significado:
Este CVE afecta una ruta de autenticación a nivel de librería, no una única aplicación con un modelo de roles universal.
La parte reutilizable es la forma del ataque:
JwtAuthenticatorLo que no es universal en aplicaciones reales:
Debido a eso, este repositorio se centra en demostrar que la librería acepta claims falsificadas controladas por el atacante en versiones vulnerables, en lugar de pretender que existe un token universal que funcionaría automáticamente contra aplicaciones arbitrarias.
docker compose run --rm v603docker compose run --rm v6041docker compose run --rm patched


Este proyecto demuestra tres hechos fundamentales:
6.0.3 y 6.0.4.16.3.3Esta es la evidencia central vulnerable-versus-corregida para este CVE en este repositorio.
En versiones vulnerables, el token falsificado no solo se analiza — produce un perfil autenticado con subject y roles controlados por el atacante.