Hooks

Hook jwt: detecte verificação de JWT sem algoritmo fixado

Varra um código em busca de verificações de JWT sem algoritmo fixado, ou avalie uma única chamada, direto da linha de comando.

O hook jwt sinaliza verificações de JWT sem algoritmo fixado, a brecha de algorithm confusion em que o verificador confia no próprio cabeçalho alg do token, e verificações desativadas por completo. Ele reconhece a linguagem e lê cada arquivo pela biblioteca de JWT dela, e é o engine determinístico por trás da especialização federation, que você mesmo pode executar no modo scan ou check.

Como executar​

npx lagune read jwt # scans the whole project
npx lagune read jwt --dir src # scans a directory
npx lagune read jwt --file auth.ts # scans a single file

Cada linha em Unpinned JWT verification found é uma chamada de verificação que não define uma allowlist de algorithms (quando a biblioteca precisa de uma), aceita uma insegura (none, ou um algoritmo assimétrico misturado com HMAC) ou desativa de vez a checagem da assinatura, e por isso confia no próprio alg do token. É uma exposição confirmada, então o hook termina com código de saída diferente de zero. Uma execução sem achados imprime no unpinned JWT verification found.

Como ler o veredito​

VereditoSignificado
unpinnedUma chamada de verificação sem allowlist de algoritmos (quando é necessária), com uma allowlist insegura ou com a verificação desativada.
safeUma chamada de verificação que fixa uma allowlist de algoritmos sólida, ou cuja biblioteca a fixa implicitamente.
invalidO trecho não contém nenhuma chamada de verificação reconhecível para julgar.

Opções da CLI​

OpçãoValorDescrição
--patternum trecho de códigoVerifica uma chamada. Repita para verificar várias, com um veredito por linha.
--languma linguagemObrigatória com --pattern: javascript, python, go, java, kotlin, php, ruby, rust ou csharp.
--dirum diretórioLimita a varredura a um diretório. Pode ser repetida e combinada com --file.
--fileum arquivoLimita a varredura a um único arquivo. Pode ser repetida e combinada com --dir.

Sem nenhuma opção, ele varre o projeto inteiro. --pattern exige --lang e não pode ser combinado com --dir nem com --file.

Linguagens suportadas​

A varredura lê estas bibliotecas, identificadas pela extensão do arquivo. Como algumas fixam o algoritmo implicitamente (a falta de uma lista explícita é segura), a regra "sem allowlist ⇒ unpinned" só vale onde a biblioteca espera uma lista explícita, então uma chamada configurada corretamente nunca é sinalizada.

LinguagemBibliotecaSinaliza a falta de allowlist como unpinned?Sempre sinaliza
JavaScript / TypeScriptjsonwebtoken, joseSimnone, mistura de assimétrico com HMAC
PythonPyJWT, python-joseSim (o PyJWT exige, o python-jose usa algorithms=None por padrão)none, verify_signature: False
Gogolang-jwtSim (sem WithValidMethods)none, ParseUnverified
Rubyruby-jwtSimnone, verify = false
Java / Kotlinjjwt, nimbusNão (derivado da chave)none, um parser sem assinatura ou unsecured
PHPfirebase/php-jwtNão (a Key carrega o alg)none
RustjsonwebtokenNão (a Validation exige um)none, insecure_disable_signature_validation
C#Microsoft.IdentityModelNão (parâmetros em várias linhas)none, RequireSignedTokens = false
dica

O hook decide apenas a fixação do algoritmo: as verificações de claims, de chaves e do fluxo são julgamentos que a especialização federation continua cobrindo.

Perguntas frequentes

Um verificador que lê o algoritmo do cabeçalho do token permite que um atacante troque RS256 por HS256 e assine com a chave pública. Fixar no código uma allowlist de algoritmos sólida impede isso, e o hook jwt sinaliza uma chamada de verificação que define none ou uma allowlist insegura.