Назад в ленту

Node.js закрыл 10 уязвимостей: Brotli-декодер открывал путь к удалённому выполнению кода

Ветки 22.x, 24.x и 26.x получили внеплановые патчи — четыре дыры оценили как высокоопасные, а заодно заблокировали скомпрометированный удостоверяющий центр eMudhra.

Node.js снова напомнил, почему не стоит откладывать обновления «на потом». 21 октября команда проекта выкатила внеплановые патчи для веток 22.x, 24.x и 26.x, закрыв сразу десять уязвимостей. Четыре из них получили высокий уровень опасности, и одна — та самая, из-за которой всё завертелось — теоретически позволяет удалённо выполнить код на сервере. Речь о дыре в Brotli-декодере, получившей идентификатор CVE-2026-111497.

Если коротко: исправленные сборки — это Node.js 22.23.4, 24.22.1 и 26.12.1. Всё, что ниже по соответствующей ветке, остаётся уязвимым. И да, версии с истёкшим сроком поддержки (EOL) тоже затронуты — проект отдельно предупреждает, что отсидеться на старом добром Node.js 20 или ещё более древних сборках не выйдет.

Что именно сломалось в Brotli

Brotli — это алгоритм сжатия, который Node.js использует для работы с HTTP-трафиком. Дыра CVE-2026-111497 представляет собой запись за границами буфера в декодере: если скормить процессу специально собранный Brotli-контент, можно повредить память и в перспективе добиться выполнения произвольного кода в контексте приложения. Точные условия эксплуатации в публичном бюллетене не расписаны, но само описание «out-of-bounds write permits remote code execution» звучит достаточно неприятно, чтобы не тянуть с обновлением.

Для тех, кто обрабатывает пользовательские загрузки, проксирует сжатые ответы или просто держит открытый HTTP-эндпоинт, этот патч обязателен. Если возможности обновиться прямо сейчас нет, временная мера — не пропускать недоверенный Brotli-контент до декодера, хотя это и не полноценная замена патчу.

Остальные три «высокие» дыры

Помимо Brotli, высокую оценку получили ещё три уязвимости. Две касаются проверки TLS-сертификатов: CVE-2026-105483 позволяет обойти проверку имени хоста, если IP-адрес записан полноширинными цифрами (затрагивает ветки 26.x и 24.x), а CVE-2026-106069 — если хост «слабо» резолвится в IP-адрес (здесь уже все три ветки). По сути, обе дыры вертятся вокруг одного и того же вопроса: правильно ли сертификат соответствует пункту назначения. И в обоих случаях ответ иногда был «нет, но проверка этого не заметила».

Четвёртая высокоопасная проблема — CVE-2026-105482. Она заставляет dns.resolve обрезать имена, содержащие нулевой символ, что может сбить с толку приложения, полагающиеся на предсказуемую обработку имён перед DNS-запросами. Для сервисов, которые строят логику на результатах резолва, это прямой приглашенный билет в мир неожиданного поведения.

Средние, низкие и eMudhra

Три уязвимости средней опасности расширяют список: keep-alive-сокет может обработать ответ, написанный до отправки запроса (CVE-2026-105481); валидация сертификатов для нестандартных IPv4-хостов пропускает DNS-имена к IP-эндпоинтам (CVE-2026-106072); а кэшированные случайные данные в стартовых снапшотах и однофайловых приложениях могут повторять значения, которые возвращают crypto.randomUUID() и crypto.randomInt() (CVE-2026-106074). Последнее особенно весело для тех, кто привык считать случайность случайной.

Низкоопасные пункты тоже не стоит сбрасывать со счетов: CVE-2026-106070 касается байтов, возвращаемых после неудачной проверки ZIP-заголовков; CVE-2026-106071 позволяет получить избыточный доступ к файловой системе через сопоставление по шаблону; CVE-2026-106073 обходит проверки модели разрешений через fs.realpathSync. Отдельным пунктом идёт обновление корневых сертификатов: Node.js блокирует скомпрометированный удостоверяющий центр eMudhra и добавляет список заблокированных промежуточных сертификатов, чтобы отклонять цепочки с отозванными публичными ключами, даже если корневой сертификат всё ещё считается доверенным.

Что делать с LTS и ветками

Node Js Lts-ветки не остались в стороне: 24.x сейчас находится в статусе Active LTS (поддержка до апреля 2028 года), а 22.x — в Maintenance LTS (до апреля 2027-го). Патчи для обеих уже доступны, так что отговорка «у меня же LTS, значит, можно не спешить» здесь не работает. Как и в случае с любым security-релизом, после обновления стоит пересобрать образы приложений и перезапустить сервисы, а заодно прогнать тесты на исходящие HTTPS-соединения, DNS и распаковку сжатого контента.

Для тех, кто всё ещё сидит на Node Js 22 в режиме «работает — не трогай», напомню: 22.x — это Maintenance LTS, а не вечный двигатель. Патчи выходят, но окно поддержки когда-нибудь закроется. Если в проекте нет причин оставаться на старых сборках, миграция на актуальную ветку — не роскошь, а способ не оказаться в ситуации, когда security-релиз формально есть, а вашей версии в нём уже нет.

Редакция TechLoot будет следить за тем, как разработчики переваривают этот внеплановый патч-день. Одно можно сказать точно: те, кто обновился вчера, сегодня спят спокойнее. Остальным — удачи с планированием релиза, который внезапно стал срочным.

Справка по теме (FAQ)
Какие версии Node.js нужно обновить?
Исправленные сборки — Node.js 22.23.4, 24.22.1 и 26.12.1. Все более ранние версии в этих ветках остаются уязвимыми. Ветки с истёкшим сроком поддержки (EOL) также затронуты, и проект рекомендует перейти на поддерживаемую версию.
Насколько опасна уязвимость в Brotli-декодере?
CVE-2026-111497 получила высокую оценку опасности. Это запись за границами буфера, которая может привести к удалённому выполнению кода, если декодер обрабатывает специально сформированный Brotli-контент. Точные условия эксплуатации в публичном бюллетене не детализированы.
Что ещё исправили в этом обновлении?
Помимо Brotli, закрыты две уязвимости высокого уровня в проверке TLS-сертификатов (CVE-2026-105483 и CVE-2026-106069) и одна в dns.resolve (CVE-2026-105482). Также исправлены три уязвимости средней опасности и три низкой, обновлены зависимости (OpenSSL, SQLite, c-ares, Undici), а скомпрометированный удостоверяющий центр eMudhra заблокирован.
Нужно ли что-то делать после обновления?
Да. После установки патча стоит пересобрать образы приложений, перезапустить сервисы и прогнать тесты на исходящие HTTPS-соединения, обработку DNS и распаковку Brotli-контента. Если в проекте используются снапшоты или однофайловые приложения с кэшированной случайностью, их тоже лучше проверить.