
Prova de conceito demonstrando confusão de algoritmo JWT na biblioteca fast-jwt. Inclui servidor vulnerável, script de forjamento de token e correção de verificação para educação em segurança.
Este repositório demonstra a confusão de algoritmo JWT em fast-jwt quando a verificação do token não bloqueia algoritmos permitidos.
A partir da raiz do projeto, execute:
npm install
O aplicativo espera estes arquivos:
keys/private.pemkeys/public.pemExecute um dos seguintes conjuntos de comandos.
PowerShell (Windows):
New-Item -ItemType Directory -Path keys -Force | Out-Null
openssl genrsa -out keys/private.pem 2048
openssl rsa -in keys/private.pem -RSAPublicKey_out -out keys/public.pem
Linux/macOS/Git Bash:
mkdir -p keys
openssl genrsa -out keys/private.pem 2048
openssl rsa -in keys/private.pem -RSAPublicKey_out -out keys/public.pem
node server.js
Saída esperada:
Server running at http://localhost:3000
curl http://localhost:3000/generateToken
node sign.js
Copie o token impresso.
node checkAdmin.js <JWT_TOKEN>
Se o ataque for bem-sucedido, a resposta contém Welcome Admin!.
Em server.js, o verificador não restringe algoritmos:
const verifySync = createVerifier({
key: publicKey,
});
Sem uma lista de permissões de algoritmos, o servidor pode aceitar um token HS256 malicioso assinado usando a chave pública como segredo HMAC.
Nas demonstrações de CVE do grupo, o objeto vulnerável é a biblioteca (não pode ser executada de forma independente). Portanto, é necessário usar um aplicativo simulado para reproduzir como o sistema real chama a API dessa biblioteca. Neste repositório, o arquivo server.js é a camada do aplicativo simulado.
createSigner do fast-jwt com RS256 para gerar um token válido para um usuário comum (admin=false). O objetivo é criar um token baseline "normal" para comparação com o token forjado.createVerifier do fast-jwt para verificar o token e decidir os direitos de admin de acordo com payload.admin. O ponto intencionalmente vulnerável está no fato de que o verificador não bloqueia algoritmos, levando à confusão de algoritmo.Fluxo de código PoC complementar:
createSigner com HS256 e usa a chave pública como segredo para assinar um token forjado (admin=true).Resumindo, o grupo não reescreveu as funções da biblioteca. O grupo apenas usou a API original da biblioteca vulnerável (createSigner, createVerifier) dentro de um aplicativo simulado para recriar o contexto de exploração correto.
Restringir a verificação para RS256:
const verifySync = createVerifier({
key: publicKey,
algorithms: ["RS256"],
});
Este projeto é destinado apenas ao aprendizado de segurança em um ambiente de laboratório controlado.