
Laboratório de prova de conceito em nível de biblioteca demonstrando a CVE-2026-29000 no pac4j-jwt, comparando versões vulneráveis e corrigidas com Docker para mostrar a aceitação e rejeição de JWTs forjados.
Este repositório contém um PoC em nível de biblioteca para a CVE-2026-29000 em pac4j-jwt.
Ele compara o comportamento vulnerável e corrigido com dois casos:
| Versão | Linha de base | Ataque | Resultado |
|---|
6.0.3 | ✅ | ✅ | Vulnerável |
6.0.4.1 | ✅ | ✅ | Vulnerável |
6.3.3 | ✅ | ❌ | Corrigida |
Este PoC demonstra a criação de perfil autenticado com subject e roles controlados pelo atacante nas versões vulneráveis, enquanto a versão corrigida rejeita o token forjado.
Este não é uma demonstração de aplicação web.
É um pequeno programa Java que chama JwtAuthenticator diretamente e compara múltiplas versões de pac4j-jwt dentro do Docker.
O objetivo é comprovar três coisas:
As versões testadas foram escolhidas deliberadamente:
Isso dá ao laboratório três pontos de referência úteis:
.
├── docker-compose.yml
├── Dockerfile
├── pom.xml
└── src/main/java/lab/Repro.java
docker-compose.yml
Define a matriz de testes para cada versão.
Dockerfile
Compila e executa o PoC dentro de um contêiner.
pom.xml
Define dependências e compila um fat JAR executável.
src/main/java/lab/Repro.java
O harness real do PoC.
O arquivo docker-compose.yml define três serviços:
v603 = testa pac4j-jwt 6.0.3v6041 = testa pac4j-jwt 6.0.4.1patched = testa pac4j-jwt 6.3.3Portanto, estes comandos significam "executar o PoC uma vez contra aquela versão específica":
docker compose run --rm v603
docker compose run --rm v6041
docker compose run --rm patched
--rm significa que o contêiner temporário é removido após a execução terminar.
docker compose build --no-cache
docker compose run --rm v603
docker compose run --rm v6041
docker compose run --rm patched
Para cada versão, o programa executa dois casos.
Ele gera um token legítimo e o valida por meio de JwtAuthenticator.
Resultado esperado:
Ele gera um token forjado com claims controladas pelo atacante e o valida por meio de JwtAuthenticator.
Resultado esperado:
Você deve ver algo assim:
[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:
Você deve ver algo assim:
[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:
Esta CVE afeta um caminho de autenticação em nível de biblioteca, não uma única aplicação com um modelo de roles universal.
A parte reutilizável é o formato do ataque:
JwtAuthenticatorO que não é universal entre aplicações reais:
Por causa disso, este repositório foca em comprovar que a biblioteca aceita claims forjadas controladas pelo atacante nas versões vulneráveis, em vez de fingir que existe um token universal que funcionaria automaticamente contra aplicações arbitrárias.
docker compose run --rm v603docker compose run --rm v6041docker compose run --rm patched


Este projeto demonstra três fatos centrais:
6.0.3 e 6.0.4.16.3.3Esta é a evidência central vulnerável-versus-corrigida para esta CVE neste repositório.
Nas versões vulneráveis, o token forjado não é meramente analisado — ele produz um perfil autenticado com subject e roles controlados pelo atacante.