HTTP2Shell (CVE-2026-111497): co luka RCE w Brotli oznacza dla Twoich aplikacji w chmurze

Jerzy Kopaczewski 24 października 2026 7 min czytania
Contents
21 października 2026 ujawniono krytyczną lukę w bibliotece kompresji Brotli od Google, oznaczoną jako CVE-2026-111497 i początkowo nazwaną Node2Shell. Do 24 października, po tym jak OpenAI opisało znalezienie jej podczas ćwiczenia red-teamingowego, branża przemianowała ją na HTTP2Shell - gdy stało się jasne, że luka sięga daleko poza Node.js: dotyka niemal wszystkiego, co dekompresuje niezaufane dane Brotli, zwykle przez HTTP. Może pozwolić nieuwierzytelnionemu atakującemu na zdalne wykonanie kodu. Jeśli Twoje aplikacje dekodują Content-Encoding: br ze źródeł, których nie kontrolujesz, załóż, że jesteś w zakresie i załataj wersję Brotli w swoich obrazach i runtime'ach już teraz.

Czym jest HTTP2Shell

HTTP2Shell (oraz wcześniejsza nazwa Node2Shell) to przydomek dla CVE-2026-111497, zapisu poza zakresem bufora (out-of-bounds write) w dekoderze Brotli od Google. Spreparowany, skompresowany strumień Brotli może zapisać dane poza końcem bufora i uszkodzić pamięć procesu. Zależnie od warunków prowadzi to do awarii, wycieku pamięci albo wykonania kodu kontrolowanego przez atakującego. Google jest autorem CVE dla Brotli; rekord CVE ocenia lukę jako krytyczną.

Dwie rzeczy czynią ją groźną w praktyce:

  • Brak wymaganego uwierzytelnienia. Atakującemu wystarczy dostarczyć złośliwy strumień Brotli przed proces, który go dekoduje. To normalny przepływ sieci.
  • Dekodowanie Brotli jest często automatyczne i niewidoczne. Klienci i serwery HTTP negocjują Content-Encoding: br i rozpakowują treść za Ciebie. Jeśli Twój kod woła zewnętrzne API, pobiera adres URL albo przyjmuje skompresowane uploady, możesz dekodować Brotli pod wpływem atakującego bez ani jednej linii kodu w Twojej aplikacji, która dotyczy Brotli.

Luka została wprowadzona do źródeł Brotli w lutym 2026, a jako poprawka bezpieczeństwa trafiła dopiero w październiku - w tym czasie szerokie grono oprogramowania zdążyło ją przejąć.

Dlaczego to problem chmury i kontenerów, nie tylko Node

Pierwsze ujęcie brzmiało “błąd w Node.js”, bo Node dołącza Brotli i załatał je 21 października. Ale biblioteka jest współdzieloną zależnością w całym stosie - i właśnie dlatego nazwa zmieniła się na HTTP2Shell. Dotknięte i już załatane oprogramowanie obejmuje Node.js, Pythona, Bun, curl, Envoy, libbrotli i brotlicffi, a kolejne będą dochodzić.

Dla zespołu utrzymującego środowiska w chmurze to właśnie ten zasięg jest prawdziwym problemem. Brotli nie istnieje w jednym miejscu, które dałoby się wskazać. Jest:

  • Wbudowane w obrazy kontenerów - obraz bazowy albo runtime języka w Twoim Dockerfile może nieść podatne libbrotli, którego nigdy świadomie nie wybrałeś.
  • Wciągane tranzytywnie - zależność zależności, kilka warstw w głąb Twojego lockfile, bez bezpośredniej wzmianki w Twoim manifeście.
  • Obecne w ingressie i service mesh - Envoy (a więc i część bram API oraz sidecarów mesh zbudowanych na nim) dekoduje Brotli. Proxy, które terminuje albo prześwietla skompresowany ruch, też jest dekoderem.
  • Wewnątrz zarządzanych i zewnętrznych komponentów, których nie budowałeś, wszędzie tam, gdzie przyjmują skompresowane dane wejściowe.

Więc “czy jesteśmy dotknięci?” to nie jeden test. To pytanie o inwentaryzację przekroju Twoich obrazów, runtime’ów, proxy i drzew zależności.

Kto jest dotknięty

Jeśli którekolwiek z poniższych dekoduje Brotli ze źródła, którego w pełni nie kontrolujesz, traktuj je jako będące w zakresie, póki nie wersji:

  • Runtime’y aplikacji, które pobierają albo przyjmują skompresowane dane - Node.js, Python, Bun i inne, używające niezałatanego dekodera Brotli
  • Obrazy kontenerów, których warstwa bazowa albo pakiety zawierają libbrotli / brotli w wersjach 1.0.3 do 1.2.0
  • Proxy, kontrolery ingress, bramy API i sidecary service mesh zbudowane na Envoy
  • Narzędzia CLI i buildowe, które pobierają przez HTTP (na przykład curl) wewnątrz pipeline’ów i obrazów
  • Każda własna usługa, która przyjmuje uploady skompresowane Brotli albo dekoduje odpowiedzi ze zdalnych serwerów

Podatny zakres to Brotli 1.0.3 do 1.2.0. Naprawione wydania to 1.0.10, 1.1.1 i 1.2.1 (wszystkie wydane 21 października 2026).

Poprawka: załataj Brotli, które faktycznie działa w Twoich środowiskach

Nie ma jednego pakietu do podbicia, bo Brotli dociera do Ciebie kilkoma kanałami. Przejdź przez nie po kolei:

