Zraniteľnosť Node.js: serverový modul, prasknutý štít a nasadzovaná bezpečnostná záplata

Node.js opravuje RCE v Brotli (CVE-2026-111497) a chyby TLS: čo urobiť

Publikované: 22. októbra 2026|Affiliate vyhlásenie

Node.js 26.12.1, 24.22.1 a 22.23.4 opravujú desať zraniteľností, štyri s vysokou závažnosťou. Najvážnejší je zápis mimo pamäť v zabudovanom dekodéri Brotli, ku ktorému sa útočník dostane cez fetch(), Express 5 alebo zlib. Ďalšie chyby obchádzajú kontrolu TLS certifikátu a orezávajú DNS dopyty. Čo je overené, ako reagujú CloudLinux, Plesk a Vercel a čo má urobiť správca VPS, zákazník hostingu aj vývojár.

Projekt Node.js vydal v stredu 21. októbra 2026 bezpečnostné verzie 26.12.1, 24.22.1 a 22.23.4, ktoré opravujú desať zraniteľností, z toho štyri s vysokou závažnosťou. Najvážnejšia je CVE-2026-111497, zápis mimo pamäť v dekodéri Brotli zabudovanom do Node.js, ktorý podľa projektu umožňuje vzdialené spustenie kódu. Popri nej vydanie opravuje tri chyby v overovaní TLS certifikátov, orezávanie DNS dopytov s nulovým znakom a blokuje certifikáty kompromitovanej autority eMudhra. Deň po kritických chybách v PHP je to druhé veľké vydanie v týždni, ktoré sa týka väčšiny webových serverov, a rovnako ako pri PHP platí, že jedinou úplnou opravou je aktualizácia. Tento článok zhŕňa, čo je oficiálne potvrdené, kto je skutočne vystavený a čo má urobiť kto.

Čo sa stalo: desať chýb, štyri vysoké, žiadne CVSS skóre

Node.js vydanie predoznámil 14. októbra s jedinou informáciou: najvyššia závažnosť bude „high". V stredu 21. októbra o 10:00 UTC vznikli tagy všetkých troch verzií a krátko po 12:00 UTC projekt ten istý príspevok doplnil o zoznam chýb. Oficiálny text je stručný: pri každej zraniteľnosti uvádza názov, postihnuté vetvy a poďakovanie, nič viac. Žiadne CVSS skóre, žiadny vektor, žiadny opis podmienok zneužitia. Záznamy na CVE.org boli v čase písania stále v stave „reserved" a NVD ich nemala. Čísla, ktoré kolujú po internete, teda nepochádzajú od Node.js.

Rozdelenie podľa závažnosti: štyri high (Brotli, dve obídenia TLS, DNS), tri medium (keep-alive socket, DNS SAN pre IP adresy, náhodné čísla v snapshotoch) a tri low (ZIP, dvakrát Permission Model). Osem z desiatich chýb nahlásili externí výskumníci cez HackerOne, hlásenia zatiaľ nie sú verejné. Opravy písali členovia core tímu James Snell, Matteo Collina, Antoine du Hamel, Filip Skokan a Rafael Gonzaga. Commity boli do verejných vetiev pridané 20. októbra popoludní, deň pred vydaním, takže kto sledoval repozitár, videl obsah opráv s predstihom.

Vydanie okrem CVE aktualizuje aj závislosti: c-ares 1.34.9 vo všetkých vetvách, OpenSSL 3.5.9 v 24.x a 22.x, SQLite 3.53.4 v 22.x, undici vo všetkých vetvách a koreňové certifikáty z NSS 3.131.1. Nič z toho nie je označené ako breaking change; ide o patch verzie.

CVE-2026-111497: Brotli dekodér zapisuje mimo pamäť a volá ho viac kódu, než si myslíte

Chyba nie je v kóde Node.js samotného, ale v knižnici Brotli od Googlu, ktorú Node.js pribaľuje a vystavuje cez modul zlib. Oprava v Node.js je cherry-pick upstream commitu „Detect and report invalid stream earlier" od Jevgenija Kľučnikova z Googlu, datovaného 27. februára 2026. Oprava teda ležala na hlavnej vetve Brotli osem mesiacov, kým ju niekto označil za bezpečnostnú. Mechanizmus podľa analýzy diffu: ak komprimovaný prúd deklaruje jediný typ bloku a potom napriek tomu požiada o prepnutie bloku, dekódovanie na rýchlej ceste tento zlyhaný krok ignorovalo a pokračovalo, čo viedlo k zápisu mimo pridelenú pamäť. Opravený dekodér vracia novú chybu BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH a zastaví sa. Google v ten istý deň vydal Brotli 1.2.1, 1.1.1 a 1.0.10 s jednoriadkovou poznámkou o CVE-2026-111497; vlastné advisory ani issue repozitár nemá.

