Node2Shell: date Brotli construite special pot transforma un build oficial Node.js în execuție de cod la distanță
O vulnerabilitate de siguranță a memoriei în decodorul Brotli inclus în Node.js, înregistrată ca CVE-2026-111497 și numită „Node2Shell”, s-a dovedit capabilă să ofere unui atacator execuție de cod pe un build oficial, nemodificat, de Node.js. Node.js a publicat actualizările pe 21 octombrie. Dacă serviciile voastre decomprimă date Brotli din surse în care nu aveți încredere, actualizați acum.
Ce s-a întâmplat
Cercetătorii Imperva au creat o dovadă de concept (PoC) pentru imaginea oficială Node.js 24.22.0 pe Linux arm64. Au rulat-o așa cum este livrată, fără debugger și fără build personalizat. A fost suficient să trimită decodorului inclus date Brotli malformate cu grijă ca să ruleze cod furnizat de atacator.
Câteva nuanțe contează:
- Rezultatul este probabilistic. Nu orice încercare a reușit, iar execuția de cod a necesitat mai multe încercări.
- Testul a avut o arie restrânsă. Demonstrația acoperă un singur build (24.22.0, arm64) și o singură configurație de aplicație. Liniile 22.x și 26.x și alte arhitecturi nu au fost testate pentru execuție de cod, deși decodorul vulnerabil este prezent în toate.
- Este un pas peste ce se știa public. Primul PoC public obținuse execuție de cod doar pe un build slăbit intenționat. Pe build-urile standard a produs doar un crash și o citire limitată de memorie.
- Nu fusese raportată exploatare reală („in the wild”) până pe 22 octombrie.
De ce contează
Vulnerabilitatea se află în decodorul Brotli inclus în Node.js, deci afectează liniile 22.x, 24.x și 26.x. O aplicație poate ajunge la acest decodor din ambele direcții ale unui schimb HTTP:
- Spre exterior: codul vostru citește un răspuns comprimat Brotli prin
fetch()-ul integrat în Node, de exemplu când apelează un API terț sau un server controlat de un atacator. - Spre interior: un middleware decodează un corp de cerere comprimat Brotli. Parserele de body din Express 5 (
express.json(),express.urlencoded(),express.text(),express.raw()) decodează acum Brotli, pe lângă gzip și deflate. Un server HTTP Node.js simplu nu decodează implicit corpul cererii, așa că pe această cale e nevoie de un astfel de middleware sau de un apel explicit de decompresie.
Execuția de cod a fost reprodusă pe ambele căi, pe versiuni fixe Express 5.0.0–5.3.0 și body-parser 2.0.0–2.3.0. Nu toate versiunile intermediare au fost testate.
Cauza este o eroare de gestionare a stării. Un flux Brotli anunță tipurile de blocuri pe care le va folosi, iar datele construite special sar la un bloc pe care chiar structura fluxului îl exclude. Decodorul vulnerabil interpretează această stare imposibilă drept „mai trebuie date” și continuă. Un test cu memory sanitizer a arătat că asta duce la o scriere în afara limitelor bufferului. Remedierea preia un patch Brotli din upstream, iar decodorul se oprește acum cu o eroare de format în acel punct.
Ce trebuie să faceți
- Actualizați Node.js la versiunea corectată de pe linia voastră (24.22.1 pentru 24.x și versiunile corespunzătoare pentru 22.x și 26.x). Aceasta este singura remediere reală. Node.js nu oferă o soluție temporară în runtime.
- Nu uitați de binarele incluse. Imaginile de bază pentru containere, layerele serverless, aplicațiile desktop și imaginile de CI au adesea propria copie de Node, pe care un inventar de pachete o poate rata. Reconstruiți și redistribuiți aceste artefacte.
- Renunțați la versiunile ieșite din suport. Node.js 20.x și versiunile mai vechi nu vor primi această remediere.
- Reduceți expunerea până la actualizare. Unde se poate, nu mai acceptați
Content-Encoding: brpe corpurile de cerere care nu au nevoie de el și fiți atenți când preluați conținut comprimat Brotli de pe servere nesigure. Regulile WAF de la furnizori precum Imperva și Vercel pot bloca tiparele de atac cunoscute în cererile primite. Ele nu acoperă calea răspunsurilor prinfetch()și nu înlocuiesc actualizarea.
Adesea e mai greu să știi toate locurile în care rulează un runtime vulnerabil decât să aplici patch-ul. Serviciul de scanare a vulnerabilităților 4tify vă ajută aici. Identifică runtime-urile și componentele învechite din servere și imagini de containere, inclusiv pe cele de care nimeni nu-și mai amintea, ca o remediere ca aceasta să ajungă la fiecare copie.
Credit cercetare: Imperva. Raportat inițial de The Hacker News.
