Команда Node.js 29 июля 2026 года выпустила версии 22.23.2, 24.18.1 и 26.5.1 с исправлениями 11 уязвимостей. Три проблемы получили высокий уровень опасности: они затрагивают HTTP/2 и экспериментальную модель разрешений, поэтому обновление особенно актуально для серверов, API-шлюзов и приложений, запускающих сторонний код с ограниченными правами.

Два переноса завершились крупным пакетом исправлений безопасности
Публикация патчей оказалась сложнее обычного выпуска. Команда Node.js сначала перенесла обновления на 28 июля, чтобы завершить тестирование и проверку исправлений, а затем сдвинула релиз на 29 июля из-за проблем с инфраструктурой. В итоге одновременно обновились все три поддерживаемые ветки: Node.js 22, 24 и 26.
В официальном бюллетене безопасности перечислены 11 уязвимостей: три высокого, пять среднего и три низкого уровня опасности. Состав исправлений немного различается между ветками, поскольку отдельные функции присутствуют только в определённых версиях.
| Ветка | Выпущенная версия | Статус на июль 2026 года | Количество исправленных CVE |
| Node.js 22 | 22.23.2 | Maintenance LTS, кодовое имя Jod | 10 |
| Node.js 24 | 24.18.1 | Active LTS, кодовое имя Krypton | 11 |
| Node.js 26 | 26.5.1 | Current | 10 |
Node.js 24.18.1 получил все исправления из бюллетеня. В Node.js 22 отсутствует проблема компонента node:sqlite, а Node.js 26 уже не затрагивала уязвимость учёта памяти HTTP/2 с идентификатором CVE-2026-56846.
Ошибки HTTP/2 могли привести к исчерпанию памяти и повреждению кучи
Самая заметная часть выпуска связана с HTTP/2 — протоколом, который позволяет передавать несколько запросов через одно соединение и широко используется веб-серверами, прокси и API-инфраструктурой.
CVE-2026-56846 затрагивала Node.js 22 и 24. Сохранённые блоки HTTP-заголовков могли обходить лимит maxSessionMemory, который должен ограничивать объём памяти одной HTTP/2-сессии. Удалённый клиент получал возможность постепенно увеличивать потребление памяти процессом. Для публичного сервера такой сценарий способен закончиться замедлением, срабатыванием механизма OOM или перезапуском приложения.
CVE-2026-56848 присутствовала во всех трёх ветках. Повторный вызов функции отправки данных внутри обработки входящего трафика мог привести к обращению к уже освобождённой области памяти — классу ошибок heap-use-after-free. На практике это создаёт риск аварийного завершения процесса и непредсказуемого поведения при специально сформированной последовательности HTTP/2-событий.
Здесь важен масштаб потенциального воздействия. Уязвимый код находится в сетевом стеке среды выполнения, поэтому приложение может попасть под атаку ещё до обработки запроса бизнес-логикой.
Permission Model пропускала обращения за пределы разрешённых каталогов
Третья уязвимость высокой опасности, CVE-2026-58043, связана с Permission Model. Этот режим запускается флагом --permission и позволяет ограничивать доступ JavaScript-кода к файлам, дочерним процессам, рабочим потокам и другим ресурсам.
Ошибка возникала при сопоставлении путей в radix tree — структуре данных, которую Node.js использует для проверки разрешённых каталогов. При определённых совпадениях префиксов процесс мог получить чтение или запись за пределами указанного списка --allow-fs-read или --allow-fs-write.
Представим сервис, которому разрешили работать с каталогом /srv/app/uploads. При ошибочной обработке близкого префикса ограничение могло охватить соседний путь, хотя администратор его не указывал. Такой сценарий особенно чувствителен для платформ, где плагины, пользовательские скрипты или задания автоматизации запускаются внутри одного Node.js-процесса.
Ещё две проблемы низкого уровня затрагивали тот же механизм. Модули trace_events и process.report могли записывать файлы за пределами разрешённого списка. После обновления Node.js проверяет конечный путь перед созданием трассировок и диагностических отчётов.
HTTPS Agent смешивал сертификаты и параметры проверки узлов
Две уязвимости среднего уровня обнаружили в механизме повторного использования HTTPS-соединений.
CVE-2026-56850 возникала при работе с массивами PFX-сертификатов. Ключи соединений в HTTPS Agent могли совпасть для разных наборов клиентских сертификатов, из-за чего mTLS-идентичность повторно использовалась в другом запросе. mTLS применяют там, где сервер и клиент взаимно подтверждают сертификаты: во внутренних API, банковских интеграциях, системах управления устройствами и корпоративных сервисах.
CVE-2026-58040 продолжила историю предыдущего исправления CVE-2026-48934. Повторно используемая TLS-сессия могла пропустить проверку имени узла при смене политики идентификации. Риск появляется в приложениях, которые обращаются к нескольким HTTPS-ресурсам через общий агент и полагаются на строгую проверку сертификатов.
Обе ошибки показывают одну общую проблему: экономия времени на повторном использовании защищённого соединения требует точного разделения сертификатов, имён узлов и параметров проверки. Новые версии включают эти данные в логику выбора сессии.
DNS, zlib и SQLite позволяли удалённо остановить процесс
Несколько исправлений закрывают сценарии отказа в обслуживании.
Функция dns.resolveAny() могла аварийно завершить процесс, если DNS-ответ содержал более 256 A-записей. Атакующий способен подготовить домен с необычно большим набором адресов и добиться остановки сервиса, который запрашивает записи через этот API. CVE-2026-58042 затрагивала Node.js 22, 24 и 26.
В синхронных API модуля node:zlib поддельное значение длины TypedArray приводило к срабатыванию внутренней проверки и остановке процесса. Для эксплуатации CVE-2026-58045 атакующему нужен путь, позволяющий передать контролируемый объект в код сжатия, поэтому реальный риск зависит от архитектуры приложения.
В Node.js 24 и 26 исправили CVE-2026-58041 в node:sqlite. Устаревший итератор, созданный через DatabaseSync#createTagStore(), мог продолжить выполнение кэшированного SQL-выражения после сброса и привязки новых параметров. Если выражение изменяло данные, повторное обращение к итератору могло заново выполнить запись. Патч инвалидирует такие итераторы при сбросе подготовленного выражения.
Ограничение числа заголовков закрывает путь к request smuggling
CVE-2026-58044 получила низкую оценку, хотя её сценарий заслуживает внимания операторов прокси-серверов. Node.js мог скрыть заголовки, превышающие maxHeadersCount или maxHeaderPairs, из объектов req.headers, req.rawHeaders и req.headersDistinct, сохранив их влияние на внутреннее определение границ HTTP-сообщения.
Проблема возникала в прокси, которые заново собирают исходящие заголовки из видимой части запроса и одновременно передают исходное тело через повторно используемое соединение. Скрытый Content-Length мог рассинхронизировать представление о границах запроса между прокси и конечным сервером. Такой класс атак называют request smuggling: один участник цепочки считает запрос завершённым, второй продолжает читать данные как его часть.
После установки патча Node.js отклоняет запросы, превышающие допустимое число заголовков, и тем самым убирает расхождение между внутренним парсером и данными, доступными приложению.
Undici и llhttp обновились вместе с ядром Node.js
Выпуск включает новые версии двух ключевых зависимостей. HTTP-клиент Undici обновлён до 6.28.0 в Node.js 22, до 7.29.0 в Node.js 24 и до 8.9.0 в Node.js 26. Парсер HTTP-сообщений llhttp во всех ветках поднят до версии 9.4.3.
Это имеет практический смысл даже для проектов, которые не устанавливали Undici напрямую. Node.js использует его внутри встроенного fetch(), поэтому обновление среды выполнения меняет и сетевой компонент стандартной платформы.
Полные списки изменений опубликованы в заметках к Node.js 22.23.2, Node.js 24.18.1 и Node.js 26.5.1.
Приоритет обновления зависит от роли сервера
Наибольший риск возникает у публичных Node.js-сервисов с HTTP/2, у приложений с общим HTTPS Agent и у платформ, применяющих --permission для изоляции стороннего кода. Для них переход на 22.23.2, 24.18.1 или 26.5.1 закрывает сетевые сценарии отказа в обслуживании и восстанавливает заявленные границы доступа к файловой системе.
Node.js 24 остаётся основной LTS-веткой для производственных систем, Node.js 22 находится в режиме Maintenance LTS, а Node.js 26 представляет текущую ветку с новыми возможностями. Node.js 20 завершил официальный срок поддержки 30 апреля 2026 года и в июльский пакет уже не вошёл. Проекты на этой версии не получают перечисленные патчи в рамках бесплатных официальных выпусков.
Обновление затрагивает среду выполнения, поэтому перед развёртыванием имеет смысл прогнать интеграционные тесты, проверить нативные модули и сетевые сценарии. Сам выпуск сфокусирован на безопасности и обновлении зависимостей, без заявленных изменений прикладных API. Главный ориентир здесь понятен: поддерживаемая ветка должна завершаться на версии, выпущенной 29 июля.