Northwestern Tideline · naujienos

CVE-2026-111497: „Brotli“ dekoderio spraga Node.js – kam aktuali ir kaip pasitikrinti per valandą

2026 m. spalio 21 d. Node.js išleido 22.23.4, 24.22.1 ir 26.12.1, spalio 22 d. „Google“ paskelbė CVE-2026-111497 – rašymą už buferio ribų savo „Brotli“ dekoderyje. Spraga tikra, bet pasiekiama tik ten, kur programa išskleidžia svetimus „Brotli“ duomenis. Kaip tai pasitikrinti ir kokia tvarka taisyti.

Turinys9 skyriai

2026 m. spalio 21 d. Node.js projektas išleido saugumo leidimus 22.23.4, 24.22.1 ir 26.12.1. Kitą dieną „Google“ paskelbė įrašą CVE-2026-111497 apie savo glaudinimo bibliotekos „Brotli“ dekoderio spragą, o nuo spalio 22 d. istorija plito pavadinimu „Node2Shell“.

Spraga tikra ir rimta, tačiau siauresnė, nei skamba antraštės: ji slypi vienoje bibliotekoje ir pasiekiama tik ten, kur programa išskleidžia užpuoliko pateiktus „Brotli“ duomenis. Toliau – kas paskelbta, kam tai aktualu, kaip pasitikrinti per valandą ir kokia tvarka taisyti.

Kas paskelbta ir kada

FaktasŠaltinis
ĮrašasCVE-2026-111497, būsena PUBLISHED, paskelbtas 2026-10-22 13:35 UTC; numerį suteikė „Google“CVE.org
Pavadinimas„Out-of-Bounds Write in Google Brotli Decoder“ – rašymas už buferio ribų dekoderio faile c/dec/decode.c; silpnybių klasės CWE-787 ir CWE-252CVE.org
Paveiktos „Brotli“ versijosnuo 1.0.3 iki 1.0.10 (neįskaitant), 1.1.0 ir 1.2.0CVE.org
Pataisytos „Brotli“ versijos1.0.10, 1.1.1, 1.2.1CVE.org
ĮvertinimasCVSS 4.0 bazinis balas 9,2 (kritinis); vektoriuje AT:P – atakai reikia papildomų sąlygųCVE.org
Node.jspaveiktos 22.x, 24.x ir 26.x šakos; pataisyta 22.23.4, 24.22.1, 26.12.1 (2026-10-21); projekto įvertinimas – „high“nodejs.org

Node.js pranešime priežastis aprašyta taip: netinkamą bloko perjungimą dekoderis pranešdavo kaip laikiną „reikia daugiau duomenų“ būseną, o ne kaip galutinę formato klaidą, todėl srautinis dekoderis toliau rašė įvesties baitus į aštuonių baitų vidinį buferį. Pasekmės – proceso atminties sugadinimas, strigtis, atminties turinio atskleidimas arba kodo vykdymas.

Tame pačiame spalio 21 d. leidime ištaisyta dešimt spragų (CVE), iš jų keturios įvertintos „high“; „Brotli“ spraga – viena iš jų.

Du skirtingi įvertinimai – Node.js projekto „high“ ir „Google“ CVSS 4.0 balas 9,2 – neprieštarauja vienas kitam: tai dviejų skirtingų vertintojų skalės. Mes remiamės abiem ir planuodami laikome spragą išnaudojama kiekvienoje paveiktoje šakoje.

Ką pavadinimas „Node2Shell“ pameta

„Node2Shell“ nėra nei CVE įrašo, nei Node.js projekto pavadinimas. Taip 2026 m. spalio 22 d. savo analizę pavadino „Imperva“ raudonoji komanda. Ji parodė, kad per „Brotli“ duomenis pateiktas kodas įvykdomas programoje, veikiančioje oficialiame Node.js 24.22.0 „Linux arm64“ atvaizde, o 24.22.1 tuos pačius duomenis atmeta. Tai vertingas nepriklausomas patvirtinimas.

