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čkouContent-Encoding: br. Stačí, aby vaša aplikácia stiahla dáta zo servera, ktorý ovláda útočník. PoslaťAccept-Encoding: identitynepomôž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: trueako 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()alebocreateBrotliDecompress()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.jsonod vydania,nvm install 24ich stiahne rovno. - Docker Hub: tagy
22.23.4,24.22.1,26.12.1a ichslimvarianty boli nahrané 21. októbra večer (slim) a 22. októbra po 02:30 UTC (plné a alpine). Plávajúce tagynode:22,node:24anode:26sa posunuli, obraz pinovaný nanode:24.22.0zostáva zraniteľný. Stavajte sdocker build --pull. - NodeSource: 22.23.4 a 24.22.1 v repozitároch. Homebrew:
node,node@24ajnode@22aktualizované. - Alpine: opravený len
nodejs-current26.12.1 v edge; balíkynodejsv 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 cezlibbrotli. 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:
- 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.
- Po oznámení providera aplikáciu reštartujte. Tlačidlo Restart v selectore alebo
touch tmp/restart.txtpri Passengeri. Bežiaci proces drží starú binárku. - 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:
- 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. - Zistite, či Node.js používa systémový Brotli:
ldd $(which node) | grep brotlina Linuxe,otool -Lna macOS. Ak áno, aktualizujte ajlibbrotli(1.2.1, 1.1.1 alebo 1.0.10). - Reštartujte všetky procesy:
pm2 restart all(apm2 update, ak sám PM2 beží na starej binárke),systemctl restart, pri kontajneroch rebuild a redeploy. - Znovu zostavte SEA binárky a štartovacie snapshoty, inak zostane chyba s opakovanými UUID.
- Dočasné opatrenia, ak nemôžete aktualizovať hneď: v body-parseri nastavte
inflate: false(odmietne komprimované telá požiadaviek), pri axiosedecompress: false. Prefetch()žiadne obídenie neexistuje, server môže poslať Brotli bez ohľadu naAccept-Encoding. Pri DNS kontrolujtename.includes('\0')pred volanímdns.resolve*, pri TLS odmietajte hostov, ktorí nie sú IP adresou podľanet.isIP(), ale stanú sa ňou pourl.domainToASCII(). Nič z toho nenahrádza aktualizáciu. - Neriešte zlyhanie certifikátov po aktualizácii vypnutím
rejectUnauthorizedaleboNODE_TLS_REJECT_UNAUTHORIZED=0. Ak spojenie padá naCERT_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Č.

