Hooki

Hook jwt: Wykrywanie weryfikacji JWT bez przypiętego algorytmu

Przeszukuj bazę kodu pod kątem weryfikacji JWT bez przypiętego algorytmu albo oceniaj pojedyncze wywołanie z wiersza poleceń.

Hook jwt zgłasza weryfikację JWT bez przypiętego algorytmu, czyli lukę typu algorithm confusion, w której weryfikator ufa nagłówkowi alg samego tokena, oraz całkowicie wyłączoną weryfikację. Rozpoznaje język i czyta każdy plik zgodnie z regułami jego biblioteki JWT. To deterministyczny silnik stojący za specjalizacją federation, który możesz uruchomić samodzielnie w trybie scan lub check.

Uruchamianie​

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

Każda linia w sekcji Unpinned JWT verification found to wywołanie weryfikujące, które nie ustawia listy dozwolonych algorithms (tam, gdzie biblioteka jej wymaga), akceptuje niebezpieczną listę (none albo algorytm asymetryczny zmieszany z HMAC) lub całkowicie wyłącza sprawdzanie podpisu, przez co ufa polu alg samego tokena. To potwierdzona ekspozycja, więc hook kończy działanie z niezerowym kodem wyjścia. Gdy nic nie znajdzie, wypisuje no unpinned JWT verification found.

Jak odczytać werdykt​

WerdyktZnaczenie
unpinnedWywołanie weryfikujące bez listy dozwolonych algorytmów (tam, gdzie jest potrzebna), z niebezpieczną listą albo z wyłączoną weryfikacją.
safeWywołanie weryfikujące, które przypina bezpieczną listę dozwolonych algorytmów lub którego biblioteka przypina ją niejawnie.
invalidFragment kodu nie zawiera rozpoznawalnego wywołania weryfikującego, które można by ocenić.

Opcje CLI​

OpcjaWartośćOpis
--patternfragment koduSprawdza jedno wywołanie. Powtórz, aby sprawdzić kilka, po jednym werdykcie w linii.
--langjęzykWymagana razem z --pattern: jeden z języków javascript, python, go, java, kotlin, php, ruby, rust, csharp.
--dirfolderOgranicza skanowanie do folderu. Można powtarzać i łączyć z --file.
--fileplikOgranicza skanowanie do jednego pliku. Można powtarzać i łączyć z --dir.

Bez żadnej opcji hook przeszukuje cały projekt. Opcja --pattern wymaga --lang i nie można jej łączyć z --dir ani --file.

Wybierz, co hook przeszukuje​

Hook pomija to, co ignoruje Git. Aby pominąć więcej albo przeszukać to, co ignoruje Git, nadaj hookowi jwt własne ustawienia:

npx lagune write add --ignore test/fixtures --checker jwt
{
"checkers": {
"jwt": { "gitignore": false, "ignore": ["test/fixtures"] }
}
}

Konfiguracja hooków opisuje każde ustawienie.

Obsługiwane języki​

Skanowanie czyta poniższe biblioteki, rozpoznając je po rozszerzeniu pliku. Ponieważ niektóre przypinają algorytm niejawnie (brak jawnej listy jest wtedy poprawny), reguła "brak listy dozwolonych ⇒ unpinned" obowiązuje tylko tam, gdzie biblioteka oczekuje jawnej listy, więc hook nigdy nie zgłasza poprawnie skonfigurowanego wywołania.

JęzykBibliotekaCzy brak listy dozwolonych to unpinned?Zawsze zgłasza
JavaScript / TypeScriptjsonwebtoken, joseTaknone, mieszankę algorytmu asymetrycznego i HMAC
PythonPyJWT, python-joseTak (PyJWT jej wymaga, python-jose domyślnie ustawia algorithms=None)none, verify_signature: False
Gogolang-jwtTak (brak WithValidMethods)none, ParseUnverified
Rubyruby-jwtTaknone, verify = false
Java / Kotlinjjwt, nimbusNie (algorytm wynika z klucza)none, parser bez podpisu lub unsecured
PHPfirebase/php-jwtNie (Key określa algorytm)none
RustjsonwebtokenNie (Validation wymaga algorytmu)none, insecure_disable_signature_validation
C#Microsoft.IdentityModelNie (parametry w wielu liniach)none, RequireSignedTokens = false
wskazówka

Hook rozstrzyga tylko o przypięciu algorytmu: sprawdzanie claimów, kluczy i przepływów wymaga oceny, którą nadal zapewnia specjalizacja federation.

Najczęściej zadawane pytania

Weryfikator, który odczytuje algorytm z nagłówka tokena, pozwala atakującemu zamienić RS256 na HS256 i podpisać token kluczem publicznym. Zapobiega temu przypięta w kodzie bezpieczna lista dozwolonych algorytmów, a hook jwt zgłasza wywołanie weryfikujące, które nie ustawia żadnej listy albo ustawia niebezpieczną.