JWT (JSON Web Token) используется как компактный формат передачи утверждений между сторонами и опирается на криптографическую подпись для проверки целостности. В JavaScript-экосистеме работа с JWT часто реализуется через библиотеку Jose, которая поддерживает JWS (подписи), JWE (шифрование) и JWK (ключи).
Критическая особенность JWT заключается в том, что безопасность системы определяется не самим форматом токена, а корректностью обработки заголовка (header), выбора алгоритма подписи и управления ключами.
В спецификации JWT допускается указание алгоритма подписи в заголовке:
{
"alg": "HS256",
"typ": "JWT"
}
Некоторые реализации исторически поддерживали значение:
{
"alg": "none"
}
При значении alg: none подпись отсутствует. Уязвимости
возникают в случаях, когда:
alg из токенаalgalg === "none"В безопасных реализациях, включая современные версии Jose:
none исключается на уровне конфигурацииАтака key confusion возникает из-за неправильной интерпретации типа ключа при верификации подписи.
JWT может быть подписан:
Ошибка возникает, когда:
В библиотеке Jose контроль должен быть явным:
algorithms задаются при верификацииJWT header является JSON-структурой, которая передаётся в base64url-кодировке. Ошибки возникают, когда данные из header используются в логике проверки без строгой валидации.
algЕсли система динамически выбирает алгоритм из header:
{
"alg": "HS256",
"kid": "key-id-1"
}
возможна подмена алгоритма на несовместимый или менее безопасный.
kid (Key ID) для инъекцийПоле kid предназначено для выбора ключа из
хранилища:
{
"alg": "RS256",
"kid": "../. ./evil-key"
}
Ошибки возникают при:
kidЭто может приводить к:
Некорректные реализации могут использовать header для:
Любая зависимость логики безопасности от header создаёт поверхность атаки.
При использовании Jose ключевые проблемы возникают не в криптографии, а в конфигурации.
Опасная модель:
Безопасная модель:
kid напрямую влияет на путьКорректная модель проверки строится вокруг принципа фиксированной конфигурации:
noneБольшинство проблем возникает из-за архитектурных решений:
JWT сам по себе не является небезопасным механизмом; уязвимости формируются на уровне обработки header и управления ключами.