Kártékony Brotli-adat segítségével támadói kódot lehet futtatni egy hivatalos Node.js builden futó alkalmazásban – ezt mutatták be az Imperva biztonsági kutatói.
„Node2Shell” nevű proof of conceptjük támadói kódot futtatott a hivatalos Node.js 24.22.0 Linux arm64 image-en, debugger és egyedi build nélkül, pusztán azzal, hogy speciálisan kialakított adatot adtak a beépített Brotli-dekódernek (CVE-2026-111497). A Node.js nyilvánosságra hozta a hibát, és október 21-én kiadta a javításokat, ezért minden olyan alkalmazást frissíteni kell, amely nem megbízható Brotli-adatot dekódol.
Az Imperva tesztje nem járt sikerrel minden próbálkozásnál, a kódfuttatás több kísérlet után sikerült a Linux arm64 környezetben. Az eredmény csak erre az egy buildre és alkalmazás-környezetre vonatkozik, más architektúrákat, illetve a 22.x és 26.x ágakat nem vizsgálták. A javított, 24.22.1-es kiadáson ugyanazt az adatot már elutasították, és nem futott le semmilyen kód.
A bemutató túlmutat az első nyilvános proof of concepten, amely csak szándékosan meggyengített teszt builden tudott kódfuttatást elérni. Alapértelmezett builden a proof of concept szerzője csak összeomlást és a processzmemória korlátozott olvasását tapasztalta, nem kódfuttatást, és azt írta, hogy normál buildre működő támadást nem sikerült kidolgozni.
Október 22-ig nem érkezett jelentés arról, hogy a hibát éles környezetben kihasználták volna.
Mely alkalmazásokat érinti
A hiba a Node.js-be csomagolt Brotli-dekóderben található, ezért a 22.x, 24.x és 26.x ágakon futó alkalmazásokat érinti, nem csak azt az egy buildet, amelyet az Imperva tesztelt. Egy szolgáltatás két irányból is elérheti ezt a dekódert egy HTTP-kapcsolat során: amikor Brotli-tömörített választ olvas a Node.js beépített fetch() függvényével, vagy amikor middleware dekódol egy Brotli-tömörített kérés-törzset.
Az Express 5 body parserei, például az express.json(), express.urlencoded(), express.text() és express.raw(), már Brotli-tömörített kérés-törzseket is dekódolnak az adott útvonalon, a gzip és deflate mellett. Egy egyszerű, Node.js-alapú HTTP-szerver önmagában nem dekódolja a Brotli-tömörített kérés-törzset attól, hogy ilyet kap; ehhez middleware-re vagy kifejezett hívásra van szükség.
Az Imperva mind a kérés-törzsön, mind a válaszon keresztül reprodukálta a kódfuttatást. Az Express 5.0.0–5.3.0 és a body-parser 2.0.0–2.3.0 verziókat tesztelték rögzített verziószámokkal, a köztes kiadásokat nem vizsgálták.
Hogyan működik a hiba
Az Imperva a hiba okát abban találta meg, ahogyan a dekóder egy lehetetlen pontot kezel a Brotli-adatfolyamban. A stream a dekódolás közben jelzi, milyen blokktípusokat fog használni, a tesztbemenet pedig olyan blokkváltáshoz ért, amit maga a stream felépítése kizárt. A sebezhető dekóder ezt úgy értelmezte, mintha további bemenetet kérnének tőle, és érvénytelen állapotban is tovább futott.
Egy külön tesztben, memória-szanitizerrel vizsgálva, ebből az állapotból továbbhaladva a kód túlírt egy tervezett puffert. Ez a határon túli írás okozta a sebezhetőséget.
A Node.js a hibát úgy javította, hogy átvette az upstream Brotli javítócsomagot, amely ezen a ponton formátumhibával leállítja a dekódert, ahelyett hogy tovább futna.
Mit érdemes tenni
A megoldás az, ha valaki javított kiadásra vált. A frissítésnek el kell jutnia azokhoz a container image-ekhez és egyéb artefaktumokhoz is, amelyek saját Node binárist csomagolnak, ezeket egy csomaglista könnyen figyelmen kívül hagyhatja. A már életciklusa végére ért 20.x és korábbi ágak nem kapják meg a javítást, ezért ezeket támogatott ágra kell átvinni.
A biztonsági közlemény nem sorol fel Node.js-en belüli kerülőmegoldást, így azoknak az alkalmazásoknak, amelyek nem tudnak azonnal frissíteni, nincs menekülőút a runtime-on belül. Az Imperva azt javasolta, hogy ahol ez megoldható, korlátozzák a nem megbízható Brotli-forgalmat az érintett útvonalakon, és hangsúlyozta, hogy csak a frissítés szünteti meg a hibát. A cég saját webalkalmazás-tűzfalához is hozzáadott szabályokat, és ezeket letesztelte az általa reprodukált támadások ellen.
A Vercel, amely ügyfelei számára futtat Node.js-t, közölte, hogy október 21-én új szabályokat vezetett be, amelyek blokkolják a támadást a bejövő kérésekben. A szabályok nem vonatkoznak azokra a Brotli-válaszokra, amelyeket az alkalmazás más szerverektől tölt le, és nem helyettesítik a frissítést.

