Уязвимости JWT
Что такое Уязвимости JWT?
Уязвимости JWTКлассы ошибок в реализации проверки JSON Web Token, позволяющие подделывать токены, повышать привилегии или обходить аутентификацию.
JSON Web Token несут утверждения об аутентификации и авторизации, однако гибкость объявляемого в заголовке алгоритма подписи породила несколько повторяющихся классов уязвимостей. Баг alg=none, раскрытый Тимом Маклином в 2015 году, возникает, когда верификатор доверяет собственному заголовку alg токена и обращается к верификатору «none», который возвращает истину для пустой подписи, — это позволяет злоумышленнику переписать полезную нагрузку и удалить подпись. Он был исправлен в библиотеке jsonwebtoken для Node до версии 4.2.2 (CVE-2015-9235).
Путаница ключей (key confusion, CVE-2016-10555) тоньше: если сервер принимает и RS256, и HS256, злоумышленник подписывает токен с помощью HMAC, используя публичный RSA-ключ сервера как общий секрет; наивный верификатор передаёт этот публичный ключ в HS256.verify(), и подделка проходит проверку. К смежным проблемам относятся слабые секреты HS256, поддающиеся офлайн-перебору с помощью hashcat, отсутствие проверок exp/nbf и точки внедрения через заголовок — обход каталогов или SQL-инъекция через kid, а также подконтрольные злоумышленнику поля jwk/jku/x5u, которые направляют проверку на ключ, принадлежащий атакующему. В 2022 году уязвимость CVE-2022-23529 в jsonwebtoken вызвала опасения по поводу RCE через специально сформированный объект ключа (позже отозвана после того, как предпосылки для эксплуатации были оспорены).
Меры защиты: жёстко фиксируйте принимаемый алгоритм (алгоритмы) на стороне сервера и никогда не считывайте alg из недоверенного ввода, используйте стойкие асимметричные ключи, валидируйте kid по списку разрешений, игнорируйте встроенные URL-адреса ключей, обеспечивайте проверку срока действия и относитесь к каждому полю JWT как к враждебному вводу.
flowchart TD
A[Злоумышленник получает валидный JWT] --> B{Подмена заголовка}
B -->|alg none, удалить подпись| C[Верификатор пропускает проверку?]
B -->|RS256 в HS256| D[HMAC с публичным ключом]
B -->|jku / kid указывает на ключ атакующего| E[Проверка по ключу злоумышленника]
C -->|Да| F[Поддельный токен принят]
D -->|Да| F
E -->|Да| F
F --> G[Повышение привилегий / обход аутентификации]
C -->|Фиксированный alg| H[Отклонено]
D -->|Фиксированный alg| H
E -->|kid по списку разрешений| H● Примеры
- 01
Заголовок {"alg":"none"}, принимаемый неправильно настроенной библиотекой.
- 02
Сервер проверяет RS256-токен, используя свой публичный ключ как HMAC-секрет HS256.
● Частые вопросы
Что такое Уязвимости JWT?
Классы ошибок в реализации проверки JSON Web Token, позволяющие подделывать токены, повышать привилегии или обходить аутентификацию. Относится к категории Безопасность приложений в кибербезопасности.
Что означает Уязвимости JWT?
Классы ошибок в реализации проверки JSON Web Token, позволяющие подделывать токены, повышать привилегии или обходить аутентификацию.
Как защититься от Уязвимости JWT?
Защита от Уязвимости JWT обычно сочетает технические меры и операционные практики, как описано в определении выше.