Krytyczna luka w dekoderze Brotli, dotycząca Node.JS, Bun, przeglądarek, klientów HTTP i innych projektów

W bibliotece z referencyjną implementacją dekodera formatu kompresji danych Brotli odkryto lukę (CVE-2026-111497, kody Broccoli2Shell i HTTP2Shell), prowadzącą do przepełnienia bufora podczas przetwarzania specjalnie sformatowanych skompresowanych danych. Według danych Google luka może być wykorzystywana do zdalnego wykonywania kodu w ataku na projekty korzystające z oficjalnej implementacji dekodera Brotli. Wśród dotkniętych luką projektów znajdują się: Node.js, Bun, Envoy, Istio, przeglądarki internetowe, serwery proxy, klienci HTTP, serwery HTTP, archiwizatory, UEFI, przeglądarki JPEG XL, biblioteki dekodujące zawartość dla Pythona, Ruby, Java, PHP i .NET oraz związane z nimi zależności.

Problem został wykryty przez firmę OpenAI w lutym tego roku i zablokowany w kodzie źródłowym Brotli poprzez odrzucenie niepoprawnych strumieni podczas dekodowania. 22 października opublikowane zostały poprawki Brotli 1.0.10, 1.1.1 i 1.2.1, w których wyraźnie poinformowano o usunięciu luki oraz naprawiono sedno problemu. Tego samego dnia stworzono prototyp exploita, który umożliwił zdalne wykonanie kodu w warunkach laboratoryjnych, przy użyciu niestandardowych kompilacji (w standardowych kompilacjach wystąpił błąd krytyczny). Później firma Imperva zarejestrowała atak na standardowe kompilacje Node.js 24.22.0 w środowisku Linux na systemie ARM64.

Luka prowadzi do zapisu poza buforem z powodu niewłaściwego przetwarzania błędów podczas analizy bloków w skompresowanym strumieniu. Funkcja DecodeBlockTypeAndLength() zamiast kodu błędu zwracała tylko wartości true i false, co uniemożliwiało wywołującemu odróżnienie uszkodzenia strumienia od stanu, który wymagał dodatkowego przekazania danych do funkcji. W przypadku wskazania w strumieniu niepoprawnego typu bloku skompresowanych danych, dekoder traktował to nie jako błąd, ale jako stan braku danych, który wymagał dodatkowego odczytu ze strumienia. Jednakże, ponieważ wydzielony bufor nie był przystosowany do dodatkowo odczytanych danych, były one zapisywane w obszarze poza jego granicami, w którym przechowywano wewnętrzny stan dekodera.

Projekty dotknięte luką:

  • Referencyjna biblioteka Brotli, problem pojawia się od wydania 1.0.3 i został usunięty w aktualizacjach 1.0.10, 1.1.1 oraz 1.2.1. Luka dotyczy aplikacji i bibliotek korzystających z biblioteki libbrotlidec.
  • Platforma JavaScript Node.js, problem została rozwiązana w aktualizacjach 26.12.1, 24.22.1 i 22.23.4. Mogą być atakowane aplikacje, które używają metody fetch() do żądania zewnętrznych treści, co automatycznie dekoduje odpowiedzi HTTP z nagłówkiem „Content-Encoding: br”. Wrażliwość objawia się również przy bezpośrednim wywołaniu metod zlib.brotliDecompress*(), createBrotliDecompress() i brotli.decompress() do dekompresji zewnętrznych treści lub podczas odbierania żądań HTTP z analizą przez biblioteki Express 5 i body-parser 2.x.
  • Pakiety Pythona brotli i brotlicffi (poprawka zaproponowana w wersji 1.2.1) oraz projekty je wykorzystujące, w tym popularne biblioteki urllib3, aiohttp, httpx i Scrapy, które dekodują odpowiedzi z nagłówkiem „Content-Encoding: br” podczas dostępu do zewnętrznych zasobów webowych.
  • Serwery HTTP, proxy HTTP, klienci HTTP i przeglądarki internetowe wspierające kompresję Brotli („Accept-Encoding: br”). W Apache httpd dostarczany jest mod_brotli (domyślnie wyłączony). Dla nginx dostępny jest zewnętrzny moduł ngx_brotli (wersja brotli w zależnościach została podniesiona do aktualnej). W Chrome/Chromium i Firefox problem już został rozwiązany w jednej z wcześniejszych aktualizacji. W proxy-serwerze Envoy wrażliwość została usunięta w wersjach 1.40.0, 1.39.3, 1.38.6, 1.37.8, 1.36.12.
  • .NET runtime przy użyciu metod BrotliDecoder, BrotliStream i HttpClient w aplikacji. Wrażliwość nie została jeszcze usunięta.
  • Rozszerzenie PHP brotli przy użyciu funkcji brotli_uncompress(). Poprawka w trakcie przygotowania.
  • Pakiet Ruby brotli przy użyciu metody Brotli.inflate. Wrażliwość nie została jeszcze usunięta.
  • DB DuckDB przy imporcie skompresowanych plików Parquet. Poprawka w trakcie przygotowania.
  • DB ClickHouse. Poprawka w trakcie przygotowania.
  • DB YDB. Wrażliwość nie została jeszcze usunięta.
  • Apache Arrow przy imporcie skompresowanych plików Parquet. Poprawka w trakcie przygotowania.
  • libjxl (przy kompresji metadanych w JPEG XL używana jest Brotli).
    Poprawka w trakcie przygotowania.
  • Archwatorzy NanaZip, 7-Zip-zstd i p7zip przy dekompresji plików br. Wrażliwość nie została usunięta.
  • MuPDF. Wrażliwość nie została usunięta.
  • Ufirmy UEFI na bazie EDK II i UEFITool, skompresowane za pomocą Brotli. Poprawka w trakcie przygotowania — EDK II i UEFITool.
  • Platforma JavaScript Bun. Wrażliwość została usunięta w wersji 1.4.4.
  • Platforma do zarządzania mikrousługami Istio. Wrażliwość została usunięta w wersjach 1.29.9, 1.30.6 i 1.31.2.
  • curl i libcurl, wrażliwość objawia się podczas obecności w zależnościach wrażliwej wersji libbrotlidec.
  • Parserzy formatu czcionek Web Open Font (WOFF), w którym używana jest
    Brotli.
  • Brotli4j, SumatraPDF, Ghostscript, CatBoost i YTsaurus. Wrażliwość została usunięta w jednej z aktualizacji.

Źródło: opennet.ru

Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS 🔥 Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS - ProHoster