
Node2Shell (CVE-2026-111497): RCE przez dekompresję Brotli w Node.js
Odkryto krytyczną podatność CVE-2026-111497 w popularnym środowisku Node.js, która umożliwia zdalne wykonanie kodu (RCE) poprzez dekompresję danych skompresowanych algorytmem Brotli.
Ostatnie dni były szczególnie intensywne dla cyberbezpieczeństwa. Po serii innych zagrożeń, w tym podatności w PHP, BIND i GitLab, odkryto kolejną - krytyczną lukę w Node.js oznaczoną jako CVE-2026-111497. Pozwala ona na zdalne wykonanie kodu (RCE) poprzez dekompresję danych skompresowanych algorytmem Brotli.
Brotli to opracowany w Google, upubliczniony w 2015 roku algorytm kompresji bezstratnej, który miał zastąpić gzip/zlib. Integruje on trzy mechanizmy - LZ77, kodowanie Huffmana oraz statyczny słownik zoptymalizowany pod HTML/CSS/JS/JSON. Node.js, popularne środowisko uruchomieniowe JavaScript, wykorzystuje tę bibliotekę, co czyni go podatnym na atak.
Wersje podatne
Podatność dotyczy wielu wersji Node.js. Dla samej biblioteki Brotli, linię 1.2.x należy zaktualizować do wersji 1.2.1, linię 1.1.x do 1.1.1, a linię 1.0.x do 1.0.10. W przypadku Node.js, wersje podatne to:
- 26.x przed 26.12.1 → aktualizacja do 26.12.1
- 24.x przed 24.22.1 → aktualizacja do 24.22.1
- 22.x przed 22.23.4 → aktualizacja do 22.23.4
- 25.x, 23.x, 20.x i starsze – wszystkie podatne (EOL, brak poprawki)
Warto pamiętać, że przy pakietach niektórych dystrybucji, linkowana jest wersja systemowa libbrotli, a nie Node.js, i to właśnie ją należy zaktualizować.
Mechanizm ataku
Zapytania kompresowane przez Brotli można rozpoznać przez wartość nagłówka Content-Encoding ustawioną na 'br'. Podatność może wystąpić nie tylko przez jawne wywołania dekompresji, ale także przez wbudowane funkcje jak fetch() czy biblioteki jak Express 5. To znacznie poszerza zakres podatnych aplikacji.
Przyczyną podatności był błąd w obsłudze przełączenia bloku w dekoderze Brotli. Gdy w strumieniu danych występuje tylko jeden typ bloku (NBLTYPES == 1), poprawna implementacja powinna odrzucić taki nieprawidłowy strumień. Jednak podatny kod pozwalał na kontynuowanie przetwarzania, co mogło prowadzić do wykonania kodu atakującego.
VULNERABILITY: a block switch is impossible when only one block type was declared. The decoder returns BROTLI_FALSE, which the fast path ignores (void wrappers) and the safe path reads as NEEDS_MORE_INPUT, so decoding continues with inconsistent state instead of failing on a format error.
Skala i konsekwencje
Początkowo błąd został określony jako memory leak i DoS, jednak Imperva Red Team udowodniła, że wpływ może być wyższy - zaprezentowała działającego exploita prowadzącego do RCE na domyślnych obrazach Node.js dla architektury arm64. Exploit działa niedeterministycznie, ale to wystarczający dowód na konieczność natychmiastowego zabezpieczenia systemów.
Niestety, narzędzia AI skracają czas powstania exploitów, co sprawia, że nawet osoby bez głębokiej wiedzy technicznej mogą uzyskać niebezpieczne narzędzia. To zwiększa ryzyko masowego wykorzystania tej luki w krótkim czasie.
Jedyną pełną ochroną jest natychmiastowa aktualizacja Node.js do bezpiecznych wersji. Warto również monitorować sygnatury ataków, ponieważ pojawiły się już metody fingerprintowania podatnych serwerów.