
Scanner offline para CVE-2026-29000 (CVSS 10.0) em org.pac4j:pac4j-jwt. Inspeciona jars/fat-jars diretamente, por isso funciona onde mvn dependency:tree não consegue. Jar único, zero dependências, Java 8+.
Verificação offline da CVE-2026-29000 (CVSS 10.0) — incluindo os pacotes que o advisory oficial não lista.
English | 中文
Um único jar, cerca de 24KB, zero dependências em tempo de execução, disponível a partir do Java 8, totalmente offline, não envia nenhum dado para fora.
O JwtAuthenticator do org.pac4j:pac4j-jwt não força a validação de assinatura ao processar JWT criptografados (JWE).
Basta que o atacante obtenha a chave pública RSA do servidor (a chave pública é pública por natureza),
para construir um PlainJWT encapsulado em JWE, escrever valores arbitrários em subject e role,
e autenticar-se como qualquer usuário, incluindo administrador. Sem precisar de nenhuma credencial.
| Item | Valor |
|---|---|
| CVE | CVE-2026-29000 |
| GitHub advisory | GHSA-pm7g-w2cf-q238 |
| CVSS | 10.0 (nota máxima) |
| Data de publicação | 2026-03-05 |
O pac4j é amplamente integrado com Spring Security, Apereo CAS, JEE, Vert.x, Play, Dropwizard, entre outros.
A v0.1.0 afirmava que "a base oficial de vulnerabilidades lista apenas 1 pacote, quando na verdade são 5", e por isso reportava como vulneráveis
pac4j-oidc / javalin-pac4j / lagom-pac4j / ratpack-pac4j.
Isso era falso positivo. O advisory oficial listar apenas pac4j-jwt está correto.
Base da revisão (duas evidências independentes, ambas reproduzíveis por conta própria):
| Artefato | Sua dependência de pac4j-jwt | É repassada ao consumidor |
|---|---|---|
pac4j-oidc | escopo test (verificado versão a versão em 3.0.0 / 4.0.0 / 4.5.0 / 5.0.0 / 5.7.0 / 6.0.0 / 6.3.0) | ❌ |
javalin-pac4j | escopo test | ❌ |
lagom-pac4j-parent | escopo provided | ❌ |
ratpack-pac4j:1.4.6 | todo o bloco de dependência está envolvido por um comentário XML, simplesmente não existe | ❌ |
test / provided não são repassadas para downstream,
o pac4j-jwt não aparece no runtime classpath do consumidor.pac4j-oidc-6.0.0.jar tem 78 entradas, todas sob org/pac4j/oidc/,
sem nenhuma classe pac4j-jwt embutida via shade. Nem é propagado, nem é carregado.Onde estava o erro: a v0.1.0 analisou cada pom individualmente, mas olhou apenas "quem escreveu a coordenada pac4j-jwt",
sem olhar o scope — tratando "está escrito no pom" como "o consumidor vai receber".
Se você atualizou o pac4j por causa do relatório da v0.1.0, essa atualização não era necessária (a atualização em si é inofensiva). Só é preciso agir quando existir de fato um
pac4j-jwtde versão afetada na sua aplicação.
Para determinar se uma máquina específica tem ou não o pac4j-jwt afetado, o mvn dependency:tree falha em dois casos —
na máquina de produção só existe um fat-jar já empacotado (sem código-fonte e sem pom); ou ele foi embutido via shade dentro de algum SDK,
e nem aparece na árvore de dependências. Esta ferramenta escaneia diretamente o artefato em si, sem depender do ambiente de build.
| Artefato | Número de versões afetadas | Advisory oficial |
|---|---|---|
org.pac4j:pac4j-jwt | 114 | ✅ o único listado, e isso está correto |
java -jar pac4j-check.jar ./myapp.jar # escaneia um jar/war
java -jar pac4j-check.jar /opt/apps # escaneia um diretório (recursivo)
java -jar pac4j-check.jar /opt/apps --json # saída JSON, para encadear em pipes
java -jar pac4j-check.jar ./app.jar --gbk # use quando o console do Windows exibir caracteres chineses corrompidos
Códigos de saída: 0 = não encontrado afetado · 1 = em dúvida/não determinável · 2 = encontrado afetado. Pode ser plugado diretamente no CI.
[CRITICAL] pac4j-jwt 5.4.3
位置 :demo-app.jar!/BOOT-INF/lib/pac4j-jwt-5.4.3.jar
版本来源:pom.properties(可靠)
部署形态:Spring Boot fat-JAR
结论 :命中 CVE-2026-29000 —— JWE 处理路径未强制校验签名,
拿到服务器 RSA 公钥即可伪造任意身份(含管理员)登录
处置 :升级 pac4j-jwt 至 5.7.9
A v0.1.0 ainda reportaria aqui uma linha extra
[CRITICAL] pac4j-oidc— isso era falso positivo, removido na v0.2.0, o motivo está na correção no início do documento.
mvn dependency:tree não encontraO veredito segue sempre o advisory oficial GHSA-pm7g-w2cf-q238:
pac4j-jwt < 4.5.9 -> 升 4.5.9
pac4j-jwt >= 5.0.0-RC1 且 < 5.7.9 -> 升 5.7.9
pac4j-jwt >= 6.0.4.1 且 < 6.3.3 -> 升 6.3.3
Autoverificação: esta ferramenta roda o veredito sobre todas as 147 versões do pac4j-jwt no Maven Central,
o número de acertos é 114, coincidindo exatamente com a soma das versões dos três intervalos do advisory oficial (13+33+68).
Essa asserção está escrita nos testes (OfficialRangeCrossCheckTest), e o build falha se não bater.
⚠️ Mas é preciso ter clareza sobre o que isso valida: valida que o algoritmo de intervalo de versões está correto, não valida "quais artefatos devem entrar na tabela de veredito" — o falso positivo da v0.1.0 ocorreu justamente neste último ponto, e na época essa autoverificação estava verde. O escopo em que a verificação passa ≠ o escopo em que a conclusão é válida.
Cobre apenas o groupId org.pac4j.
Há pesquisas de terceiros afirmando que os artefatos afetados somam 19, com 1.020 versões, mas a lista completa não foi divulgada.
O que esta ferramenta reconstrói de forma independente é a parte dentro do escopo org.pac4j, sem alegar cobertura total.
Outros groupIds (como org.apereo.cas do Apereo CAS) não foram incluídos.
pac4j-jwt 6.0.0 ~ 6.0.4 é marcado como "em dúvida" e não como "afetado".
O oficial afirma que a linha 6.x é afetada a partir de 6.0.4.1; já a pesquisa de terceiros afirma que a vulnerabilidade foi introduzida já em 1.9.2 —
se isso for verdade, essas 5 versões também deveriam contar. Não verificamos de forma independente a conclusão de terceiros,
por isso marcamos separadamente e recomendamos atualização conservadora, em vez de classificar diretamente como crítico.
Por que ser tão conservador: uma regra de veredito errada não é um "falso positivo", é fazer o usuário agir errado. Preferimos marcar como em dúvida a fixar como conclusão um escopo não verificado.
mvn package # 产物:target/pac4j-check.jar
mvn test # 31 个测试
Se encontrar erro de veredito, omissão ou falso positivo, abra uma Issue. Se você puder fornecer coordenadas reproduzíveis do artefato (groupId:artifactId:version), a correção será muito mais rápida.
Apache License 2.0
Offline scanner for CVE-2026-29000 (CVSS 10.0) — including the packages the official advisory does not list.
Single jar, ~24KB, zero runtime dependencies, Java 8+, fully offline, sends nothing anywhere.