Node2Shell: Brotli propust omogućio RCE na zvaničnom Node.js buildu

Istraživači kompanije Imperva demonstrirali su izvršavanje proizvoljnog koda kroz propust Node2Shell u zvaničnoj Linux arm64 slici Node.js 24.22.0. Ranivost je evidentirana kao CVE-2026-111497, nalazi se u ugrađenom Brotli dekoderu, a Node.js je 21. oktobra objavio ispravku u verziji 24.22.1.
Demonstracija je značajna zato što je izvedena bez debagera i prilagođenog, namerno oslabljenog builda. Impervin dokaz koncepta nije uspevao pri svakom pokušaju, već je do izvršavanja koda bilo potrebno više pokušaja u testiranom Linux arm64 okruženju. Isti posebno oblikovani podaci bili su odbijeni u verziji 24.22.1, bez izvršavanja koda.
Gde aplikacija dolazi u kontakt sa ranjivim dekoderom
Problem pogađa aplikacije na granama Node.js 22.x, 24.x i 26.x koje obrađuju nepouzdane Brotli podatke. Dekoder može biti dostupan kada aplikacija ugrađenim fetch() mehanizmom čita Brotli-komprimovani odgovor ili kada middleware dekodira Brotli-komprimovano telo HTTP zahteva.
Express 5 parseri tela zahteva, uključujući express.json(), express.urlencoded(), express.text() i express.raw(), podržavaju Brotli uz gzip i deflate kada se primene na rutu. Običan Node.js HTTP server ne dekodira Brotli telo samo zato što ga je primio; potreban je middleware ili izričit poziv za dekodiranje. Imperva je reprodukovala izvršavanje koda kroz putanje tela zahteva i odgovora, uz testiranje verzija Express 5.0.0 do 5.3.0 i body-parser 2.0.0 do 2.3.0 na fiksiranim verzijama.
Zašto posebno oblikovani podaci izazivaju problem
Brotli tok tokom dekodiranja najavljuje tipove blokova koje koristi. Impervin testni ulaz dostigao je promenu bloka koju je sopstvena struktura toka isključivala. Ranjivi dekoder to je protumačio kao zahtev za dodatnim ulazom i nastavio rad u nevažećem stanju.
Odvojeni test sa sanitizerom memorije pokazao je da nastavak iz tog stanja upisuje podatke izvan predviđenog bafera. Node.js je preuzeo uzvodnu Brotli zakrpu koja sada u toj tački prekida obradu greškom formata, umesto da nastavi dekodiranje.
Šta treba proveriti u poslovnom okruženju
Najvažnija mera je prelazak na zakrpljeno izdanje Node.js-a i provera kontejnerskih slika, distribucionih artefakata i drugih paketa koji sadrže Node binarni fajl. Inventar paketa može propustiti takve ugrađene binarne kopije. Linije 20.x i starije, koje su van podrške, ne dobijaju ispravku i treba ih zameniti podržanom granom.
U samom Node.js-u ne postoji alternativno zaobilazno rešenje. Privremeno ograničavanje nepouzdanog Brotli saobraćaja na pogođenim putanjama može smanjiti izloženost, ali samo ažuriranje uklanja propust. Vercel je 21. oktobra dodao pravila za blokiranje napada u dolaznim zahtevima, ali ta pravila ne obuhvataju Brotli odgovore koje aplikacija preuzima sa drugih servera i ne zamenjuju zakrpu.
Za poslovne timove praktičan zaključak je da prioritet daju ažuriranju podržanih Node.js grana, zatim potvrde verzije u svim image-ovima i proveravaju rute koje prihvataju ili preuzimaju Brotli sadržaj.