Gdzie żyje BrotliCo zrobić
Runtime Node.jsZaktualizuj do naprawionego wydania (22.23.4, 24.22.1 albo 26.12.1) i przebuduj obrazy, które dołączają Node.
Python / Bun / inne runtime'yZaktualizuj do wersji wydanych przez opiekunów z poprawką; przebuduj i wdróż ponownie.
Biblioteka systemowa w obrazachPodbij libbrotli do 1.0.10 / 1.1.1 / 1.2.1 w obrazie bazowym, przebuduj i wypchnij nowy tag obrazu.
Envoy / proxy / meshZaktualizuj do naprawionego builda Envoy; przetocz kontrolery ingress i sidecary, które od niego zależą.
Zależność tranzytywnaWygeneruj ponownie lockfile, tak aby rozwiązała się naprawiona wersja Brotli, a potem przebuduj.

Sekwencja operacyjna to część, którą zespoły mylą pod presją czasu:

  1. Zaktualizuj zależność albo obraz bazowy do naprawionej wersji Brotli.
  2. Przebuduj dotknięte obrazy kontenerów. Łatanie działającego kontenera nie wystarczy; podatna biblioteka jest w obrazie, więc obraz musi się zmienić.
  3. Wdróż ponownie i zrestartuj, tak aby każde działające obciążenie było na naprawionym runtime albo bibliotece. Pod, który nie został przełożony, wciąż jest podatny.
  4. Zweryfikuj wersję faktycznie używaną przez działające obciążenia, nie tylko wersję w manifeście. Wejdź do działającego kontenera i sprawdź rozwiązaną wersję Brotli tam, gdzie możesz.
# Sprawdź wersję biblioteki współdzielonej Brotli w działającym obrazie/kontenerze
dpkg -l | grep -i brotli        # obrazy bazowe Debian/Ubuntu
rpm -qa | grep -i brotli        # obrazy bazowe RHEL/Amazon Linux

# Sprawdź wersję dołączoną do Node
node -e "console.log(process.versions.brotli ?? process.versions.node)"

Jeśli czegoś nie da się załatać od razu

Tam, gdzie poprawka nie jest jeszcze dostępna dla komponentu albo przebudowa i ponowne wdrożenie nie mogą się wydarzyć natychmiast, tymczasowym środkiem jest przestać dekodować niezaufane Brotli: wyłącz dekodowanie Brotli na wystawionej ścieżce, póki nie załatasz. Na brzegu pomaga web application firewall - Azure na przykład opublikował wytyczne WAF dla CVE-2026-111497 - filtrując albo usuwając Content-Encoding: br z ruchu przychodzącego. Traktuj to ściśle jako środek tymczasowy: poprawką jest naprawiona biblioteka w Twoich obrazach, a WAF pokrywa tylko ścieżki, które chroni, nie zaś dekodowanie między usługami ani przy pobieraniu z zewnątrz.

Co zrobić w tym tygodniu

  1. Zinwentaryzuj, gdzie Brotli dekoduje niezaufane dane. Runtime’y aplikacji, obrazy bazowe kontenerów, proxy i meshe oparte na Envoy, narzędzia buildowe i każda usługa przyjmująca skompresowane dane. Przeskanuj obrazy i lockfile pod kątem brotli / libbrotli w zakresie 1.0.3-1.2.0.
  2. Załataj i przebuduj. Podbij runtime’y, biblioteki obrazów bazowych i proxy do naprawionych wersji; wygeneruj ponownie lockfile dla pulli tranzytywnych; przebuduj każdy dotknięty obraz.
  3. Wdróż ponownie i zrestartuj. Zrestartuj aplikacje, tak aby nic nie działało już na starej bibliotece. Potwierdź, że pody faktycznie zostały wymienione.
  4. Zweryfikuj w działających aplikacjach. Sprawdź rozwiązaną wersję Brotli tam, gdzie kod faktycznie działa, i obserwuj advisory dostawców dla komponentów wciąż czekających na poprawkę.

Nie wiesz, gdzie Brotli ukrywa się w Twoim stosie?

Oferujemy bezpłatny 30-minutowy przegląd: pomagamy zinwentaryzować, gdzie Twoje obciążenia dekodują Brotli - obrazy, runtime'y, proxy i drzewa zależności - potwierdzić, co jest załatane, i bezpiecznie zaplanować przebudowę oraz ponowne wdrożenie. Bez zobowiązań. Zobacz nasze usługi Security & Compliance albo umów rozmowę poniżej.

To druga krytyczna, nieuwierzytelniona luka RCE przecinająca ekosystem w ciągu kilku dni - po lukach w rdzeniu PHP, które opisaliśmy w php2shell. Wzorzec jest ten sam: współdzielony komponent głęboko w stosie, wyzwalacz, który nigdy nie dotyka kodu aplikacji, i poprawka, która staje się realna dopiero po przebudowaniu obrazu i ponownym wdrożeniu obciążenia. Jeśli chcesz uporządkowanego spojrzenia na to, gdzie Twoje środowisko niesie tego rodzaju ekspozycję, nasz Well-Architected Review obejmuje dokładnie to.

 

Jerzy Kopaczewski

Utrzymujesz aplikacje w chmurze i nie wiesz, czy Brotli Cię dotyczy?

Umów bezpłatną 30-minutową rozmowę. Pomożemy znaleźć, gdzie Twoje obciążenia dekodują Brotli, załatać to, co da się załatać, i bezpiecznie przeprowadzić przebudowę oraz ponowne wdrożenie.

Umów rozmowę
Brotli security CVE RCE kontenery patching

Przeczytaj również:

Poprzedni post