Hooks

Hook jwt: JWT-Verifizierung ohne festgelegten Algorithmus erkennen

Durchsuche eine Codebasis nach JWT-Verifizierungen ohne festgelegten Algorithmus, oder bewerte einen einzelnen Aufruf, direkt über die Kommandozeile.

Der Hook jwt meldet JWT-Verifizierungen ohne festgelegten Algorithmus, also die Lücke der Algorithm Confusion, bei der ein Verifizierer dem Header alg des Tokens selbst vertraut, sowie vollständig abgeschaltete Verifizierungen. Er arbeitet sprachspezifisch und liest jede Datei anhand ihrer eigenen JWT-Bibliothek. Er ist die deterministische Engine hinter der Spezialisierung federation, und du kannst ihn selbst im Modus scan oder check ausführen.

Ausführen​

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

Jede Zeile unter Unpinned JWT verification found ist ein Verifizierungsaufruf, der keine Allowlist algorithms setzt (wo die Bibliothek eine braucht), eine unsichere akzeptiert (none oder einen asymmetrischen Algorithmus gemischt mit HMAC) oder die Signaturprüfung gleich ganz abschaltet und deshalb dem alg des Tokens selbst vertraut. Das ist eine bestätigte Gefährdung, deshalb endet der Hook mit einem Exit-Code ungleich null. Findet er nichts, gibt er no unpinned JWT verification found aus.

So liest du das Urteil​

UrteilBedeutung
unpinnedEin Verifizierungsaufruf ohne Allowlist für Algorithmen (wo eine nötig ist), mit einer unsicheren oder mit abgeschalteter Verifizierung.
safeEin Verifizierungsaufruf, der eine solide Allowlist für Algorithmen festlegt oder dessen Bibliothek sie implizit festlegt.
invalidDer Codeausschnitt enthält keinen erkennbaren Verifizierungsaufruf, den er beurteilen könnte.

CLI-Optionen​

OptionWertBeschreibung
--patternein CodeausschnittPrüft einen Aufruf. Wiederhole die Option, um mehrere zu prüfen, ein Urteil pro Zeile.
--langeine SpracheErforderlich bei --pattern: eine von javascript, python, go, java, kotlin, php, ruby, rust, csharp.
--direin VerzeichnisBeschränkt den Durchlauf auf ein Verzeichnis. Wiederholbar und mit --file kombinierbar.
--fileeine DateiBeschränkt den Durchlauf auf eine einzelne Datei. Wiederholbar und mit --dir kombinierbar.

Ohne Option durchsucht er das gesamte Projekt. --pattern erfordert --lang und lässt sich nicht mit --dir oder --file kombinieren.

Unterstützte Sprachen​

Der Durchlauf liest diese Bibliotheken, erkannt an der Dateiendung. Weil manche den Algorithmus implizit festlegen (eine fehlende explizite Liste ist dort korrekt), gilt die Regel "keine Allowlist ⇒ unpinned" nur dort, wo die Bibliothek eine explizite erwartet, sodass er einen korrekt konfigurierten Aufruf nie meldet.

SpracheBibliothekMeldet eine fehlende Allowlist als unpinned?Meldet immer
JavaScript / TypeScriptjsonwebtoken, joseJanone, Mischung aus asymmetrisch und HMAC
PythonPyJWT, python-joseJa (PyJWT verlangt sie, python-jose nutzt standardmäßig algorithms=None)none, verify_signature: False
Gogolang-jwtJa (ohne WithValidMethods)none, ParseUnverified
Rubyruby-jwtJanone, verify = false
Java / Kotlinjjwt, nimbusNein (aus dem Schlüssel abgeleitet)none, ein Parser ohne Signatur oder unsecured
PHPfirebase/php-jwtNein (Key trägt den Algorithmus)none
RustjsonwebtokenNein (Validation verlangt einen)none, insecure_disable_signature_validation
C#Microsoft.IdentityModelNein (mehrzeilige Parameter)none, RequireSignedTokens = false
tipp

Der Hook entscheidet nur über die Festlegung des Algorithmus: Die Prüfungen von Claims, Schlüsseln und Flows bleiben Ermessensfragen, die die Spezialisierung federation abdeckt.

Häufige Fragen

Ein Verifizierer, der den Algorithmus aus dem Header des Tokens liest, erlaubt einem Angreifer, RS256 gegen HS256 zu tauschen und mit dem öffentlichen Schlüssel zu signieren. Eine solide Allowlist für Algorithmen, die im Code festgelegt ist, verhindert das, und der Hook jwt meldet jeden Verifizierungsaufruf, der keine oder eine unsichere festlegt.