Node2Shell: что проверить в Node.js, HTTP и .NET

Безопасность

Node2Shell: что проверить в Node.js, HTTP и .NET

Node2Shell что проверить: уязвимость декодера Brotli CVE-2026-111497 в Node.js, HTTP и .NET

Во вторник CISA подтвердила атаки на CVE-2026-111497 (Node2Shell), уязвимость в декодере Brotli, и внесла её в каталог KEV. В случае с Node2Shell что проверить первым делом? Не конкретный продукт, а каждое место, где ваш стек распаковывает чужие сжатые данные.

Коротко

  • CVE-2026-111497 (Node2Shell) уже эксплуатируют: CISA во вторник внесла её в KEV, срок для ведомств США 10 ноября 2026 года.
  • Уязвим декодер Brotli в Node.js, .NET, HTTP-серверах, прокси и клиентах; аутентификация атакующему не нужна.
  • Блокировка Brotli на прокси временна. После патча перезапустите процессы и пересоберите образы: рестарт контейнера старую библиотеку не убирает.

Дедлайн 10 ноября: кого он касается юридически

Директива BOD 26-04 обязывает федеральные гражданские ведомства США закрыть CVE-2026-111497 до 10 ноября 2026 года. Остальных она не касается, но CISA просит всех защитников поставить исправление в начало очереди.

Как и с PHP2Shell и проверкой самого рантайма, обновлять приходится нижний слой стека: рантайм и библиотеки, а не прикладной код.

Что известно об ошибке в декодере Brotli

Node2Shell, Broccoli2Shell и HTTP2Shell: три имени одной ошибки в декодере Brotli (алгоритм сжатия без потерь от Google). Учётные данные злоумышленнику не нужны, хватает специально собранного сжатого потока. Итог бывает разным: падение процесса, утечка памяти, а иногда и выполнение кода.

Кто атакует, сколько жертв, какие версии уязвимы и исправлены, каков балл CVSS, не раскрыто. Известно лишь, что уязвимость критическая.

BleepingComputer называет баг out-of-bounds write, а CISA пишет о непроверенном возвращаемом значении (unchecked return value), из-за которого портится соседняя память состояния декодера. Для оценки надёжности эксплуатации разница существенна.

С Node2Shell что проверить в первую очередь?

Искать надо декодер, а не «уязвимый сайт». Ошибку впервые нашли в Node.js, но она есть везде, где встроена уязвимая реализация Brotli: в HTTP-серверах, прокси, балансировщиках и клиентах.

Встроенный HTTP-сервер Node.js сам не распаковывает тела запросов. Риск появляется там, где код или middleware вызывает zlib.brotliDecompress либо createBrotliDecompress, и там, где HTTP-клиент автоматически распаковывает ответы чужого сервера.

  • Node.js. Декодер входит в сам рантайм, поэтому npm audit его не покажет. Версии в работающем контейнере выводит «docker exec <контейнер> node -p process.versions», сверяйте их с бюллетенем Node.js.
  • npm-пакеты с нативными или wasm-сборками Brotli. Манифест не покажет встроенную копию библиотеки, нужен сканер, который смотрит внутрь пакетов.
  • HTTP-слой. Выясните, кто обрабатывает Content-Encoding: br. Клиент может пострадать от ответа вредоносного сервера.
  • .NET. В воскресенье Microsoft выпустила экстренное обновление и предупредила о повышении привилегий на системах с уязвимой версией .NET. Номеров версий в опубликованных данных нет, сверяйтесь с бюллетенем Microsoft. Если сервисы сопровождает подрядчик по разработке на .NET, предупредите его отдельно.

Что делать, если патч нельзя выкатить сразу?

Заблокировать входящие запросы со сжатием Brotli на прокси или файрволе либо отключить декодирование Brotli. CISA предлагает это только до обновления, патч такая мера не заменяет.

Запрет на главном прокси не закрывает прямой доступ к origin, запасные входы, внутренние сервисы и исходящие HTTP-клиенты. Если прокси пересылает поток br на бэкенд как есть, риск просто переходит туда.

Не проверяйте уязвимость чужими PoC на проде: упавший процесс оборвёт свои соединения. Нужен стенд с той же архитектурой и рантаймом. Сохраните логи и crash-дампы до повторного развёртывания.

Почему рестарт контейнера не закрывает CVE-2026-111497

После патча CISA советует перезапустить процессы с уязвимым Brotli, а затем пересобрать и заново развернуть контейнерные образы. Копия, зашитая в образ или статически слинкованная в бинарник, от обновления хоста не меняется: рестарт пода поднимет тот же уязвимый код.

Контроль, который стоит встроить в CI/CD:

  1. SBOM на каждую сборку (например, через Syft) рядом с образом;
  2. сканер вроде Grype или Trivy, который прерывает сборку с ненулевым кодом при критической находке;
  3. пересборка образов с обновлённой базой по расписанию;
  4. сверка версий node и .NET в работающих контейнерах, а не в Dockerfile.

Если пайплайн пока так не умеет, это задача для команды DevOps. Её можно отдать на услуги DevOps.

Частые вопросы

Node2Shell, Broccoli2Shell и HTTP2Shell это разные уязвимости?

Нет, это три имени одной ошибки в декодере Brotli, CVE-2026-111497.

До какой даты CISA требует устранить CVE-2026-111497?

Федеральным ведомствам США до 10 ноября 2026 года по директиве BOD 26-04. Остальным CISA советует закрыть уязвимость в первую очередь.

Найдёт ли npm audit уязвимый Brotli в Node.js?

Нет, npm audit проверяет пакеты, а не рантайм. Версию рантайма смотрите командой «node -p process.versions» и сверяйте с бюллетенем Node.js.

Достаточно ли перезапустить контейнер после обновления?

Нет. Рестарт поднимет ту же копию библиотеки, что зашита в образ, поэтому образы нужно пересобрать и развернуть заново.

Если нужно быстро найти все копии Brotli в вашем контуре и убедиться, что патч применён во всех рабочих окружениях, команда HirexTech поможет: от инвентаризации до регулярного сканирования и оценки уязвимостей.

Прокрутить вверх