Chybu nahlásil Matteo Collina, správca undici a Fastify, opravu pripravil Antoine du Hamel. O tom, ako ďaleko sa dá dostať, Node.js mlčí. Vercel vo svojom bulletine píše, že výskumníci predviedli únik pamäte procesu aj spustenie príkazov na neopravených 22.x, 24.x a 26.x, s oprávnením procesu Node.js. Zneužitie v praxi nikto nehlási a katalóg CISA KEV chybu neobsahuje.

Dôležitejšia než mechanizmus je otázka, kto vlastne Brotli dekóduje. Node.js sám od seba nič nedekomprimuje, ale váš kód alebo knižnice áno, často bez toho, aby ste o tom vedeli:

  • Zabudovaný fetch() (undici) automaticky rozbaľuje odpovede s hlavičkou Content-Encoding: br. Stačí, aby vaša aplikácia stiahla dáta zo servera, ktorý ovláda útočník. Poslať Accept-Encoding: identity nepomôže, zlý server môže odpovedať Brotli aj tak.
  • axios, got aj node-fetch odpovede dekomprimujú v predvolenom nastavení.
  • Express 5 používa body-parser 2.x, ktorý od verzie 2.0.0 vie Brotli a má inflate: true ako predvolené. Útočník teda môže poslať komprimované telo požiadavky. Express 4 s body-parserom 1.x Brotli nepodporuje.
  • Priame volanie zlib.brotliDecompress(), brotliDecompressSync() alebo createBrotliDecompress() na cudzie dáta, typicky v proxy, CDN logike alebo pri spracovaní uploadov.
  • Self-hosted Next.js: podľa Vercelu optimalizácia obrázkov Brotli odpovede neblokuje.

Kto Brotli len komprimuje, vstupný bod nemá. A pozor na build: Debian a Homebrew stavajú Node.js s prepínačom --shared-brotli, teda proti systémovej knižnici. Tam opravu neprinesie nová verzia Node.js, ale balík libbrotli. Na Homebrew bol brotli 1.2.1 k dispozícii skôr než opravený node. Rovnaká chyba sa týka aj ďalších projektov s vlastnou kópiou Brotli: Bun mal backport v čase písania stále v otvorenom pull requeste, nginx modul ngx_brotli aktualizoval submodul 22. októbra, Chrome opravený kód obsahuje už od marca.

TLS a DNS: obídenie kontroly hostname, nie klasický MITM na každé spojenie

Správa, že chyby „umožňujú MITM", potrebuje spresnenie. Tri chyby v TLS majú spoločný vzor: IP adresa zapísaná nezvyčajným spôsobom sa nerozpozná ako IP adresa, kontrola certifikátu spadne do vetvy pre doménové mená a certifikát vydaný na meno potom overí spojenie na IP adresu. Útočník ale musí mať certifikát od autority, ktorej klient verí, s položkou DNS: v tvare IP adresy. To nie je triviálne, hoci po októbrovom kompromitovaní eMudhry je to menej teoretické než predtým.

CVE-2026-106069 (high, všetky vetvy): host sa na IP adresu zmení až po normalizácii. Príklad z testov opravy: url.domainToASCII() prečíta 0127.0.0.1 ako oktálový zápis a vráti 87.0.0.1, zatiaľ čo systémový resolver cez dns.lookup() vráti 127.0.0.1. Certifikát s DNS:87.0.0.1 tak overí spojenie na localhost. Oprava od Mattea Collinu odmieta hostov, ktorí sa stanú IP adresou až po domainToASCII(). Ten istý commit rieši aj CVE-2026-106072 (medium), keď nekanonická IPv4 adresa nechá DNS SAN overiť IP koncový bod.

CVE-2026-105483 (high, len 24.x a 26.x): IP adresa zapísaná plnoširokými číslicami, teda 127.0.0.1, prešla proti certifikátu pre 127.0.0.1. Ide o regresiu a commit Jamesa Snella ju opisuje slovami „chyba nízkej závažnosti, ktorá sa nezneužíva ľahko, kontrola hostname sa jednoducho dá obísť". Projekt ju napriek tomu označil ako high, čo je jeden z rozporov tohto vydania.

