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: bri 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
Dockerfilemoże nieść podatnelibbrotli, 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/brotliw 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 Brotli | Co zrobić |
|---|---|
| Runtime Node.js | Zaktualizuj 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'y | Zaktualizuj do wersji wydanych przez opiekunów z poprawką; przebuduj i wdróż ponownie. |
| Biblioteka systemowa w obrazach | Podbij libbrotli do 1.0.10 / 1.1.1 / 1.2.1 w obrazie bazowym, przebuduj i wypchnij nowy tag obrazu. |
| Envoy / proxy / mesh | Zaktualizuj do naprawionego builda Envoy; przetocz kontrolery ingress i sidecary, które od niego zależą. |
| Zależność tranzytywna | Wygeneruj 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:
- Zaktualizuj zależność albo obraz bazowy do naprawionej wersji Brotli.
- Przebuduj dotknięte obrazy kontenerów. Łatanie działającego kontenera nie wystarczy; podatna biblioteka jest w obrazie, więc obraz musi się zmienić.
- 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.
- 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
- 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/libbrotliw zakresie 1.0.3-1.2.0. - 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.
- Wdróż ponownie i zrestartuj. Zrestartuj aplikacje, tak aby nic nie działało już na starej bibliotece. Potwierdź, że pody faktycznie zostały wymienione.
- 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.
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.