Реагирование на Node2Shell: путь распаковки Brotli и проверка развёртывания Node.js
На этой странице
Устранение Node2Shell означает замену Node.js исправленной средой исполнения и проверку её использования каждым воркером, распаковывающим недоверенные данные Brotli. Уведомление Node.js о безопасности определяет CVE-2026-111497 как запись за границами буфера во встроенном декодере Brotli. Обновление npm-пакетов и замена среды исполнения — отдельные операции.
Одинакова ли подверженность при любом использовании Brotli?
Значимый путь распаковывает сжатые входные данные. Некорректные данные Brotli от злоумышленника, обрабатываемые node:zlib, могут повредить память процесса и привести к сбоям, раскрытию памяти или удалённому выполнению кода. Одно лишь сжатие исходящих ответов Brotli или включение HTTP/2 не устанавливает наличие этого пути. Проект Node.js относит проблему к уровню High.
Проследите автоматическую распаковку внешних HTTP-ответов, загрузок, файлов и заданий очередей, а также тел запросов. Например, документация body-parser описывает автоматическую распаковку Brotli. Проверьте установленную версию промежуточного ПО и его параметры; отсутствие найденного brotliDecompress в коде приложения не доказывает отсутствия подверженности. Фоновое задание может распаковывать внешние данные, не имея порта, доступного из интернета.
Какие выпуски Node.js содержат исправление?
Следующая таблица, проверенная 30 октября 2026 года, перечисляет официальные выпуски безопасности с исправлением этой CVE. Она не закрепляет последнюю рекомендуемую версию. При развёртывании проверяйте поддерживаемый выпуск того же поставщика и последующие уведомления.
| Ветка Node.js | Официальный исправленный выпуск |
|---|---|
| 22.x | 22.23.4 |
| 24.x | 24.22.1 |
| 26.x | 26.12.1 |
Для сборок дистрибутивов, встроенных продуктов или собственных сборок используйте полную ревизию пакета поставщика и свидетельства исправления. Не применяйте эти числовые пороги к другой основной ветке. Уведомление Node.js также считает затронутыми ветки с истёкшим сроком поддержки; отсутствие в таблице не означает безопасность.
В частности, одного process.versions.brotli недостаточно. Исходный файл версии Brotli в исправленном Node.js 24.22.1 по-прежнему объявляет 1.2.0. Запись о выпуске прямо перечисляет перенесённое отдельным коммитом исправление. Установите происхождение исправленного артефакта среды исполнения вместо того, чтобы полагаться на метку библиотеки.
Запись сведений из самого процесса
Схема соответствует запуску приложения из примера ниже. Оно читает информацию внутри того же процесса и выводит JSON без сравнения версий, поиска сервисов или определения наличия исправления. Вывод нового запуска CLI не заменяет сведения из существующего сервиса.
При использовании Node.js 22 или новее сохраните эти два файла в новом каталоге. Они читают свойства, описанные в справочнике process, без сетевых запросов, распаковки и вывода переменных окружения.
runtime-evidence.mjs
export function runtimeEvidence() {
return {
scope: 'this-process-only',
pid: process.pid,
executable: process.execPath,
node: process.version,
brotliLabel: process.versions.brotli ?? null,
platform: process.platform,
arch: process.arch,
};
}
app.mjs
import {runtimeEvidence} from './runtime-evidence.mjs';
console.log(JSON.stringify(runtimeEvidence(), null, 2));
node app.mjs
Локальная проверка использовала официальный контейнер Node.js 24.22.1 и вернула JSON, где node равно v24.22.1, а brotliLabel — 1.2.0. PID, путь, ОС и архитектура зависят от среды. Это показывает, что исправленная сборка может сохранять старую метку Brotli; эксплуатация или рабочее развёртывание здесь не проверяются.
Для настоящего сервиса добавьте аналогичное журналирование при запуске через его процесс развёртывания и ограничьте доступ к этим эксплуатационным журналам. Свяжите запись с менеджером сервисов, процессом и хешем образа. Пути и PID не должны попадать в публичные HTTP-ответы. Запуск отдельного диагностического процесса не проверяет замену существующих воркеров.
Что остаётся после установки пакета?
- Зафиксируйте исполняемый файл Node.js каждого сервиса, поставщика, полную версию пакета или хеш образа, процессы, воркеры и реплики. Одного
node -vна хосте или тега в Dockerfile недостаточно, чтобы установить среду исполнения работающего контейнера. - Проследите библиотеки, связывающие входные данные с декодером Brotli. Учитывайте наличие исправления среды исполнения отдельно от подверженности входных данных. Если в пределах исследования путь распаковки не обнаружен, неисправленная среда от этого не становится исправленной.
- Получите совместимую исправленную среду исполнения через доверенный канал. Пересоберите и разверните образы контейнеров; замените также фактический исполняемый файл, используемый менеджерами процессов и управляемыми платформами. Не предполагайте, что обновление системной библиотеки Brotli заменяет встроенную копию.
- Проверьте новые сведения о работающем процессе для каждого воркера и реплики, затем проверьте обычные вызовы API, обработку внешних ответов, фоновые задания и частоту ошибок. Замена установочных файлов или оставленные работающие старые реплики не подтверждают переход на исправленную версию.
Если установка исправления откладывается, рассмотрите запрет или обход распаковки недоверенного Brotli на фактическом пути данных. Одно лишь удаление br из Accept-Encoding не блокирует все пути ввода. Успешный цикл сжатия и распаковки корректных данных или чистый результат npm audit также не доказывают устранение этой CVE.
Это та же проблема, что и PHP2Shell?
Это разные дефекты. Две CVE PHP2Shell касаются состояния запросов движка PHP; Node2Shell касается декодера Brotli. При этом та же CVE Brotli может встречаться в других продуктах, поэтому следуйте уведомлению каждого продукта. Руководство по реагированию на PHP2Shell объясняет различие между пересборкой PHP для Windows с Brotli и исправлениями движка PHP.
Один сбой процесса не доказывает компрометацию, а отсутствие следов не исключает её. При подозрении на компрометацию сохраните свидетельства в месте с ограниченным доступом и проведите расследование или пересборку из доверенного источника отдельно от установки исправлений.
Обсуждение