CVE-2026-105482 (high, všetky vetvy): dns.resolve*() odovzdávalo mená obsahujúce nulový znak knižnici c-ares, ktorá ako C kód číta reťazec len po prvú nulu. Z dopytu example.com\0.trusted.corp tak vznikol dopyt na example.com. Ak aplikácia najprv validuje, že meno končí na dôveryhodnú doménu, a potom ho pošle do resolvera, validuje niečo iné, než sa skutočne opýta. Opravená verzia vyhodí ERR_INVALID_ARG_VALUE.

K TLS patrí ešte jedna zmena bez čísla CVE. Mozilla dostala 17. októbra hlásenie, že boli kompromitované privátne kľúče ôsmich medziľahlých certifikátov autority eMudhra (emSign), a prehliadače ich počas 17. až 19. októbra zablokovali. Node.js reaguje vo všetkých troch verziách: reťazce obsahujúce blokované verejné kľúče odmieta s chybou CERT_REVOKED a koreňové úložisko z NSS 3.131.1 už koreň emSign ECC Root CA - G3 neobsahuje. Ak vaša aplikácia volá API, ktorého certifikát vedie k eMudhre, po aktualizácii spojenie zlyhá. Správna reakcia je tlačiť na prevádzkovateľa API, nie vypínať rejectUnauthorized.

Zvyšok vydania: keep-alive, náhodné čísla v snapshotoch, Permission Model

CVE Závažnosť Vetvy Čo opravuje
CVE-2026-111497 high 26, 24, 22 Brotli dekodér: zápis mimo pamäť, možné spustenie kódu
CVE-2026-105482 high 26, 24, 22 dns.resolve orezáva mená s nulovým znakom
CVE-2026-106069 high 26, 24, 22 TLS: host sa stane IP adresou až po normalizácii
CVE-2026-105483 high 26, 24 TLS: IP adresa plnoširokými číslicami
CVE-2026-105481 medium 26, 24, 22 Keep-alive socket spracuje odpoveď zapísanú pred odoslaním požiadavky
CVE-2026-106072 medium 26, 24, 22 Nekanonická IPv4 nechá DNS SAN overiť IP koncový bod
CVE-2026-106074 medium 26, 24, 22 crypto.randomUUID() a randomInt() opakujú hodnoty v snapshotoch a SEA
CVE-2026-106070 low 26 ZipFile vráti útočníkom riadené bajty po neplatnej hlavičke
CVE-2026-106071 low 26 Permission Model: nadbytočné oprávnenia cez wildcard
CVE-2026-106073 low 26, 24, 22 Permission Model: obídenie cez fs.realpathSync

Zo stredných troch stojí za pozornosť CVE-2026-106074. Kto distribuuje aplikáciu ako single executable (SEA) alebo používa štartovacie snapshoty, má v binárke zapečené cache entropie, takže každý spustený proces generuje rovnaké UUID a rovnaké „náhodné" čísla. Aktualizácia runtime nestačí, tieto artefakty treba znovu zostaviť. Keep-alive chyba sa týka HTTP agenta, ktorý mohol priradiť požiadavke odpoveď, ktorá na sockete ležala ešte pred jej odoslaním. Chyby v Permission Modeli sa vás netýkajú, ak --permission nepoužívate.

Koho sa to týka: podporované vetvy dostali opravu, 20.x a 25.x nie

Opravu dostali tri podporované vetvy. 22.x (Jod) je v údržbovom LTS do 30. apríla 2027, 24.x (Krypton) podľa plánu prešlo 20. októbra do údržbového režimu a končí 30. apríla 2028, 26.x je zatiaľ Current a 28. októbra sa stane LTS. V ten istý deň začína alfa fáza Node.js 27 s novým ročným cyklom.

Node.js 20.x skončilo 30. apríla 2026, 25.x 1. júna 2026, a Node.js pripomína, že verzie po konci životnosti sú pri každom bezpečnostnom vydaní postihnuté a opravu nedostanú. To je v praxi najväčšia skupina ohrozených: Node 20 je stále predvolená verzia na mnohých hostingoch, v Debiane trixie a v množstve Dockerfile. Prechod z 20 na 22 je zvyčajne bezbolestný, z 20 na 24 vyžaduje otestovať natívne moduly. Čo obnáša voľba verzie na hostingu, rozoberá náš sprievodca Node.js hosting: čo potrebujete vedieť.

