# 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ń.

Adres kanoniczny: https://lagune.ai/pl-PL/docs/hooks/jwt
Język: pl-PL
Oryginał: https://lagune.ai/docs/hooks/jwt
Ostatnia aktualizacja: 2026-11-09

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`](https://lagune.ai/pl-PL/docs/catalog), który możesz uruchomić samodzielnie w trybie **scan** lub **check**.

## Uruchamianie

**Przeszukaj bazę kodu**

```bash
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
```

**Sprawdź wywołanie**

```bash
npx lagune read jwt --lang javascript --pattern 'jwt.verify(token, secret)'                         # => unpinned
npx lagune read jwt --lang python --pattern 'jwt.decode(t, k, options={"verify_signature": False})' # => unpinned
npx lagune read jwt --lang python --pattern 'jwt.decode(t, k, algorithms=["HS256"])'                # => safe
```

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

| Werdykt    | Znaczenie                                                                                                                                |
| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `unpinned` | Wywołanie weryfikujące bez listy dozwolonych algorytmów (tam, gdzie jest potrzebna), z niebezpieczną listą albo z wyłączoną weryfikacją. |
| `safe`     | Wywołanie weryfikujące, które przypina bezpieczną listę dozwolonych algorytmów lub którego biblioteka przypina ją niejawnie.             |
| `invalid`  | Fragment kodu nie zawiera rozpoznawalnego wywołania weryfikującego, które można by ocenić.                                               |

### Opcje CLI

| Opcja       | Wartość       | Opis                                                                                                         |
| ----------- | ------------- | ------------------------------------------------------------------------------------------------------------ |
| `--pattern` | fragment kodu | Sprawdza jedno wywołanie. Powtórz, aby sprawdzić kilka, po jednym werdykcie w linii.                         |
| `--lang`    | język         | Wymagana razem z `--pattern`: jeden z języków javascript, python, go, java, kotlin, php, ruby, rust, csharp. |
| `--dir`     | folder        | Ogranicza skanowanie do folderu. Można powtarzać i łączyć z `--file`.                                        |
| `--file`    | plik          | Ogranicza 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:

```bash
npx lagune write add --ignore test/fixtures --checker jwt
```

```json
{
  "checkers": {
    "jwt": { "gitignore": false, "ignore": ["test/fixtures"] }
  }
}
```

[Konfiguracja hooków](https://lagune.ai/pl-PL/docs/hooks/configure) 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ęzyk                       | Biblioteka              | Czy brak listy dozwolonych to unpinned?                                 | Zawsze zgłasza                                    |
| --------------------------- | ----------------------- | ----------------------------------------------------------------------- | ------------------------------------------------- |
| **JavaScript / TypeScript** | jsonwebtoken, jose      | Tak                                                                     | `none`, mieszankę algorytmu asymetrycznego i HMAC |
| **Python**                  | PyJWT, python-jose      | Tak (PyJWT jej wymaga, python-jose domyślnie ustawia `algorithms=None`) | `none`, `verify_signature: False`                 |
| **Go**                      | golang-jwt              | Tak (brak `WithValidMethods`)                                           | `none`, `ParseUnverified`                         |
| **Ruby**                    | ruby-jwt                | Tak                                                                     | `none`, `verify = false`                          |
| **Java / Kotlin**           | jjwt, nimbus            | Nie (algorytm wynika z klucza)                                          | `none`, parser bez podpisu lub `unsecured`        |
| **PHP**                     | firebase/php-jwt        | Nie (`Key` określa algorytm)                                            | `none`                                            |
| **Rust**                    | jsonwebtoken            | Nie (`Validation` wymaga algorytmu)                                     | `none`, `insecure_disable_signature_validation`   |
| **C#**                      | Microsoft.IdentityModel | Nie (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`](https://lagune.ai/pl-PL/docs/catalog).

## Najczęściej zadawane pytania

### Czym jest algorithm confusion w JWT?

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ą.
