
PoC для CVE-2025-65945 (Некорректная проверка криптографической подписи в node-jws)
Это доказательство концепции обхода проверки подписи в библиотеке node-jws. Уязвимость позволяет злоумышленникам подделывать валидные JWT, когда сервер получает HMAC-секреты из данных, контролируемых пользователем.
Функция jws.createVerify() не проверяет, что при использовании HMAC-алгоритмов секрет действительно был предоставлен. Если ваше приложение ищет секреты на основе чего-то в JWT (например, заголовка kid) и поиск не даёт результата, вы можете начать проверять подпись с пустым секретом.
Злоумышленник может воспользоваться этим следующим образом:
undefined, который приводится к пустой строкеТеперь злоумышленник может выдать себя за любого пользователя или наделить себя правами администратора.
Чтобы исправить проблему, обновитесь до 3.2.3+ или 4.0.1+.
Убедитесь, что у вас установлен Bun, затем:
# Install the vulnerable version
bun install [email protected]
# Run the exploit
bun run exploit.js
Вы должны увидеть вывод, в котором подделанный токен администратора принимается как валидный.
PoC имитирует сервер, который:
kid (идентификатор ключа) JWTcreateVerify() с потоковым APIЗлоумышленник создаёт JWT с kid: "non-existent-key" и подписывает его пустым секретом. Когда сервер пытается найти этот ключ, он получает undefined, записывает пустую строку в поток проверки, и подделанный токен успешно проходит проверку.
# Upgrade to patched version
bun install [email protected]
# Run again - should fail now
bun run exploit.js
В исправленной версии вы увидите ошибку: secret must be a string or buffer or a KeyObject. Исправление проверяет, что для HMAC-операций имеется корректный секрет, прежде чем продолжить.
Если ваш код выглядит похоже на этот, вы можете быть затронуты уязвимостью:
const decoded = jws.decode(token);
const secret = lookupSecret(decoded.header.kid); // might return undefined!
const verifier = jws.createVerify({
algorithm: "HS256",
signature: token,
});
verifier.secret.write(secret); // oops
verifier.secret.end();