21 октября 2026 Node.js выпустил security-релиз сразу на всех трёх поддерживаемых линейках - 26.12.1 (Current), 24.22.1 и 22.23.4 (обе - LTS).[1][2][3][4] Это не рутинный патч-бамп, который можно отложить до ближайшего окна обслуживания. Релиз закрывает четыре CVE уровня HIGH, три из которых достижимы на нормально сконфигурированном сервере без каких-либо необычных фич. Три из них бьют по линейкам 26.x, 24.x и 22.x; одна - TLS-bypass на fullwidth digits - только по 26.x и 24.x. Если вы запускаете любую из них на VPS - вы в зоне риска, и к обновлению стоит отнестись как к реагированию на инцидент, а не как к очередному обновлению версии.[1]
Это гайд по апгрейду: что именно фиксит каждая линейка, почему эти патчи обязательны именно сейчас, что для вашего плана обновления значит переход Node 26 → Active LTS 28 октября, и точные команды для проверки и обновления self-hosted Node-деплоя.
Что вышло 21 октября
Октябрьский security-релиз покрывает 26.x, 24.x и 22.x, обновляя набор встроенных зависимостей: c-ares на всех трёх линейках, OpenSSL на 24.x и 22.x, SQLite на 22.x, Undici на всех трёх, и корневые сертификаты (ca-cert) по всему проекту - последнее в ответ на компрометацию промежуточного CA eMudhra.[1]
Четыре CVE уровня HIGH - те, что нужно понимать, потому что это четыре разных класса проблем:
CVE-2026-105482 - DNS-резолвинг молча обрезает имя по NUL-байту (HIGH)
dns.resolve*() и dns.reverse() обрезают hostname на любом встроенном NUL-символе, не отклоняя его.[1][5] Так как имя передаётся в c-ares как C-строка, резолв attacker.example\0.trusted.example на самом деле запрашивает attacker.example и возвращает его записи - без ошибки. Приложение, которое валидирует hostname по allowlist и затем резолвит его через dns.resolve*(), может сработать по записям другого имени, чем то, что было валидировано. Это неполный фикс CVE-2026-48930, который закрывал только dns.lookup() и host-опции net/tls. Затрагивает 26.x, 24.x, 22.x.[1][5]
CVE-2026-105483 - TLS-bypass hostname при fullwidth digits (HIGH)
Когда IPv4-адрес записан не-ASCII fullwidth цифрами (например, 127.0.0.1), tls.checkServerIdentity() не распознаёт его как IP-адрес, нормализует до обычного IP и сверяет его с DNS-именами и Common Name сертификата вместо IP-Address SAN. Поэтому сертификат, содержащий DNS:127.0.0.1 или DNS:*.0.0.1, может аутентифицировать соединение с IP-эндпоинтом, под который он не выпущен. Это регрессия, появившаяся после фикса CVE-2026-48618. Затрагивает только 26.x и 24.x - не 22.x.[1][6]
CVE-2026-106069 - TLS-bypass hostname при IPv4 literal с ведущим нулём (HIGH)
Для неканонического IPv4 literal с ведущим нулём, например 0127.0.0.1, tls.checkServerIdentity() следует правилам WHATWG URL и читает октет с ведущим нулём как восьмеричный (становится 87.0.0.1), тогда как системный резолвер на некоторых платформах (например, macOS) читает его как десятичный (127.0.0.1). Сервер по адресу соединения может быть аутентифицирован сертификатом, выпущенным для другого IP. Затрагивает 26.x, 24.x и 22.x.[1][2][3][4]
CVE-2026-111497 - out-of-bounds запись в декодере Brotli, удалённое исполнение кода (HIGH)
Встроенный в Node.js декодер Brotli при некорректном сжатом входе пишет за конец внутреннего буфера, что может повредить память процесса и привести к падению, утечке данных или удалённому исполнению кода. Уязвимость достижима по HTTP везде, где приложение распаковывает Brotli-данные через node:zlib - со стороны запроса (например, Express-роут, декодирующий тело с Content-Encoding: br) или со стороны ответа (встроенный fetch(), прозрачно декодирующий Brotli-ответ). Затрагивает 26.x, 24.x, 22.x.[1] Так как это самый опасный и самый доступный из батча, механику и процедуру проверки/обновления именно для вашего VPS мы разбираем в отдельном гайде - см. Node2Shell (CVE-2026-111497). Здесь мы рассматриваем его как часть октябрьского релиза и апгрейда, который его закрывает.[1][8]
Остальное - кратко
Помимо четырёх фиксов уровня HIGH, релиз закрывает ещё ряд проблем средней и низкой серьёзности, о которых стоит знать, даже если риск ниже:
- CVE-2026-105481 (medium) - keep-alive сокет HTTP Agent может обработать ответ, записанный до отправки запроса; неполный фикс CVE-2026-48931. Все линейки.[1]
- CVE-2026-106072 (medium) - сертификат только с DNS SAN может аутентифицировать IP-эндпоинт при неканонической записи IPv4 (
0177.0.0.1,0x7f.0.0.1,2130706433,127.1) на резолверах вроде glibc. Все линейки.[1] - CVE-2026-106074 (medium) - кэши энтропии
crypto.randomUUID()/randomInt()попадают в user-land startup snapshot и single-executable приложения, поэтому каждый процесс из такого снапшота повторяет одни и те же значения (до 127 UUID, ~1 000 значенийrandomInt()). Все линейки.[1] - CVE-2026-106070 (low) -
zlib.ZipFileвозвращает контролируемые атакующим prefix-байты после неудачной валидации ZIP-заголовка; только 26.x.[1] - CVE-2026-106071 (low) - Permission Model: wildcard radix lookup может дать избыточный доступ к ФС (например,
--allow-fs-read=/etc/passwd.*также разрешает/etc/passwd); только 26.x.[1] - CVE-2026-106073 (low) -
fs.realpathSync()обходит проверки прав Permission Model; неполный фикс CVE-2026-21715. Все линейки.[1]
Какой фикс на какой линейке
Обновления зависимостей привязаны к линейкам, и 22.x намеренно уже, чем 26.x/24.x:[1][2][3][4]
| Компонент | 26.12.1 (Current) | 24.22.1 (LTS) | 22.23.4 (LTS) |
|---|---|---|---|
| c-ares | 1.34.9 | 1.34.9 | 1.34.9 |
| OpenSSL | - | апгрейд до 3.5.9 | апгрейд до 3.5.9 |
| SQLite | - | - | 3.53.4 |
| Undici | 8.12.2 | 7.30.1 | 6.29.1 |
| Корневые сертификаты (ca-cert) | NSS 3.131.1 | NSS 3.131.1 | NSS 3.131.1 |
| CVE-2026-105482 (DNS NUL) | ✓ | ✓ | ✓ |
| CVE-2026-105483 (fullwidth digits) | ✓ | ✓ | - |
| CVE-2026-106069 (IPv4 с ведущим нулём) | ✓ | ✓ | ✓ |
| CVE-2026-111497 (Brotli RCE) | ✓ | ✓ | ✓ |
| CVE-2026-106070/106071 (ZIP, Permission wildcard) | ✓ | - | - |
Из таблицы два практических вывода. Во-первых, в 22.23.4 нет фикса CVE-2026-105483 (fullwidth digits) - если вы остаётесь на 22.x, убедитесь, что понимаете, какие именно bypass закрывает ваша линейка. Во-вторых, усиление валидации TLS реально: все три пропатченных релиза теперь отвергают неканонические IP-адреса напрямую (закрывая CVE-2026-106069 и CVE-2026-106072 вместе), а не просто нормализуют их.[2][3][4]
Почему это нельзя откладывать
Три из четырёх фиксов уровня HIGH бьют по коду, который обычный Node-процесс выполняет по умолчанию: DNS-резолвинг через dns (CVE-2026-105482), верификацию TLS-сертификатов на любом https/tls-соединении (CVE-2026-105483, CVE-2026-106069) и Brotli-декомпрессию через node:zlib (CVE-2026-111497).[1] Вам не нужна нишевая фича или конкретный фреймворк, чтобы попасть в зону риска - достаточно стокового Node HTTPS-клиента или сервера, выполняющего затронутые пути.
Это также второй security-релиз с паттерном «добить фикс правильно»: CVE-2026-105482 и CVE-2026-105481 - неполные фиксы более ранних CVE, закрывавших лишь часть того же кодового пути, а CVE-2026-106074 - проблема криптографической энтропии (предсказуемые UUID / случайные значения между процессами), которую легко недооценить. Ничто из этого не закрывается правками в коде приложения - это баги уровня рантайма во встроенных зависимостях и core-модулях. Единственное действие - бамп версии.[1][5]
Переход Node 26 → Active LTS 28 октября
Есть и вторая причина делать апгрейд вдумчиво, а не второпях: релиз попадает в середину сдвига расписания Node.js, когда Node 26 становится Active LTS 28 октября 2026.[7][9]
По состоянию на этот релиз, на официальной странице релизов:[7][9]
- v26 выпущен 5 мая 2026 и сейчас в статусе Current; становится Active LTS 28 октября 2026 и достигает end-of-life 30 апреля 2029.
- v24 (Krypton, выпущена 6 мая 2025) - в Maintenance с 20 октября 2026 - её период Active-поддержки закончился именно в этот день - с end-of-life 30 апреля 2028.
- v22 (Jod, выпущена 24 апреля 2024) уже в Maintenance LTS (с октября 2025) и достигает end-of-life 30 апреля 2027.
Гайдлайн проекта однозначен: production-приложения должны использовать только Active LTS или Maintenance LTS.[7] Это важно по одной причине: если вы считали «24.22.0» своей активной production-линией, эта линейка переключилась с Active на Maintenance 20 октября - она по-прежнему получает security-фиксы (24.22.1 - ровно такой), но только критические и security-исправления, а до end-of-life осталось меньше 18 месяцев.[9] Node 26 станет Active LTS-линией через несколько дней, что делает её естественной целью апгрейда для всех, кто сейчас на 24.x или 22.x.
Смену каденции (и что значит годовой цикл начиная с Node 27) мы подробно разбираем в Node.js Annual LTS Cycle. Коротко для этого окна: 26.12.1 - это security-исправленная версия входящей Active LTS-линии - апгрейд на неё сейчас работает на два фронта: закрывает октябрьские CVE и ставит вас на линию, которая станет рекомендованной для production 28 октября.[9]
Как проверить текущую версию и обновиться на self-hosted VPS
Начните с проверки реального рантайма в production - не того, что вам кажется прописано в Dockerfile или nvmrc, а того, что реально обслуживает трафик:
# Что использует работающий процесс (pm2):
pm2 describe <app-name> | grep -i "exec cwd\|node"
node -v
# Ожидается: v26.12.1, v24.22.1 или v22.23.4 - всё остальное в зоне риска релиза Oct 2026.
Если Node управляется через nvm (самый частый сетап на однопользовательском VPS):
# Посмотреть точный набор версий и что глобально по умолчанию:
nvm ls
nvm ls-remote --lts # список от npm достаточно свежий, чтобы подтвердить последний LTS-патч
# Установить security-исправленные версии:
nvm install 26.12.1
# или, для LTS-линий под поддержкой:
nvm install 24.22.1
nvm install 22.23.4
# Переключить shell-дефолт на выбранную линию:
nvm alias default 26.12.1
Если Node стоит из прямого бинарного tarball (частый паттерн на минимальных VPS и в Dockerfile, собранных из базового образа):
# Скачать и распаковать исправленную версию (адаптируйте arch/версию):
wget https://nodejs.org/dist/v26.12.1/node-v26.12.1-linux-x64.tar.xz
sudo tar -xJf node-v26.12.1-linux-x64.tar.xz -C /usr/local --strip-components=1
node -v # подтвердить v26.12.1
Убедитесь, что бинарь реально обслуживает - бамп версии считается только когда процесс перезапустился на нём. С pm2:
pm2 startOrReload ecosystem.config.js # или: pm2 reload all
pm2 restart <app-name> # чистый рестарт, а не просто reload
pm2 describe <app-name> | grep -i uptime # убедиться, что старый pid ушёл
node -v
Для security-патча именно перезапустите (restart), а не полагайтесь на graceful reload, если хотите гарантировать новый бинарь на новых соединениях - обычный pm2 reload переиспользует воркеры; restart форкает свежие уже на новый рантайм.
Если вы обновляетесь через системные пакеты дистрибутива (например, Ubuntu nodejs), проверьте, что репозиторий действительно несёт исправленную версию, прежде чем считать, что apt upgrade решает проблему - системный Node часто оказывается старой, теперь уже уязвимой линейкой. В этом случае лучше официальный бинарь nodejs.org или nvm, чем сидеть на неисправленной сборке.
Коротко
21 октября 2026 Node.js выпустил security-релиз на 26.12.1 (Current), 24.22.1 и 22.23.4 (обе LTS), закрывающий четыре CVE уровня HIGH - CVE-2026-105482 (DNS-обрезка по NUL-байту), CVE-2026-105483 и CVE-2026-106069 (два TLS hostname bypass) и CVE-2026-111497 (out-of-bounds запись в Brotli → удалённое исполнение кода) - плюс шесть средних и низких фиксов и обновления встроенных зависимостей (c-ares, OpenSSL, SQLite, Undici, корневые сертификаты / eMudhra).[1] Три из четырёх фиксов HIGH живут в коде, который выполняет дефолтный Node-процесс, поэтому любой хост на 26.x/24.x/22.x в зоне риска, а паттерн «неполный фикс прошлых CVE» плюс CVE по криптоэнтропии делают это обязательным security-апгрейдом, а не рутинным бампом. Node 26 становится Active LTS 28 октября 2026 - 26.12.1 это security-исправленная версия входящей production-линии - пока 24.x уходит в Maintenance, а 22.x приближается к end-of-life в апреле 2027.[7][9] Проверьте через node -v, обновитесь через nvm или официальный tarball и перезапустите приложение под pm2, чтобы исправленный бинарь действительно обслуживал трафик.
Источники
- Node.js - «Wednesday, October 21, 2026 Security Releases» (security-адвайзори: релизы на 26.x/24.x/22.x; обновления зависимостей c-ares/ca-cert eMudhra/OpenSSL/SQLite/Undici; CVE 105482, 105483, 106069, 111497, 105481, 106072, 106074, 106070, 106071, 106073 с затрагиваемыми линейками). https://nodejs.org/en/blog/vulnerability/october-2026-security-releases - checked 2026-10-26
- Node.js - release notes, v26.12.1 (Current, security-релиз, 21.10.2026; c-ares 1.34.9, Undici 8.12.2, NSS 3.131.1; фиксы High CVE-2026-106069/106072, 105482, 105483, 111497; Low 106070, 106071). https://nodejs.org/en/blog/release/v26.12.1/ - checked 2026-10-26
- Node.js - release notes, v24.22.1 ‘Krypton’ (LTS, security-релиз, 21.10.2026; OpenSSL 3.5.9, c-ares 1.34.9, Undici 7.30.1, NSS 3.131.1; фиксы High 106069/106072, 105482, 105483, 111497). https://nodejs.org/en/blog/release/v24.22.1/ - checked 2026-10-26
- Node.js - release notes, v22.23.4 ‘Jod’ (LTS, security-релиз, 21.10.2026; OpenSSL 3.5.9, SQLite 3.53.4, c-ares 1.34.9, Undici 6.29.1, NSS 3.131.1; фиксы High 106069/106072, 105482, 111497; нет CVE-2026-105483). https://nodejs.org/en/blog/release/v22.23.4/ - checked 2026-10-26
- Node.js - описание CVE-2026-105482 (dns.resolve*/dns.reverse обрезка по NUL; неполный фикс CVE-2026-48930). https://nodejs.org/en/blog/vulnerability/october-2026-security-releases - checked 2026-10-26
- Node.js - описание CVE-2026-105483 (fullwidth-digit IP TLS hostname bypass; регрессия после фикса CVE-2026-48618; затрагивает 26.x/24.x). https://nodejs.org/en/blog/vulnerability/october-2026-security-releases - checked 2026-10-26
- Node.js - «Node.js Releases» (страница previous releases: v26 выпущена 05.05.2026 Current, v24 Krypton LTS выпущена 06.05.2025, v22 Jod LTS выпущена 24.04.2024; «Production applications should only use Active LTS or Maintenance LTS releases»). https://nodejs.org/en/about/previous-releases - checked 2026-10-26
- DeploySmith - Node2Shell (CVE-2026-111497): The Critical Brotli RCE and What to Patch on Your VPS (подробный разбор уязвимости Brotli, проверки и апгрейд). https://deploysmith.dev/guides/node2shell-brotli-rce-vps/ - checked 2026-10-26
- Рабочая группа nodejs/Release - расписание релизов /
schedule.json(v26 → Active LTS 28.10.2026, EOL 30.04.2029; v24 Krypton Active до 20.10.2026 затем Maintenance, EOL 30.04.2028; v22 maintenance, EOL 30.04.2027); перепроверено по endoflife.date/nodejs. https://github.com/nodejs/Release ; https://endoflife.date/nodejs - checked 2026-10-26