JWE - зашифрованные JWT с пятью частями и двумя уровнями шифрования. Разбираем весь зоопарк атак: Invalid Curve на ECDH-ES, Bleichenbacher на RSA1_5, Padding Oracle на AES-CBC, PBES2 DoS одним запросом и forbidden attack на AES-GCM.
Разбираем математику за HMAC, RSA и ECDSA изнутри: почему Sony потеряла PlayStation 3 из-за одного повторяющегося числа, и как частичная утечка nonce позволяет восстановить приватный ключ.
Подпись из одних нулей проходит ECDSA-верификацию на Java 15-18. Для любого сообщения, с любым ключом. Пять строк Python - и ты admin.
JWT содержит все для офлайн-атаки: сообщение и подпись. Hashcat на GPU перебирает 150 миллионов HS256 в секунду. Секрет 'secret' подбирается за 2 секунды.
Заголовок JWT может содержать URL, и сервер пойдет по этому URL скачивать ключ для проверки подписи. Это не баг - это RFC 7515.
RFC не определяет структуру kid. Разработчики используют его как путь к файлу, SQL-параметр или аргумент команды. Каждый вариант - отдельный класс уязвимостей.
Берешь публичный ключ сервера из открытого доступа, подписываешь им токен - и сервер его принимает. Подпись есть, подпись корректна, но токен поддельный.
RFC требует поддержку алгоритма none в каждой JWT-библиотеке. Меняем одно поле в заголовке - и сервер пропускает проверку подписи.
Берем реальный токен и разбираем как патологоанатом: header, payload, signature, Base64url, claims, edge cases.
70+ CVE за десять лет. Один баг из 2015 года до сих пор стреляет в 2026-м. Разбираемся, почему JWT упорно остается дырявым.