Kde opravu vziať, stav 22. októbra dopoludnia:

  • nodejs.org, nvm, fnm: opravené verzie sú v index.json od vydania, nvm install 24 ich stiahne rovno.
  • Docker Hub: tagy 22.23.4, 24.22.1, 26.12.1 a ich slim varianty boli nahrané 21. októbra večer (slim) a 22. októbra po 02:30 UTC (plné a alpine). Plávajúce tagy node:22, node:24 a node:26 sa posunuli, obraz pinovaný na node:24.22.0 zostáva zraniteľný. Stavajte s docker build --pull.
  • NodeSource: 22.23.4 a 24.22.1 v repozitároch. Homebrew: node, node@24 aj node@22 aktualizované.
  • Alpine: opravený len nodejs-current 26.12.1 v edge; balíky nodejs v stabilných vetvách zatiaľ nie. Debian: tracker eviduje chybu ako neopravenú vo všetkých vetvách (bookworm má Node 18, trixie 20), oprava tam príde cez libbrotli. Fedora: 22.23.4 ani 24.22.1 zatiaľ nie sú. Chocolatey: nodejs-lts čaká na moderáciu na 24.22.0.

Ako reagujú provideri: CloudLinux stavia, Plesk opravil len Windows, Vercel nasadil WAF

Na rozdiel od PHP tentoraz žiadny český ani slovenský hosting nič nepublikoval. Webglobe, Websupport, Forpsi, nextHosting aj Český hosting mali 21. a 22. októbra na stavových stránkach a blogoch len PHP. Nie je to prekvapivé: Node.js na zdieľanom hostingu zvyčajne beží cez CloudLinux Node.js Selector a oprava príde s jeho balíkmi.

Provider / platforma Stav (22. 10. 2026, 12:30 UTC)
CloudLinux Incident od 10:28 UTC: stavia alt-nodejs 22.23.4, 24.22.1 a 26.12.1 pre CloudLinux OS 7 až 9 a TuxCare 7 až 10, plus ea-nodejs22 pre cPanel. Do stabilných repozitárov sľubuje do 12:40 UTC. Buildy pre staršie, už nepodporované verzie Node.js, ktoré CloudLinux ďalej dodáva, bežia tiež a ich čísla oznámi zvlášť.
cPanel EasyApache 4 Verzia 25.91 z 21. októbra rieši PHP, libcurl a nginx, ea-nodejs v changelogu nemá. Opravený ea-nodejs22 príde cez CloudLinux.
Plesk Obsidian 18.0.81 Update 4 z 21. októbra aktualizuje Node.js 24.22.1 a 22.23.4 len vo Windows sekcii. Pre Linux changelog žiadnu položku nemá.
Vercel Bulletin: WAF pravidlá blokujúce prichádzajúci vektor nasadené 21. októbra pre všetky projekty zadarmo, opravené runtime sa „postupne nasadzujú". Projekty na 22.x a 24.x nemusia nič meniť, projekty na Node 20 musia prepnúť verziu a znovu nasadiť. WAF nekryje odpovede, ktoré vaše funkcie samy sťahujú.
Heroku Buildpack v375 (classic) a heroku/nodejs 5.8.4 (CNB) z 21. októbra obsahujú všetky tri verzie. Stačí nový deploy.
Render Nové služby dostávajú predvolenú 24.22.1; služby založené pred 21. októbrom majú staršiu predvolenú verziu. Presne pinované verzie sa neposúvajú.
Paketo node-engine 8.11.0 z 21. októbra.
Netlify, Cloudflare, Railway, Fly.io, AWS Lambda, Google Cloud, Azure, DigitalOcean Žiadne vyhlásenie. Lambda v režime Auto dostane opravu dvojfázovým rolloutom bez udania termínu, obrazy kontajnerov musíte prestavať sami. Na Fly.io je verzia zapísaná v Dockerfile, posuňte ju ručne. Cloudflare Workers nebežia na Node.js, ale na workerd s vlastnou kópiou Brotli; či je zasiahnutý, Cloudflare neuviedol.

Kto nechce čakať na CloudLinux, môže v cPaneli prepnúť aplikáciu na vyššiu hlavnú verziu, ale to opravu neprinesie, kým nový balík nie je v repozitári. Rozumnejšie je sledovať incident a po inštalácii balíkov aplikáciu reštartovať.

Čo urobiť dnes: podľa toho, kde aplikácia beží

Zákazník hostingu s Node.js Selectorom (cPanel, Plesk). Verziu binárky opravuje provider, vy skontrolujte toto:

  1. Zistite verziu, na ktorej aplikácia beží. V cPaneli v Setup Node.js App, v Plesku na karte domény. Ak je to 20 alebo staršia, prepnite na 22 alebo 24 a aplikáciu otestujte; stará vetva opravu nedostane ani od CloudLinuxu, aj keď pre ňu balík vyjde, je to len dočasná záplata na nepodporovaný kód.
  2. Po oznámení providera aplikáciu reštartujte. Tlačidlo Restart v selectore alebo touch tmp/restart.txt pri Passengeri. Bežiaci proces drží starú binárku.
  3. Ak provider nič neoznámil, opýtajte sa konkrétne na alt-nodejs 22.23.4 / 24.22.1. Ako aplikáciu na hostingu správne prevádzkovať, opisuje návod Ako nasadiť Node.js aplikáciu na hosting.

