Node.js 22/24/26: вышли патчи на 16 CVE, 7 из них HIGH
11 ноября Node.js Project выпустил обещанные версии 22.23.5, 24.22.3 и 26.13.1 — и раскрыл детали: 16 уязвимостей, 7 с серьёзностью HIGH. Самая опасная позволяла серверу случайно скопировать чужую память, включая приватные ключи TLS, в тело чужого ответа.

Pre-alert от 3 ноября предупреждал только о дате и уровне серьёзности — без деталей. 11 ноября 2026 года Node.js Project опубликовал полный разбор: версии 22.23.5, 24.22.3 и 26.13.1 закрывают 16 уязвимостей сразу во всех трёх актуальных ветках. Независимо тот же список CVE подтвердил SecurityOnline, сославшись на тот же официальный пост и добавив разбивку по CVSS-баллам.
Что именно сломано
Старшая по CVSS (8.1) — CVE-2026-123864, реентрантный баг в HTTPS-модуле. Если JS-код внутри колбэка on_body HTTP-парсера инициирует запись нулевой длины, TLSWrap::DoWrite() напрямую вызывает ClearOut() и расшифровывает следующую TLS-запись, пока парсер ещё не закончил разбор тела — это повторный вход в llhttp_execute() и use-after-free с чтением за пределами выделенной памяти. Итог — сервер копирует чужую (или уже освобождённую) кучу прямо в тело ответа, включая данные других соединений и, в худшем случае, приватные ключи TLS. Чистый node:http без TLS этот баг не затрагивает, активной эксплуатации на момент релиза не зафиксировано.
Остальные HIGH-баги одним списком
- CVE-2026-123863 — падение по
CHECK_EQпри удалённом обрыве HTTP/2-сессии (24.x, 26.x) - CVE-2026-123865 — HTTP/2-сессии не очищаются при протокольной ошибке на завершении (все три ветки)
- CVE-2026-123866 — teardown HTTP/2-стрима отправляет пиру уже освобождённую память ответа (все три ветки)
- CVE-2026-126051 — необработанное исключение в колбэке отложенного TLS-хендшейка (24.x, 26.x)
- CVE-2026-123872 — обход проверки servername при TLS 1.2 renegotiation для клиентских сертификатов (все три ветки)
- CVE-2026-123874 — use-after-free в
respondWithFile()при сбросе HTTP/2-стрима (24.x, 26.x)
Ещё 6 MEDIUM (включая утечку credentials прокси в текстах ошибок и обход проверки сертификата через переиспользование TLS-сессии между политиками) и 3 LOW закрыты тем же релизом — полный список CVE и зависимостей llhttp/undici/sqlite есть в официальном посте.
Что сделать прямо сейчас
Обновиться на 22.23.5 / 24.22.3 / 26.13.1 стоит в первую очередь тем, у кого прод держит HTTPS-соединения с большим числом одновременных клиентов — реентрантный баг в TLS именно там даёт реальный шанс на утечку между запросами. Для end-of-life веток (20.x и ниже) патча не будет: там единственный вариант — миграция на поддерживаемую линию. То, что 16 уязвимостей, включая такую серьёзную, обнаружились разом в зрелом рантайме с собственной security-командой, — хороший повод свериться не только с версией Node.js, но и с тем, как вообще устроен процесс обновления зависимостей и рантайма в проекте. Именно такие слепые пятна — патч-менеджмент без регламента, забытые базовые образы в Docker, старые serverless-рантаймы — находит независимый аудит кода и инфраструктуры, причём до того, как на них наткнётся атакующий, а не после инцидента.



