Node2Shell: RCE в декодере Brotli затрагивает Node.js, .NET и Python

Уязвимость в библиотеке сжатия Brotli от Google позволяет атакующим выполнять произвольный код в приложениях, которые используют уязвимый декодер для обработки сжатых данных. Ошибка получила идентификатор CVE-2026-111497 и высокую степень опасности. Впервые её обнаружили в декодере Brotli, встроенном в Node.js, но зона поражения оказалась шире: под удар попали .NET от Microsoft и два пакета Python.

Проблема вызвана записью за границами буфера (out-of-bounds write), которая может повредить память процесса. Последствия — удалённое выполнение кода (RCE), раскрытие информации или отказ в обслуживании (DoS). Проект Node.js раскрыл сведения об уязвимости 21 октября 2026 года вместе с обновлениями безопасности для веток 22.x, 24.x и 26.x. Microsoft 25 октября выпустила внеплановые обновления для .NET, чтобы закрыть тот же CVE в своей реализации распаковки Brotli. Отдельное исследование OpenSourceMalware выявило уязвимый код декодера в пакетах Python Brotli и brotlicffi; исправленные версии обоих уже вышли.

Риск зависит от того, использует ли приложение уязвимый декодер для обработки Brotli-данных, контролируемых атакующим. Выполнение кода продемонстрировали в публичном proof-of-concept (PoC) на GitHub, а также независимо в компании Imperva, которая и дала уязвимости имя Node2Shell. Особенно подвержены сервисы, распаковывающие недоверенные HTTP-ответы или тела запросов. Исследователи также напоминают: учитывать нужно среды выполнения и библиотеки, встроенные в контейнеры и артефакты развёрнутых приложений.

Неверный блок в потоке уводит декодер за границы

Brotli — алгоритм сжатия без потерь, который уменьшает объём данных, передаваемых между приложениями и серверами. Node2Shell возникает из-за того, как декодер обрабатывает недопустимый переход типа блока в сжатом потоке. Согласно PoC на GitHub, уязвимая функция DecodeBlockTypeAndLength() может вернуть неоднозначное значение ошибки, когда поток запрашивает неверное переключение блока. Быстрый путь декодера не обрабатывает это возвращаемое значение должным образом, и обработка продолжается с некорректным внутренним состоянием. Итоговая запись за границы буфера повреждает память. Слабость сочетает непроверенное возвращаемое значение (CWE-252) с записью за границами буфера (CWE-787).

PoC нацелен на уязвимую сборку Node.js 24.22.0 для Linux x86-64. Эксплойт опирается на конкретную бинарную раскладку и организацию памяти, а его выполнение вероятностное — в некоторых случаях требуются повторные попытки. В том же репозитории показано, что тот же запрос не срабатывает против исправленной сборки Node.js 24.22.1: её декодер отвергает недопустимое переключение блока.

Уязвимость обнаружили при тестировании безопасности исследователи Khai Tran и Sylvie Mayer из OpenAI Codex Security, которые сообщили о ней проекту Node.js.

Какие версии закрывают дыру

Проект Node.js выпустил исправления в версиях 22.23.4, 24.22.1 и 26.12.1. Администраторам следует обновиться до соответствующего исправленного выпуска или более позднего обновления безопасности, пересобрать затронутые образы контейнеров и повторно развернуть приложения, в которые встроены уязвимые среды выполнения. Версии Node.js с истёкшей поддержкой тоже нужно считать уязвимыми и переводить на поддерживаемые выпуски.

Внеплановые обновления Microsoft от 25 октября закрывают CVE-2026-111497 в .NET 8, 9 и 10, а также в .NET 11 Release Candidate 3. Соответствующие версии среды выполнения — 8.0.33, 9.0.22 и 10.0.14, для предварительной ветки — 11.0.0-rc.3.26522.148. Обновлённые SDK также доступны. Приложения с self-contained-развёртыванием или Native AOT при необходимости нужно пересобрать и развернуть заново: обновление только общей среды выполнения не заменит декодер, уже слинкованный в исполняемый файл.

