Node.js 22.23.4, 24.22.1 и 26.12.1: десять уязвимостей закрыты

21 октября 2026 года Node.js выпустил обновления безопасности для всех поддерживаемых веток: 22.23.4, 24.22.1 и 26.12.1. Исправлено 10 уязвимостей: четыре высокие, три средние и три низкие. Самая серьёзная — ошибка записи за границей буфера в декодере Brotli, которую проект описывает как допускающую удалённое выполнение кода. Node.js 20 и старше исправлений не получили.
Что произошло
Вот главное из бюллетеня nodejs.org.
| CVE | Суть | Ветки |
|---|---|---|
| CVE-2026-111497 | Запись за границей буфера в декодере Brotli | 26.x, 24.x, 22.x |
| CVE-2026-106069 | Обход проверки имени в TLS-сертификате, если хост «нестрого» разрешается в IP | 26.x, 24.x, 22.x |
| CVE-2026-105483 | Обход проверки имени в TLS при записи IP полноширинными цифрами | 26.x, 24.x |
| CVE-2026-105482 | dns.resolve обрезает имена с нулевым символом | 26.x, 24.x, 22.x |
Среди средних — ошибка, из-за которой `crypto.randomUUID()` и `randomInt()` повторяют одни и те же значения в приложениях, собранных как единый исполняемый файл со снапшотом. Там же обновлены встроенные c-ares, Undici, OpenSSL и SQLite, а из списка доверенных корневых сертификатов убраны скомпрометированные промежуточные центры eMudhra.
Кого касается
Brotli — это формат сжатия. Уязвимый код работает всякий раз, когда Node.js распаковывает такие данные: напрямую через `node:zlib` или автоматически, когда `fetch()` получает ответ со сжатием Brotli. Рискуют приложения, которые принимают сжатые тела запросов или ходят за данными на чужие серверы: интеграции с API партнёров, парсеры, прокси.
По данным The Hacker News, публичный пример атаки 22 октября выполнил код только на специально ослабленной тестовой сборке. На обычной сборке он вызывал падение и ограниченное чтение памяти процесса. Атак в реальной среде на 22 октября не зафиксировано.
Ошибки проверки имени в TLS важны тем, кто ходит в API по IP-адресам или строит списки разрешённых хостов на основе строк.

Что делать
- Узнайте версию: `node -v` на сервере и тег образа в Dockerfile. Проверьте калькулятором ниже.
- Обновитесь до 22.23.4, 24.22.1 или 26.12.1. Обходных путей проект не публиковал.
- Если используете пакет `undici` напрямую из npm, обновите и его: встроенная копия в Node.js его не заменяет.
- Если приложение собрано как SEA со снапшотом, пересоберите его и замените токены и одноразовые значения, которые оно генерировало.
- Перезапустите процессы приложения. Обновлённый бинарник без перезапуска не работает.
- Node.js 20, 21, 23 и 25 переводите на 24.x или 22.x: эти ветки больше не получают исправлений.
Что ещё важно в этом выпуске
Сеть и сертификаты. Две уязвимости средней важности касаются того, как Node.js сопоставляет имя в сертификате с адресом. CVE-2026-106072 позволяла сертификату с DNS-именем, совпадающим с IP, подтверждать подключение к нестандартной записи этого IP. Вместе с CVE-2026-106069 и CVE-2026-105483 это три ошибки проверки имени в одном выпуске. Если ваш сервис подключается к партнёрам по IP-адресам, это прямой повод обновиться.
Keep-alive. CVE-2026-105481: сокет с keep-alive мог принять ответ, отправленный до того, как ушёл следующий запрос. В цепочках прокси это путь к подмене ответа.
Модель разрешений. Три низкие уязвимости касаются экспериментальной модели разрешений и `zlib.ZipFile`. Документация Node.js прямо говорит, что модель разрешений не является песочницей для недоверенного кода.
Встроенные библиотеки. Обновлены c-ares до 1.34.9, OpenSSL до 3.5.9 в ветках 22 и 24, Undici до 6.29.1, 7.30.1 и 8.12.2. В Undici закрыта CVE-2026-109383: TLS-параметры вроде `checkServerIdentity` могли молча теряться.
Как проверить после обновления
- `node -v` на каждом сервере и в каждом контейнере, а не только на машине разработчика.
- Перезапущены все процессы: pm2, systemd, контейнеры. Старый процесс продолжает работать на старом бинарнике.
- Соединения, открытые до обновления, не перепроверяются на блокировку eMudhra до истечения сессии, поэтому перезапуск нужен и по этой причине.
Наше мнение
Самый частый сценарий у малого бизнеса — бот или интеграция на Node.js, которые когда-то запустили и забыли. Они работают на Node.js 18 или 20 и тихо ходят в чужие API со сжатием. Мы советуем раз в квартал проходить по всем сервисам на Node.js и сверять версии с графиком поддержки, а для Docker-образов фиксировать конкретную минорную версию и обновлять её осознанно. Удобно вести простой реестр: сервис, сервер, версия Node.js, кто отвечает, дата последнего обновления. Такой реестр за полчаса показывает, где после бюллетеня 21 октября остались дыры, и не даёт забытым ботам годами работать без присмотра.
Есть ли в вашей версии Node.js исправления 21 октября
Сверка с бюллетенем nodejs.org от 21.10.2026 и графиком поддержки веток 20–26. Не учитывает пакеты дистрибутивов с собственными сборками Node.js. Расчёт выполняется на вашем устройстве, введённые данные никуда не отправляются.
Материалы для проверки
Если нужна реализация
Состав работ зависит от текущего проекта и подтверждённой причины. Можно обсудить диагностику или разработку подходящего решения.
Вопросы и ответы
Нужно ли обновлять Node.js, если сайт статический?
Если Node.js используется только для сборки, риск ниже, но обновить окружение сборки всё равно стоит. Если Node.js отвечает на запросы в продакшене, обновление обязательно.
Почему нет исправления для Node.js 20?
Ветка 20 закончила поддержку 30 апреля 2026 года. Проект не выпускает исправлений для устаревших веток, они уязвимы ко всем новым CVE.
Атакуют ли уязвимость Brotli?
На 22 октября атак в реальной среде не фиксировали. Публичный пример выполнил код только на ослабленной сборке, на обычной вызывал падение процесса.
Что такое Undici и почему его обновлять отдельно?
Это HTTP-клиент, на котором построен встроенный fetch. Если вы подключаете пакет undici из npm напрямую, обновление Node.js его не меняет.
Как обновить Node.js в Docker?
Поменяйте тег базового образа на нужную ветку, пересоберите образ и перевыкатите контейнер. Лучше фиксировать минорную версию, чтобы обновления были предсказуемыми.
Затронут ли Bun или Deno?
Бюллетень Node.js касается только Node.js. Но если другая среда или программа использует свою копию библиотеки Brotli, её стоит обновить до Brotli 1.2.1, 1.1.1 или 1.0.10 — об этом пишет The Hacker News со ссылкой на рекомендации.