Tačiau pavadinimas skamba taip, lyg kiaura būtų pati Node.js platforma, ir trys dalykai pametami:

  • Spraga yra „Google“ bibliotekoje, ne Node.js kode. Node.js ją tik įsideda. Ta pati biblioteka naudojama ir kitur: pagal GHSA-9v8h-qqgm-4m35 paveikti ir PyPI paketai brotli (nuo 1.0.3 iki 1.2.1, neįskaitant) bei brotlicffi (nuo 1.0.3 iki 1.2.1.0, neįskaitant).
  • Pasiekiamumas sąlyginis. Node.js aprašyme užpuolikas turi galėti pateikti „Brotli“ duomenis, kuriuos programa išskleidžia per node:zlib. Serveris, kuris niekada neišskleidžia svetimų „Brotli“ srautų, šio kelio neturi.
  • Bandymų aprėptis ribota. „Imperva“ tikrino Node.js 24.22.0 su Express 5.0.0–5.3.0 ir body-parser 2.0.0–2.3.0; vykdymas jų aplinkoje pavykdavo ne iš pirmo karto. Kitų architektūrų ir 22.x ar 26.x rezultatų įraše nėra.

Kas nesikeičia: spraga tikra, pataisos išleistos, o kodo vykdymas parodytas standartiniame oficialiame atvaizde. Tai pakankamas pagrindas veikti dabar, bet pagal inventorių, o ne pagal antraštes.

Kam tai aktualu

Pirmiausia – šaka. Paveiktos 22.x, 24.x ir 26.x šakos turi pataisas; 20.x šaka, pagal Node.js leidimų grafiką gyvavimo pabaigą pasiekusi 2026-04-30, pataisos negauna. Antra – kelias. Svetimi „Brotli“ duomenys į dekoderį patenka dviem keliais, ir „Imperva“ įraše patikrinti abu:

  1. Įeinančios užklausos kūnas. body-parser dokumentacijoje rašoma, kad visi analizatoriai palaiko automatinį gzip, br (brotli), deflate ir zstd išskleidimą, o nustatymas inflate pagal numatymą yra true. Jei kūno analizatorius pajungtas anksčiau nei prieigos tikrinimas, viešas POST su antrašte Content-Encoding: br pasiekia dekoderį dar iki autentifikacijos.
  2. Išeinantis fetch(). Node.js įtaisytas fetch() išskleidžia suglaudintus atsakymus. Jei programa kreipiasi į serverius, kurių nevaldote, atsakymas yra svetimi duomenys.

Ko spraga neliečia: nginx savyje „Brotli“ neturi. Ją prideda atskiras ngx_brotli modulis, o jis, pagal savo aprašą, susideda iš dviejų dalių: filtro, kuris glaudina atsakymus, ir statinio modulio, kuris atiduoda iš anksto suglaudintus failus; užklausų kūnų išskleidimo apraše nėra. Jei modulio nėra, nginx šios bibliotekos neturi visai.

Kaip pasitikrinti per valandą

Visos komandos skaito jūsų pačių sistemas; nieko nesiunčia į išorę ir nieko nekeičia.

  1. Surašykite kiekvieną Node.js aplinką – serverius, konteinerius, CI vykdytojus, darbo stotis. Kiekvienoje paleiskite node -v ir node -p process.versions.brotli. Jei antroji komanda rodo versiją nuo 1.0.3 (bet senesnę nei 1.0.10), 1.1.0 arba 1.2.0 – aplinka paveikta. Tikrinkite veikiančio proceso vykdomąjį failą (readlink /proc/<pid>/exe), ne tik tą, kurį PATH randa pirmą.
  2. Pasitikrinkite, ar programa išskleidžia svetimus duomenis. npm ls body-parser express parodo versijas; peržiūrėkite, ar express.json(), express.raw() ar body-parser naudojami su numatytuoju inflate ir kur jie pajungti maršrutų eilėje. Atskirai surašykite, į kokius išorinius adresus programa kreipiasi per fetch().
  3. Kraštas. nginx -V 2>&1 | grep -i brotli. Nėra – nginx bibliotekos neturi. Yra – modulio atnaujinimą derinkite su distribucijos libbrotli paketu.
  4. Kitos kalbos tame pačiame serveryje. python3 -c "import brotli; print(brotli.__version__)". Klaida ModuleNotFoundError reiškia, kad paketo nėra; versija nuo 1.0.3 iki 1.2.1 (neįskaitant) – paveikta pagal GHSA.
  5. Užsirašykite rezultatą su data – ką radote ir ko neradote. Neigiamas radinys vertingas tiek pat: niekas netaiso to, ko nėra, ir niekas nestabdo paslaugos be reikalo.

Kokia tvarka taisyti

