Node.js закрыл 10 уязвимостей: выполнение кода через декодер Brotli и обход проверки TLS-сертификатов

21 октября 2026 года проект Node.js выпустил версии 26.12.1, 24.22.1 и 22.23.4 с исправлением 10 уязвимостей. Самая опасная — CVE-2026-111497: запись за границы буфера во встроенном декодере Brotli, через которую можно выполнить код. Ещё три бага высокого уровня касаются DNS и проверки TLS-сертификатов. Обновлять стоит все поддерживаемые ветки.
Node.js — среда выполнения, на которой работает бэкенд огромного числа веб-сервисов, API и SSR-фронтенда. Если ваш бэкенд или API на Node.js принимает сжатые данные извне или ходит по HTTPS к внешним сервисам, этот выпуск касается вас напрямую, а не «когда-нибудь в плановом обновлении».
Это уже второй за октябрь заметный патч в JavaScript-стеке: неделей раньше критические уязвимости закрывал Next.js — о похожей истории мы писали в новости про RCE в Next.js. Для команд, которые ведут веб-разработку на Node-стеке, это повод проверить все окружения, включая Docker-образы и CI-раннеры.
Что исправили в выпуске 21 октября
Выпуск закрывает четыре уязвимости высокого уровня, три средних и три низких. Часть затрагивает только ветку 26.x, но большинство — все три поддерживаемые линии.
- CVE-2026-111497 (High) — запись за границы буфера в декодере Brotli, допускающая удалённое выполнение кода. Затронуты 26.x, 24.x и 22.x. Уязвимость нашли исследователи OpenAI Codex Security.
- CVE-2026-106069 (High) — обход проверки имени хоста в TLS-сертификате, если хост «нестрого» разрешается в IP-адрес. Все три ветки.
- CVE-2026-105483 (High) — обход той же проверки, когда IP-адрес записан полноширинными цифрами Unicode. Ветки 26.x и 24.x.
- CVE-2026-105482 (High) —
dns.resolveобрезает имена, содержащие NUL-символ. Все три ветки. - Средний уровень: keep-alive-сокет может обработать ответ, записанный до отправки запроса (CVE-2026-105481); DNS-имена в SAN сертификата могут подтверждать IP-адреса в неканонической записи IPv4 (CVE-2026-106072); кэш энтропии
crypto.randomUUID()иrandomInt()попадает в пользовательские снапшоты и SEA-сборки, и каждый процесс повторяет одни и те же значения (CVE-2026-106074). - Низкий уровень: утечка байтов в ZipFile после неудачной проверки заголовка (CVE-2026-106070, только 26.x) и два обхода Permission Model — через wildcard-поиск (CVE-2026-106071, только 26.x) и через
fs.realpathSync(CVE-2026-106073).
Вместе с исправлениями обновлены зависимости: c-ares, Undici и хранилище корневых сертификатов (из него убран скомпрометированный промежуточный центр сертификации eMudhra) во всех ветках, OpenSSL — в 24.x и 22.x, SQLite — в 22.x.
Почему Brotli-уязвимость важнее остальных
Brotli — формат сжатия, который повсеместно используется в HTTP (Content-Encoding: br). Декодер встроен в официальные сборки Node.js, поэтому под риском любое приложение, которое распаковывает Brotli-данные из недоверенного источника: тела входящих запросов, ответы сторонних API, загружаемые пользователями файлы. CloudLinux, выпустивший обновлённые пакеты для своих сборок Node.js, отдельно предупреждает: временного обхода нет, а обновление системной библиотеки brotli не помогает — нужен именно новый Node.js.
TLS-баги опаснее, чем выглядят: проверка имени хоста — то, что отличает защищённое соединение от соединения «с кем-то». Сервисы, которые обращаются к внутренним API по IP-адресам или строят адреса из пользовательского ввода, стоит проверить в первую очередь.
Кому обновляться и до какой версии
- Node.js 26.x (Current) → 26.12.1.
- Node.js 24.x (LTS) → 24.22.1.
- Node.js 22.x (LTS) → 22.23.4.
- Ветки 20.x и старше уже вне поддержки (End-of-Life): проект Node.js подчёркивает, что EOL-версии затронуты при каждом выпуске безопасности, а патчей для них не будет. Это сигнал запланировать миграцию.
Что сделать команде разработки
- Найдите все места, где живёт Node.js: продакшен-серверы, базовые Docker-образы, CI-раннеры, serverless-функции, SSR-контейнеры фронтенда. Версия в
.nvmrcиenginesчасто отстаёт от реальной. - Обновите базовые образы и пересоберите контейнеры — тег вида
node:22подтянет патч только при новой сборке. - Начните с публичных сервисов, которые принимают сжатые тела запросов или проксируют внешние ответы.
- Если используете снапшоты или SEA-сборки, пересоберите их после обновления, чтобы избавиться от повторяющихся значений
randomUUID(). - Проекты на EOL-версиях вынесите в план миграции на 22.x или 24.x с регрессионным тестированием.
Часто задаваемые вопросы
Есть ли атаки с использованием этих уязвимостей? В бюллетене Node.js от 21 октября об эксплуатации в реальных атаках не сообщается. Но после публикации исправлений разбор diff — вопрос времени, поэтому откладывать обновление не стоит.
Можно ли закрыть Brotli-уязвимость настройкой, без обновления? По данным CloudLinux, надёжного обходного пути нет: декодер встроен в бинарник Node.js, и помогает только переход на исправленную версию.
Затрагивает ли это фронтенд в браузере? Нет, речь о серверной среде выполнения. Но если фронтенд рендерится на сервере (SSR в Next.js, Nuxt и т. п.), он работает на Node.js — и обновлять нужно именно сервер.
Источники
- Node.js — Wednesday, October 21, 2026 Security Releases, 21 октября 2026 (первоисточник).
- CloudLinux — Node.js October 2026 Security Releases: alt-nodejs Updates (CVE-2026-111497 and 9 Others), октябрь 2026.
Ваш Node.js-бэкенд застрял на старой версии?
Проведём инвентаризацию окружений, обновим рантайм и зависимости, пересоберём образы и прогоним регресс — чтобы патчи безопасности ставились за дни, а не за кварталы.