Node2Shell (CVE-2026-111497): jak załatać Node.js, Next.js i Bun
Node2Shell to luka w dekoderze Brotli w Node.js, przez którą spreparowane dane mogą ujawnić pamięć procesu albo uruchomić obcy kod. Dotyczy Express 5, fetch() i samodzielnie hostowanego Next.js. Naprawiają ją Node.js 22.23.4, 24.22.1 i 26.12.1 oraz Bun 1.4.4. Instrukcja i pomoc.
Spreparowane dane Brotli mogą zawiesić proces Node.js, ujawnić jego pamięć albo uruchomić obcy kod z uprawnieniami aplikacji. Pomaga tylko nowa wersja środowiska.
Syntalith
Node2Shell to luka CVE-2026-111497 w dekoderze Brotli, który Node.js ma wbudowany. Według Node.js (2026) spreparowane dane mogą spowodować zapis poza buforem pamięci i zdalne uruchomienie kodu. Node.js ocenia lukę jako wysoką. Naprawiają ją Node.js 22.23.4, 24.22.1 i 26.12.1, wydane 21 października 2026 r., oraz Bun 1.4.4.
Brotli to format kompresji, którym serwery zmniejszają ruch w sieci. Node.js rozpakowuje go sam, gdy fetch() dostaje skompresowaną odpowiedź albo gdy Express 5 przyjmuje skompresowane zapytanie. Na Node.js działa Next.js, Nuxt, NestJS i większość dzisiejszych API pisanych w JavaScripcie. Dlatego luka dotyczy wielu aplikacji, które nigdy nie wołają Brotli wprost.
Co to jest Node2Shell i jak groźna jest ta luka
Dekoder Brotli w Node.js można oszukać spreparowanymi danymi tak, że zapisze dane poza końcem bufora pamięci. To klasyczna droga do awarii procesu i do uruchomienia obcego kodu. Vercel pisze, że badacze pokazali na niezałatanych gałęziach 22.x, 24.x i 26.x ujawnienie pamięci procesu i uruchomienie poleceń w procesie Node.js. Kod działa wtedy z uprawnieniami procesu, czyli z uprawnieniami Waszej aplikacji.
Proces aplikacji Node.js zwykle trzyma w pamięci i w zmiennych środowiskowych wszystko, czego potrzebuje do pracy: hasło do bazy danych, klucze do Stripe, poczty, chmury i API modeli AI, tokeny sesji zalogowanych użytkowników. Samo ujawnienie pamięci może wystarczyć, żeby część z nich wyciekła, nawet bez przejęcia serwera.
Trzy rzeczy sprawiają, że ta luka jest groźna:
- Atak nie wymaga logowania. Wystarczy wysłać spreparowane zapytanie do serwera z Express 5 albo podstawić skompresowaną odpowiedź serwerowi, który pobiera dane z innych adresów.
- Exploit działa na oficjalnych wersjach. Imperva uruchomiła kod na oficjalnym obrazie Node.js 24.22.0 dla Linux arm64, bez żadnych modyfikacji.
- Część aplikacji nie dostanie poprawki. Gałęzie 25.x, 23.x, 20.x i starsze skończyły wsparcie.
Co może się stać z Twoją firmą: przykłady
| Co atakujący może zrobić | Co to znaczy dla firmy |
|---|---|
| Odczytać z pamięci hasło do bazy i skopiować bazę klientów | Wyciek danych osobowych, zgłoszenie do UODO, list do każdego klienta |
| Wyciągnąć klucze API: płatności, poczty, chmury, modeli AI | Rachunki za cudze użycie, wysyłka phishingu z Waszej domeny |
| Przejąć tokeny sesji zalogowanych użytkowników | Ktoś działa w panelu jako Wasz klient albo administrator |
| Uruchomić polecenia na serwerze aplikacji | Zmiana cen, zamówień i danych, tylne drzwi w kodzie, okup |
| Zawiesić proces Node.js powtarzanym zapytaniem | Sklep albo aplikacja przestaje działać, dopóki ktoś nie zareaguje |
Wyciek danych klientów ma też skutki prawne. Według RODO (2016) firma ma 72 godziny od wykrycia naruszenia na zgłoszenie go organowi nadzorczemu, w Polsce UODO. Według RODO (2016) za naruszenie obowiązków bezpieczeństwa i zgłaszania grozi kara do 10 mln euro albo do 2% całkowitego rocznego obrotu, zależnie od tego, która kwota jest wyższa. Źródło: RODO, rozporządzenie 2016/679, art. 33 i art. 83 ust. 4.
Node2Shell w liczbach: statystyki 2026
Dane sprawdziliśmy 23 października 2026 r.
- Według W3Techs (2026) Node.js obsługuje 7,4% stron internetowych, których serwer da się ustalić.
- Według W3Techs (2026) Next.js, działający na Node.js, jest na 3,7% wszystkich stron internetowych.
- Według Vercel (2026) te same wydania Node.js naprawiają 9 innych błędów, w tym 2 wysokie obejścia weryfikacji nazwy serwera w TLS.
- Według Imperva (2026) atak zadziałał na Express od 5.0.0 do 5.3.0 i body-parser od 2.0.0 do 2.3.0, choć wymagał kilku prób.
- Według Aikido (2026), powołującego się na The Hacker News, do 22 października nie zgłoszono ataków poza laboratoriami.
Źródła: Node.js, wydania bezpieczeństwa z 21 października 2026, Vercel, W3Techs, Node.js, W3Techs, Next.js, Imperva, Aikido.
Next.js, Express i fetch(): którędy wchodzi atak
Vercel zaznacza, że Node.js sam nie rozpakowuje danych Brotli. Aplikacja jest narażona, gdy jej kod albo biblioteka rozpakowuje dane Brotli kontrolowane przez atakującego. Typowe drogi:
| Droga | Kiedy jest groźna |
|---|---|
| Express 5 i body-parser 2.x | Rozpakowują ciała zapytań z nagłówkiem Content-Encoding: br, który może wysłać każdy klient |
fetch() | Rozpakowuje odpowiedzi Brotli automatycznie, więc groźne są webhooki i adresy podane przez użytkownika |
| Next.js hostowany samodzielnie | Według Vercel Next.js nie blokuje odpowiedzi Brotli w optymalizacji obrazów, która pobiera obrazy z innych serwerów |
node:zlib | Każde niezaufane dane przekazane do funkcji Brotli w tym module |
Next.js na Vercel: gałęzie 22.x i 24.x aktualizuje sam Vercel, a jego WAF blokuje atak w zapytaniach przychodzących. Projekty na Node.js 20.x muszą zmienić wersję na 22.x albo 24.x i wdrożyć się ponownie. Next.js na własnym serwerze, w Dockerze albo u innego dostawcy trzeba zaktualizować samemu.
Które wersje Node.js są podatne, a które naprawione
| Gałąź | Status | Wersja z poprawką |
|---|---|---|
| Node.js 26.x | Bieżąca | 26.12.1 |
| Node.js 24.x | Długie wsparcie (LTS) | 24.22.1 |
| Node.js 22.x | Długie wsparcie (LTS) | 22.23.4 |
| Node.js 25.x, 23.x, 20.x i starsze | Koniec wsparcia | Brak |
| Bun | Bieżąca | 1.4.4 |
Te same wydania Node.js aktualizują też certyfikaty główne i usuwają zaufanie do skompromitowanych certyfikatów eMudhra, więc jedna aktualizacja zamyka oba problemy.
Jeśli Node.js pochodzi z paczki dystrybucji Linuksa, na przykład Debiana, Ubuntu, Fedory albo Alpine, może korzystać z systemowej biblioteki Brotli. Wtedy poprawka przychodzi z paczką Brotli dystrybucji. Projekt Brotli wydał tę samą poprawkę w wersjach 1.2.1, 1.1.1 i 1.0.10.
Jak załatać Node2Shell: instrukcja krok po kroku
- Sprawdź
node --versionna serwerach, w CI, na laptopach zespołu i w każdym obrazie kontenera. - Zaktualizuj Node.js do 22.23.4, 24.22.1 albo 26.12.1, zależnie od gałęzi.
- Zmień przypięte tagi obrazów. Obraz przypięty do
node:24.22.0pozostaje podatny przy każdej przebudowie. - Przebuduj obrazy i wdroż usługi ponownie.
- Sprawdź wersję w działających kontenerach na produkcji.
- Zaktualizuj Bun do 1.4.4 lub nowszego.
- Przenieś aplikacje z Node.js 25.x, 23.x, 20.x i starszych na wspieraną gałąź i uruchom testy.
Polecenia:
node --version # serwer, laptop, maszyna w CI
docker run --rm <obraz> node --version # każdy obraz kontenera
npm ls express body-parser # Express 5 i body-parser 2.x
grep -rn "brotliDecompress\|createBrotliDecompress" src/ # wywołania Brotli w kodzie
docker build --pull --no-cache -t <obraz> . # przebudowa na nowej bazie
Lista paczek w repozytorium może pominąć Node.js wbudowany w obraz, więc sprawdzaj wersję w samym obrazie. Platformy, które dostarczają własny Node.js, mogą spóźniać się z aktualizacją. Sprawdź, jaką wersję uruchamia Twój dostawca.
Co zrobić, jeśli nie możesz zaktualizować dziś
Komunikat Node.js nie podaje obejścia. Aikido opisuje dwa sposoby na zmniejszenie ryzyka:
- Odrzucaj zapytania z nagłówkiem
Content-Encoding: brna reverse proxy, load balancerze albo w middleware aplikacji. - Włącz reguły na brzegu sieci, jeśli platforma je ma. Vercel dodał takie reguły 21 października, Imperva dodała własne reguły WAF.
Żaden z tych sposobów nie chroni odpowiedzi Brotli, które aplikacja pobiera z innych serwerów. Vercel pisze wprost, że pobrane odpowiedzi chroni tylko aktualizacja środowiska.
Jak Syntalith pomaga załatać Node2Shell
Zrobiliśmy to już u siebie. 23 października przenieśliśmy naszą stronę na Next.js, system rezerwacji i serwer MCP na Node.js 24.22.1, a potem sprawdziliśmy wersję w działających kontenerach.
U klientów robimy to samo, od listy usług po sprawdzenie wyniku. Najpierw spisujemy Node.js i Bun na serwerach, w CI, w obrazach kontenerów i u dostawców platform. Potem aktualizujemy w pierwszej kolejności usługi, które przyjmują zapytania z internetu albo pobierają dane z obcych serwerów, w tym Next.js hostowany samodzielnie. Zmieniamy przypięte tagi obrazów, przebudowujemy i wdrażamy ponownie. Aplikacje z Node.js 20.x, 23.x i 25.x przenosimy na wspieraną gałąź i sprawdzamy testami, czy działają.
Na koniec sprawdzamy wersję w środowisku produkcyjnym i dajemy raport na piśmie: co było podatne, co zaktualizowaliśmy, co zostało. Pracujemy na Waszej infrastrukturze, z dostępami tylko na czas zadania.
Zacznij od bezpłatnej, 30-minutowej rozmowy z inżynierem. Powiedz, gdzie działa Node.js, a my powiemy, od czego zacząć i ile to potrwa. Umów rozmowę.
W tym samym tygodniu pojawiły się luki PHP2Shell w PHP i problem z certyfikatami eMudhra.
Najczęstsze pytania
- Co to jest Node2Shell?
- Node2Shell to nazwa luki CVE-2026-111497 w dekoderze Brotli wbudowanym w Node.js. Spreparowane dane Brotli powodują zapis poza buforem pamięci. Badacze pokazali ujawnienie pamięci procesu i uruchomienie poleceń w procesie Node.js. Node.js ocenia lukę jako wysoką.
- Które wersje Node.js naprawiają CVE-2026-111497?
- Node.js 22.23.4, 24.22.1 i 26.12.1 oraz nowsze wydania tych gałęzi. Bun naprawia lukę w wersji 1.4.4. Node.js 25.x, 23.x, 20.x i starsze nie dostaną poprawki.
- Czy Next.js jest podatny na Node2Shell?
- Next.js działa na Node.js. Vercel zaznacza, że Next.js nie blokuje odpowiedzi Brotli w optymalizacji obrazów, więc samodzielnie hostowany Next.js trzeba przenieść na Node.js z poprawką. Na Vercel gałęzie 22.x i 24.x aktualizuje sam Vercel, a projekty na 20.x muszą zmienić wersję.
- Czy Express i body-parser są podatne?
- Express 5 i body-parser 2.x rozpakowują ciała zapytań z nagłówkiem Content-Encoding: br, więc przekazują dane do podatnego dekodera. Sama luka siedzi w Node.js, więc naprawia ją aktualizacja Node.js.
- Czy Syntalith może zaktualizować nasze usługi Node.js?
- Tak. Inżynier spisuje wersje Node.js na serwerach, w CI i w obrazach, aktualizuje je, przebudowuje obrazy i sprawdza wersję działającą na produkcji. Zaczynamy od bezpłatnej, 30-minutowej rozmowy.
Aktualizacje bezpieczeństwa
Nie wiesz, czy Wasze serwery są już załatane?
Powiedz inżynierowi w 30 minut, gdzie działają strona, sklep i aplikacje. Spiszemy podatne wersje, zaktualizujemy je, wdrożymy usługi ponownie i sprawdzimy wynik na produkcji.
- Rozmowa z inżynierem
- 0 zł30 minut, plan prac na piśmie w 2 dni robocze
- Zakres
- PHP, Node.js, Go, certyfikatyserwery, kontenery, hosting i CI
- Na koniec
- raport na piśmieco było podatne, co zaktualizowaliśmy, co zostało
Terminy zobaczysz w swojej strefie czasowej.
Poznaj inżynierów, którzy wykonają pracę