Tvarka, kurios laikomės patys: pirmiausia grįžtamas žingsnis, kuris užveria kelią per minutes, paskui tikroji pataisa, galiausiai sprendimai, kuriems reikia žmogaus.

ŽingsnisKą darytiKaip patikrinti
1. Blokas krašte (minutės, grįžtamas)nginx API bloke prieš proxy_pass: if ($http_content_encoding ~* "br") { return 415; }curl su antrašte Content-Encoding: br grąžina 415, be jos – įprastą kodą; atšaukimas – pašalinti eilutę ir nginx -s reload
2. Šakos atnaujinimas22.x → 22.23.4, 24.x → 24.22.1, 26.x → 26.12.1 po vieną mazgą su sveikatos patikra; konteinerius perrinkti iš pataisyto bazinio atvaizdota pati process.versions.brotli komanda ant veikiančio proceso
3. OS paketailibbrotli per distribucijos saugumo atnaujinimus – aktualu nginx moduliui ir distribucijos Python paketams; oficialūs Node.js leidimai biblioteką turi savyje, juos taiso tik šakos atnaujinimas; per pip įdiegtą brotli atnaujina pip (1.2.1)paketų tvarkyklės versija
4. Sprendimai su žmogaus patvirtinimuNode 20 → 22 perėjimas (priklausomybių suderinamumas, prastova); inflate išjungimas, jei klientai suglaudintų kūnų nesiunčiabandomoji kopija prieš gamybą

Pirmas žingsnis užklausoms su antrašte Content-Encoding: br grąžina kodą 415 dar prieš joms pasiekiant programą. Mūsų vertinimu, įprasti klientai ir naršyklės užklausų kūnų „Brotli“ formatu nesiunčia, todėl šis žingsnis retai ką nors sugadina. Jis neapsaugo išeinančio fetch() – šį kelią užveria tik atnaujinimas.

Ko nežinome

  • Ar spraga jau išnaudojama realiose atakose. CISA žinomų išnaudojamų spragų kataloge (2026.10.23 versija) jos nėra, o CISA papildyme prie CVE įrašo 2026-10-23 išnaudojimas pažymėtas „none“. EPSS įvertis 2026-10-24 – 0,0071 (53-iasis procentilis), bet dviejų dienų senumo įrašui šis signalas silpnas.
  • Ar kodo vykdymas pakartojamas kitose aplinkose. „Imperva“ aprašė tik Node.js 24.22.0 „Linux arm64“ atvejį; kitų architektūrų ar 22.x ir 26.x šakų duomenų nėra.
  • Ar jūsų konkreti programa pasiekiama. Iš išorės to nematyti – atsakymą duoda tik aukščiau aprašytas inventorius, kurį sudarote patys arba jūsų administratorius.

Ribos

Šis straipsnis remiasi tik viešais įrašais: CVE.org, nodejs.org, „Imperva“, „GitHub“ saugumo pranešimų duomenų baze (GitHub Advisory Database), CISA ir FIRST. Mes neskenuojame jūsų sistemų ir nesiunčiame į jas jokių užklausų be rašytinio įgaliojimo.

Jei norite, kad spragos pasiekiamumą jūsų Node.js aplinkose peržiūrėtume kartu su jūsų administratoriumi pagal rašytinį susitarimą, aprašykite situaciją Northwestern Tideline užklausos formoje. Kaip tokios spragos atrodo Lietuvos įmonių svetainėse apskritai – spalio stebėjimo apžvalgoje.

Dažni klausimai

Kas yra CVE-2026-111497?

Tai 2026 m. spalio 22 d. paskelbtas įrašas apie rašymą už buferio ribų „Google“ bibliotekos „Brotli“ dekoderyje. Numerį suteikė „Google“; CVSS 4.0 bazinis balas – 9,2. Paveiktos „Brotli“ versijos nuo 1.0.3 iki 1.0.10 (neįskaitant), 1.1.0 ir 1.2.0; pataisytos – 1.0.10, 1.1.1 ir 1.2.1.

Kurios Node.js versijos pataisytos?

Node.js projektas 2026 m. spalio 21 d. išleido 22.23.4, 24.22.1 ir 26.12.1. Node 20 šaka gyvavimo pabaigą pasiekė 2026-04-30, todėl pataisos negauna – jai lieka blokas krašte arba perėjimas į 22.x ar naujesnę šaką.

Ar kiekvienas Node.js serveris pažeidžiamas?

