Hooks

Hook jwt : détecter une vérification JWT sans algorithme épinglé

Analysez une base de code à la recherche de vérifications JWT sans algorithme épinglé, ou évaluez un seul appel, en ligne de commande.

Le hook jwt signale les vérifications JWT sans algorithme épinglé, la faille de confusion d'algorithme où le vérificateur fait confiance à l'en-tête alg du jeton lui-même, ainsi que la vérification entièrement désactivée. Il est adapté au langage et lit chaque fichier selon sa propre bibliothèque JWT. C'est le moteur déterministe derrière la spécialisation federation, que vous pouvez exécuter vous-même en mode scan ou check.

Exécution​

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

Chaque ligne sous Unpinned JWT verification found est un appel de vérification qui ne fixe aucune liste algorithms autorisée (là où la bibliothèque en exige une), qui en accepte une non sûre (none, ou un algorithme asymétrique mélangé à HMAC), ou qui désactive purement et simplement la vérification de signature, et fait donc confiance au alg du jeton lui-même. C'est une exposition confirmée, donc le hook se termine avec un code non nul. Une analyse propre affiche no unpinned JWT verification found.

Lire le verdict​

VerdictSignification
unpinnedUn appel de vérification sans liste d'algorithmes autorisés (là où il en faut une), avec une liste non sûre, ou avec la vérification désactivée.
safeUn appel de vérification qui épingle une liste d'algorithmes saine, ou dont la bibliothèque l'épingle implicitement.
invalidL'extrait ne contient aucun appel de vérification reconnaissable à juger.

Options de la CLI​

OptionValeurDescription
--patternun extrait de codeVérifie un appel. Répétez-la pour en vérifier plusieurs, un verdict par ligne.
--langun langageRequise avec --pattern : javascript, python, go, java, kotlin, php, ruby, rust ou csharp.
--dirun répertoireLimite l'analyse à un répertoire. Peut être répétée et combinée avec --file.
--fileun fichierLimite l'analyse à un seul fichier. Peut être répétée et combinée avec --dir.

Sans option, il analyse tout le projet. --pattern exige --lang et ne peut pas être combinée avec --dir ou --file.

Langages pris en charge​

L'analyse lit ces bibliothèques, selon l'extension du fichier. Comme certaines épinglent l'algorithme implicitement (l'absence de liste explicite est alors saine), la règle "pas de liste ⇒ unpinned" ne s'applique que là où la bibliothèque attend une liste explicite, donc un appel correctement configuré n'est jamais signalé.

LangageBibliothèqueSignale l'absence de liste comme unpinned ?Signale toujours
JavaScript / TypeScriptjsonwebtoken, joseOuinone, mélange asymétrique+HMAC
PythonPyJWT, python-joseOui (PyJWT l'exige, python-jose a algorithms=None par défaut)none, verify_signature: False
Gogolang-jwtOui (pas de WithValidMethods)none, ParseUnverified
Rubyruby-jwtOuinone, verify = false
Java / Kotlinjjwt, nimbusNon (déduit de la clé)none, un parseur non signé ou unsecured
PHPfirebase/php-jwtNon (Key porte l'algorithme)none
RustjsonwebtokenNon (Validation en exige une)none, insecure_disable_signature_validation
C#Microsoft.IdentityModelNon (paramètres sur plusieurs lignes)none, RequireSignedTokens = false
astuce

Le hook ne tranche que l'épinglage de l'algorithme : les vérifications des claims, des clés et du flux relèvent du jugement que couvre toujours la spécialisation federation.

Questions fréquentes

Un vérificateur qui lit l'algorithme dans l'en-tête du jeton permet à un attaquant de remplacer RS256 par HS256 et de signer avec la clé publique. Épingler dans le code une liste d'algorithmes saine l'empêche, et le hook jwt signale un appel de vérification qui n'en fixe aucune ou en fixe une non sûre.