Хуки

Хук jwt: виявлення перевірки JWT без закріпленого алгоритму

Перевірте кодову базу на перевірку JWT без закріпленого алгоритму або оцініть окремий виклик просто з командного рядка.

Хук jwt позначає перевірку JWT без закріпленого алгоритму, тобто діру плутанини алгоритмів, коли верифікатор довіряє заголовку alg самого токена, а також повністю вимкнену перевірку. Він враховує мову й читає кожен файл з огляду на його бібліотеку JWT. Це детермінований рушій спеціалізації federation, який ви можете запускати самі в режимі scan або check.

Запуск​

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

Кожен рядок під Unpinned JWT verification found є викликом перевірки, який не задає allowlist algorithms (там, де бібліотека його потребує), приймає небезпечний (none або асиметричний алгоритм, змішаний з HMAC) чи взагалі вимикає перевірку підпису, тож довіряє alg самого токена. Це підтверджена вразливість, тому хук завершується з ненульовим кодом. Чистий запуск виводить no unpinned JWT verification found.

Як читати вердикт​

ВердиктЗначення
unpinnedВиклик перевірки без allowlist алгоритмів (там, де він потрібен), з небезпечним allowlist або з вимкненою перевіркою.
safeВиклик перевірки, що закріплює надійний allowlist алгоритмів або чия бібліотека закріплює його неявно.
invalidФрагмент не містить розпізнаваного виклику перевірки, який можна оцінити.

Параметри CLI​

ПараметрЗначенняОпис
--patternфрагмент кодуПеревірити один виклик. Повторіть, щоб перевірити кілька, по вердикту на рядок.
--langмоваОбов'язковий із --pattern: одна з javascript, python, go, java, kotlin, php, ruby, rust, csharp.
--dirкаталогОбмежити перевірку каталогом. Повторюється й поєднується з --file.
--fileфайлОбмежити перевірку одним файлом. Повторюється й поєднується з --dir.

Без параметрів хук перевіряє весь проєкт. --pattern потребує --lang і не поєднується з --dir чи --file.

Підтримувані мови​

Перевірка читає ці бібліотеки, визначаючи їх за розширенням файлу. Оскільки деякі з них закріплюють алгоритм неявно (відсутність явного списку там цілком надійна), правило "немає allowlist ⇒ unpinned" діє лише там, де бібліотека очікує явний список, тож правильно налаштований виклик ніколи не позначається.

МоваБібліотекаЧи позначає відсутність allowlist як unpinned?Позначає завжди
JavaScript / TypeScriptjsonwebtoken, joseТакnone, змішування асиметричного алгоритму з HMAC
PythonPyJWT, python-joseТак (PyJWT його вимагає, у python-jose за замовчуванням algorithms=None)none, verify_signature: False
Gogolang-jwtТак (без WithValidMethods)none, ParseUnverified
Rubyruby-jwtТакnone, verify = false
Java / Kotlinjjwt, nimbusНі (виводиться з ключа)none, непідписаний чи unsecured парсер
PHPfirebase/php-jwtНі (Key містить алгоритм)none
RustjsonwebtokenНі (Validation його вимагає)none, insecure_disable_signature_validation
C#Microsoft.IdentityModelНі (багаторядкові параметри)none, RequireSignedTokens = false
порада

Хук вирішує лише щодо закріплення алгоритму: перевірки claims, ключів і потоку і далі охоплює спеціалізація federation, бо це питання судження.

Часті запитання

Верифікатор, що читає алгоритм із заголовка токена, дає зловмиснику змогу замінити RS256 на HS256 і підписати токен публічним ключем. Закріплення надійного allowlist алгоритмів у коді запобігає цьому, а хук jwt позначає виклик перевірки, який не задає жодного allowlist або задає небезпечний.