Ne. Pagal Node.js pranešimą užpuolikas turi galėti pateikti „Brotli“ duomenis, kuriuos programa išskleidžia per node:zlib. Įprasti keliai – užklausų kūnai per body-parser ar Express kūno analizatorius (inflate pagal numatymą įjungtas) ir suspausti atsakymai iš nepatikimų serverių per fetch(). Programa, kuri svetimų „Brotli“ srautų neišskleidžia, šio kelio neturi.

Kaip greitai pasitikrinti, ar esu paveiktas?

Kiekvienoje Node.js aplinkoje paleiskite node -p process.versions.brotli: versija nuo 1.0.3 (senesnė nei 1.0.10), 1.1.0 arba 1.2.0 reiškia paveiktą dekoderį. Tada pasitikrinkite, ar programa išskleidžia svetimus kūnus ar atsakymus, ir nginx -V, ar krašte yra brotli modulis.

Ar spraga jau išnaudojama atakose?

Mums nežinoma. CISA išnaudojamų spragų kataloge 2026.10.23 versijoje jos nėra, EPSS įvertis 2026-10-24 buvo 0,0071. „Imperva“ parodė kodo vykdymą savo bandymų aplinkoje su Node.js 24.22.0 „Linux arm64“; apie realias atakas viešų pranešimų neradome.

Šaltiniai

  1. 01

    CVE.org: CVE-2026-111497 (CNA Google; paskelbta 2026-10-22 13:35 UTC; paveiktos 1.0.3–<1.0.10, 1.1.0–<1.1.1, 1.2.0–<1.2.1; pataisytos 1.0.10, 1.1.1, 1.2.1; CWE-787, CWE-252; CVSS 4.0 9.2, AT:P; CISA ADP SSVC 2026-10-23 „Exploitation: none“)

    Atidaryti šaltinį skaityta 

  2. 02

    Node.js: Wednesday, October 21, 2026 Security Releases (22.23.4, 24.22.1, 26.12.1; CVE-2026-111497 „high“; priežastis ir aštuonių baitų buferis; užpuolikas pateikia „Brotli“ duomenis, išskleidžiamus per node:zlib; dešimt CVE; gyvavimo pabaigą pasiekusios versijos visada paveiktos)

    Atidaryti šaltinį skaityta 

  3. 03

    Node.js Release Working Group: leidimų grafikas schedule.json (v20 end 2026-04-30, v18 end 2025-04-30)

    Atidaryti šaltinį skaityta 

  4. 04

    Imperva: Node2Shell – From Brotli Data to Remote Code Execution (pavadinimo autorystė; Node.js 24.22.0 Linux arm64; 24.22.1 atmeta; Express 5.0.0–5.3.0, body-parser 2.0.0–2.3.0; fetch() ir užklausos kūno keliai)

    Atidaryti šaltinį skaityta 

  5. 05

    GitHub Advisory Database: GHSA-9v8h-qqgm-4m35 (PyPI brotli >= 1.0.3, < 1.2.1; brotlicffi >= 1.0.3, < 1.2.1.0; pataisyta 1.2.1 / 1.2.1.0)

    Atidaryti šaltinį skaityta 

  6. 06

    CISA: Known Exploited Vulnerabilities Catalog (2026.10.23 versija, naujausia 2026-10-25 – CVE-2026-111497 neįtrauktas)

    Atidaryti šaltinį skaityta 

  7. 07

    FIRST: EPSS API, CVE-2026-111497 (epss 0.0071, percentile 0.53, 2026-10-24)

    Atidaryti šaltinį skaityta 

  8. 08

    expressjs/body-parser README (automatinis gzip, br, deflate, zstd išskleidimas; inflate „Defaults to true“)

    Atidaryti šaltinį skaityta 

  9. 09

    google/ngx_brotli README (filter modulis glaudina atsakymus, static modulis atiduoda iš anksto suglaudintus failus; užklausų kūnų išskleidimo apraše nėra)

    Atidaryti šaltinį skaityta 

Kaip parengtas šis gidas

Gidą parengė „Northwestern Solutions“ pagal aukščiau išvardytų teisės aktų ir kitų šaltinių tekstus. Teisiniai teiginiai sutikrinti su šiais tekstais; tikrinimo data nurodyta prie šaltinių. Pavyzdžiuose šalys ir sumos išgalvotos. Tai nėra teisinė ar mokesčių konsultacija: neįprastu atveju kreipkitės į buhalterį.

Pastebėjote netikslumą? .