Cryptology Academy · Урок

Уязвимости JWT: alg=none и путаница ключей

Найдите и исправьте самые распространённые ошибки безопасности JWT

Урок 3 из 413 шагов

«Уязвимости JWT: alg=none и путаница ключей» — бесплатный урок Cryptology Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cryptology Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cryptology Academy содержит 4 уроков всего.

Поверхность атаки JWT

JWT подписываются криптографически, но во многих библиотеках обнаруживались серьёзные уязвимости. Наиболее часто эксплуатируются атака alg=none, атака со смешением RS256→HS256 и перебор слабых секретов. Все они возникают из-за доверия к полям заголовка, контролируемым злоумышленником.

Атака alg=none

Спецификация JWT допускает alg:"none" для незащищённых токенов. Уязвимые библиотеки принимали такие токены и полностью пропускали проверку подписи. Злоумышленник изменяет полезную нагрузку (например, "role":"admin"), устанавливает alg:"none", удаляет подпись — и сервер принимает токен.

Пример эксплуатации alg=none

Исходный токен: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIn0.SIG Атака: eyJhbGciOiJub25lIn0.eyJzdWIiOiJhZG1pbiJ9. (пустая подпись, точка в конце). Уязвимый сервер успешно выполняет проверку и предоставляет доступ администратора.

Исправление для alg=none

Никогда не принимайте alg:"none" в рабочей среде. Явно задавайте список разрешённых алгоритмов: jwt.decode(token, key, algorithms=["HS256"]). Большинство современных библиотек (PyJWT 2+, jsonwebtoken 9+) по умолчанию отклоняют alg=none.

Смешение ключей RS256 → HS256

Если сервер использует RS256, а клиент меняет alg на HS256, сервер может выполнить проверку, используя открытый ключ RSA как секрет HMAC. Поскольку открытый ключ... открыт, злоумышленник подписывает им произвольные полезные нагрузки, и сервер принимает их.

Эксплуатация смешения ключей

Шаги: 1) Получите открытый ключ из конечной точки JWKS. 2) Создайте вредоносную полезную нагрузку. 3) Подпишите её с помощью HMAC-SHA256, используя необработанные байты открытого ключа PEM как секрет HMAC. 4) Установите alg:"HS256" в заголовке. 5) Сервер успешно выполняет проверку по пути HS256.

Исправление смешения ключей

Всегда явно указывайте ожидаемый алгоритм в вызове проверки. Никогда не определяйте алгоритм на основе заголовка токена. Используйте отдельные пути выполнения для RS256 и HS256, которые вызывающая сторона не может переключить.

Перебор слабого секрета

Секреты HS256 со слабой энтропией (менее 256 бит) можно подобрать офлайн. Инструменты вроде hashcat поддерживают взлом JWT: hashcat -a 0 -m 16500 token.txt wordlist.txt. Используйте криптографически случайные секреты длиной не менее 32 байт.

Инъекция в заголовок через kid

Заголовок kid (ID ключа) выбирает ключ, который нужно использовать. Если сервер использует kid как параметр SQL-запроса или путь к файловой системе без очистки: kid="../../dev/null" → HMAC с пустым ключом → подделанный токен принимается. Всегда очищайте kid.

Инъекция в заголовок jwk

Заголовок jwk содержит открытый ключ для проверки. Уязвимый сервер может напрямую использовать встроенный ключ, позволяя злоумышленнику предоставить собственную пару ключей, подписать токен закрытым ключом и встроить открытый ключ. Выполняйте проверку только по зарегистрированным ключам.

Обход проверки истёкшего токена

Некоторые реализации забывали проверять утверждение exp или непоследовательно использовали время сервера. Всегда явно проверяйте exp, nbf и iat. Используйте библиотеку, которая проверяет их по умолчанию, и никогда не отключайте проверку утверждений в рабочей среде.

Быстрая проверка

В атаке со смешением ключей RS256→HS256 что злоумышленник использует в качестве секрета HMAC?

Итоги

Уязвимости JWT возникают из-за доверия к заголовку alg, принятия alg=none и слабых секретов. Исправление: фиксируйте алгоритмы на стороне проверяющей системы, используйте надёжные секреты и очищайте kid. Далее: безопасные методы реализации JWT.

Можно начать бесплатно

Изучай Cryptology Academy с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
67
Уроки
261

Часто задаваемые вопросы

Урок «Уязвимости JWT: alg=none и путаница ключей» бесплатный?

Да — полный текст урока «Уязвимости JWT: alg=none и путаница ключей» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cryptology Academy, подпишись на CoddyKit PRO. Курс Cryptology Academy содержит 4 уроков всего.

Чему я научусь в уроке «Уязвимости JWT: alg=none и путаница ключей»?

Найдите и исправьте самые распространённые ошибки безопасности JWT Ты практикуешь Cryptology Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Cryptology Academy?

Предыдущий опыт не требуется. Cryptology Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Уязвимости JWT: alg=none и путаница ключей»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Cryptology Academy?

Да. Каждый урок Cryptology Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Устройство JWT: заголовок, полезная нагрузка, подпись
  2. HS256 и RS256: симметричные и асимметричные JWT
  3. Уязвимости JWT: alg=none и путаница ключей
  4. Рекомендации по безопасной реализации JWT
← Назад к Cryptology Academy