Hooks

Hook jwt: detecta verificaciones de JWT sin algoritmo fijado

Analiza un proyecto en busca de verificaciones de JWT que no fijan el algoritmo, o evalúa una sola llamada, desde la línea de comandos.

El hook jwt señala las verificaciones de JWT que no fijan el algoritmo, el agujero de la confusión de algoritmos, en el que un verificador se fía de la cabecera alg del propio token, y las verificaciones desactivadas por completo. Tiene en cuenta el lenguaje: lee cada archivo según su propia biblioteca de JWT. Es el motor determinista en el que se apoya la especialización federation, y puedes ejecutarlo tú mismo en modo scan o check.

Cómo ejecutarlo​

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 línea bajo Unpinned JWT verification found es una llamada de verificación que no define ninguna lista de permitidos algorithms (cuando la biblioteca la necesita), que acepta una insegura (none, o un algoritmo asimétrico mezclado con HMAC) o que desactiva directamente la comprobación de la firma, de modo que se fía del alg del propio token. Es una exposición confirmada, así que el hook termina con un código de salida distinto de cero. Si no encuentra nada, muestra no unpinned JWT verification found.

Cómo interpretar el veredicto​

VeredictoSignificado
unpinnedUna llamada de verificación sin lista de algoritmos permitidos (cuando hace falta una), con una lista insegura o con la verificación desactivada.
safeUna llamada de verificación que fija una lista segura de algoritmos permitidos, o cuya biblioteca la fija implícitamente.
invalidEl fragmento de código no contiene ninguna llamada de verificación reconocible que evaluar.

Opciones de la CLI​

OpciónValorDescripción
--patternun fragmento de códigoComprueba una llamada. Repítela para comprobar varias, con un veredicto por línea.
--langun lenguajeObligatoria con --pattern: uno de javascript, python, go, java, kotlin, php, ruby, rust, csharp.
--dirun directorioLimita el análisis a un directorio. Se puede repetir y combinar con --file.
--fileun archivoLimita el análisis a un solo archivo. Se puede repetir y combinar con --dir.

Sin ninguna opción, analiza todo el proyecto. --pattern necesita --lang y no se puede combinar con --dir ni con --file.

Lenguajes compatibles​

El análisis lee estas bibliotecas, identificadas por la extensión del archivo. Como algunas fijan el algoritmo de forma implícita (no tener una lista explícita es correcto), la regla "sin lista de permitidos ⇒ unpinned" solo se aplica donde la biblioteca espera una lista explícita, así que nunca se señala una llamada bien configurada.

LenguajeBiblioteca¿Señala como unpinned la falta de lista?Siempre señala
JavaScript / TypeScriptjsonwebtoken, joseSínone, mezcla de asimétrico y HMAC
PythonPyJWT, python-joseSí (PyJWT la exige, python-jose usa algorithms=None por defecto)none, verify_signature: False
Gogolang-jwtSí (sin WithValidMethods)none, ParseUnverified
Rubyruby-jwtSínone, verify = false
Java / Kotlinjjwt, nimbusNo (se deriva de la clave)none, un parser sin firma o unsecured
PHPfirebase/php-jwtNo (Key incluye el algoritmo)none
RustjsonwebtokenNo (Validation exige uno)none, insecure_disable_signature_validation
C#Microsoft.IdentityModelNo (parámetros en varias líneas)none, RequireSignedTokens = false
consejo

El hook solo decide si el algoritmo está fijado: las comprobaciones de claims, de claves y de flujos son cuestiones de criterio que sigue cubriendo la especialización federation.

Preguntas frecuentes

Un verificador que lee el algoritmo de la cabecera del token permite que un atacante cambie RS256 por HS256 y firme con la clave pública. Fijar en el código una lista segura de algoritmos permitidos lo evita, y el hook jwt señala cualquier llamada de verificación que no fije ninguna o que fije una insegura.