Správca VPS alebo vlastného servera. Tu je zodpovednosť na vás:

  1. Aktualizujte na 26.12.1, 24.22.1 alebo 22.23.4 cez nvm, NodeSource alebo distribučný balík, len čo existuje. Overte node -v.
  2. Zistite, či Node.js používa systémový Brotli: ldd $(which node) | grep brotli na Linuxe, otool -L na macOS. Ak áno, aktualizujte aj libbrotli (1.2.1, 1.1.1 alebo 1.0.10).
  3. Reštartujte všetky procesy: pm2 restart all (a pm2 update, ak sám PM2 beží na starej binárke), systemctl restart, pri kontajneroch rebuild a redeploy.
  4. Znovu zostavte SEA binárky a štartovacie snapshoty, inak zostane chyba s opakovanými UUID.
  5. Dočasné opatrenia, ak nemôžete aktualizovať hneď: v body-parseri nastavte inflate: false (odmietne komprimované telá požiadaviek), pri axiose decompress: false. Pre fetch() žiadne obídenie neexistuje, server môže poslať Brotli bez ohľadu na Accept-Encoding. Pri DNS kontrolujte name.includes('\0') pred volaním dns.resolve*, pri TLS odmietajte hostov, ktorí nie sú IP adresou podľa net.isIP(), ale stanú sa ňou po url.domainToASCII(). Nič z toho nenahrádza aktualizáciu.
  6. Neriešte zlyhanie certifikátov po aktualizácii vypnutím rejectUnauthorized alebo NODE_TLS_REJECT_UNAUTHORIZED=0. Ak spojenie padá na CERT_REVOKED, protistrana používa certifikát od eMudhry a problém má ona.

Vývojár a agentúra. Prejdite projekty podľa verzie runtime a spôsobu nasadenia. Tri rizikové skupiny: čokoľvek na Node 20 alebo staršom, obrazy a Dockerfile s pinovanou patch verziou (node:24.22.0, .nvmrc s presným číslom, volta.node v package.json), a aplikácie, ktoré sťahujú obsah z cudzích serverov (webhooky, scrapery, proxy, image optimizery), pretože tam Brotli dekódovanie prebieha bez vášho vedomia. Rozsah engines.node: ">=24" posunie verziu na väčšine PaaS automaticky, presný pin nie.

Zhrnutie

Node.js opravil desať chýb a jedinú, ktorá môže viesť k spusteniu kódu, zdedil od Googlu, kde oprava osem mesiacov ležala bez bezpečnostného označenia. Vystavený je každý, kto nechá Node.js dekódovať cudzie Brotli dáta, čo vďaka automatickej dekompresii vo fetch(), axiose a Expresse 5 znamená väčšinu aplikácií, ktoré s niečím komunikujú. TLS chyby neumožňujú odpočúvanie každého spojenia, ale v kombinácii s certifikátom od dôveryhodnej autority obídu kontrolu hostname, a presne také certifikáty mohli z kompromitovanej eMudhry vzísť. Oprava je k dispozícii všade okrem stabilných distribučných balíkov; CloudLinux sľúbil alt-nodejs počas stredajšieho poludnia, Plesk pre Linux zatiaľ mlčí. Kto má aplikáciu na Node 20, nemá čo aktualizovať a musí migrovať. Pre majiteľa bežného webu na PHP sa nič nemení; pre každého, kto prevádzkuje Node.js backend, proxy alebo self-hosted Next.js, je to úloha na dnes.

Zdroje: Node.js: October 2026 Security Releases; release notes 26.12.1, 24.22.1, 22.23.4; google/brotli: commit 0ed4268 a releases; Vercel: Node.js security advisory; CloudLinux status; Plesk change log; Node.js release schedule; Convika: Node.js October 2026 security release; lilting.ch: testy proti 24.22.0. Stav k 22. 10. 2026, 14:30 SELČ.

O autorovi

Tomáš Mahrík

Tomáš Mahrík

Full stack developer s 15+ rokmi praxe, ktorý sa na hosting nepozerá len ako používateľ, ale ako človek zodpovedný za prevádzku vlastných projektov na dennej báze.

Zostaňte informovaní

Získajte najnovšie hostingové ponuky, kupóny a odborné tipy priamo do vášho emailu.

Node.js CVE-2026-111497: RCE v Brotli, chyby TLS a DNS