Сопровождающие Python тоже выпустили исправления. OpenSourceMalware определила исправленные релизы: Brotli 1.2.1 и brotlicffi 1.2.1.0. Они заменяют уязвимые версии до 1.2.0 и 1.2.0.2 соответственно. Разработчикам стоит обновить зависимости и убедиться, что в развёрнутых окружениях используются исправленные версии.

Google также выпустила исправленные версии своей библиотеки Brotli — 1.0.10, 1.1.1 и 1.2.1, где устранена первопричина. На момент публикации сообщений об эксплуатации Node2Shell в реальных атаках не было, хотя код PoC доступен уже несколько дней.

Что делать администратору

  • Проверьте, какие версии Node.js, .NET и пакетов Python Brotli/brotlicffi используются в приложениях и контейнерах.
  • Обновите Node.js до 22.23.4, 24.22.1 или 26.12.1 и новее; .NET — до 8.0.33, 9.0.22, 10.0.14 или 11.0.0-rc.3.26522.148; Python-пакеты — до Brotli 1.2.1 и brotlicffi 1.2.1.0.
  • Пересоберите образы контейнеров и переразверните приложения, особенно с self-contained-развёртыванием и Native AOT.
  • Переведите Node.js с истёкшей поддержкой на поддерживаемые выпуски.

Смежная история уже разворачивалась в экосистеме PHP: для Windows вышла экстренная пересборка 8.2–8.5 из-за RCE в Brotli (CVE-2026-111497), о чём мы писали в материале PHP для Windows: экстренная пересборка 8.2–8.5 из-за RCE в Brotli. Внеплановые обновления в этом месяце выпускала и Microsoft — в материале Microsoft закрыла 398 уязвимостей: 0-day в драйвере Windows уже атакуют разобрано, как вендор закрывает дыры вне обычного графика. Похожая картина и с библиотеками в цепочке поставок: Rust-атака на crates.io: вредонос в трёх популярных крейтах с 245 млн загрузок показывает, почему зависимости и встроенные в сборки компоненты нужно проверять не реже самих приложений.

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

Кого касается Node2Shell?

Всех, кто использует уязвимый декодер Brotli для обработки недоверенных данных: сервисы на Node.js, приложения .NET и проекты на Python с пакетами Brotli или brotlicffi. Особенно сервисы, распаковывающие HTTP-ответы или тела запросов от внешних источников.

Как проверить, уязвима ли моя версия Node.js?

Сравните версию с исправленными: 22.23.4, 24.22.1 и 26.12.1. Всё, что ниже, считается уязвимым. Версии с истёкшей поддержкой тоже нужно считать уязвимыми.

Какие версии .NET нужно обновить?

Внеплановые обновления закрывают CVE-2026-111497 в .NET 8, 9, 10 и .NET 11 Release Candidate 3. Исправленные версии среды выполнения — 8.0.33, 9.0.22, 10.0.14 и 11.0.0-rc.3.26522.148.

Достаточно ли обновить общую среду выполнения .NET?

Нет. Для приложений с self-contained-развёртыванием или Native AOT обновление только общей среды выполнения не заменит декодер, уже слинкованный в исполняемый файл. Такие приложения нужно пересобрать и развернуть заново.

Какие версии Python-пакетов исправлены?

Brotli 1.2.1 и brotlicffi 1.2.1.0. Они заменяют уязвимые версии до 1.2.0 и 1.2.0.2 соответственно.

Какие версии самой библиотеки Brotli закрывают дыру?

Google выпустила исправления в версиях 1.0.10, 1.1.1 и 1.2.1 — там устранена первопричина ошибки в декодере.

Есть ли эксплуатация в реальных атаках?

На момент публикации сообщений об эксплуатации Node2Shell в реальных атаках не было, хотя PoC-код доступен уже несколько дней. Это не отменяет необходимости обновиться.

Что делать, если обновиться нельзя?

В доноре прямых рекомендаций для этого случая нет. Как минимум стоит исключить обработку недоверенных Brotli-данных уязвимым декодером и ускорить переход на исправленные версии. Помните, что PoC уже публичен.

Насколько сложно эксплуатировать уязвимость?

Эксплойт в PoC опирается на конкретную бинарную раскладку и организацию памяти, а выполнение вероятностное — иногда нужны повторные попытки. Тем не менее RCE продемонстрировано публично и независимо в Imperva.

Источник: csoonline.com