Projekt Node.js vydal ve středu 21. října 2026 bezpečnostní verze 26.12.1, 24.22.1 a 22.23.4, které opravují deset zranitelností, z toho čtyři s vysokou závažností. Nejvážnější je CVE-2026-111497, zápis mimo paměť v dekodéru Brotli zabudovaném do Node.js, který podle projektu umožňuje vzdálené spuštění kódu. Vedle ní vydání opravuje tři chyby v ověřování TLS certifikátů, ořezávání DNS dotazů s nulovým znakem a blokuje certifikáty kompromitované autority eMudhra. Den po kritických chybách v PHP je to druhé velké vydání v týdnu, které se týká většiny webových serverů, a stejně jako u PHP platí, že jedinou úplnou opravou je aktualizace. Tenhle článek shrnuje, co je oficiálně potvrzené, kdo je skutečně vystavený a co má udělat kdo.
Co se stalo: deset chyb, čtyři vysoké, žádné CVSS skóre
Node.js vydání předoznámil 14. října s jedinou informací: nejvyšší závažnost bude „high". Ve středu 21. října v 10:00 UTC vznikly tagy všech tří verzí a krátce po 12:00 UTC projekt stejný příspěvek doplnil o seznam chyb. Oficiální text je stručný: ke každé zranitelnosti uvádí název, postižené větve a poděkování, nic víc. Žádné CVSS skóre, žádný vektor, žádný popis podmínek zneužití. Záznamy na CVE.org byly v době psaní stále ve stavu „reserved" a NVD je neměla. Čísla, která kolují po internetu, tedy nepocházejí od Node.js.
Rozdělení podle závažnosti: čtyři high (Brotli, dvě obejití TLS, DNS), tři medium (keep-alive socket, DNS SAN pro IP adresy, náhodná čísla ve snapshotech) a tři low (ZIP, dvakrát Permission Model). Osm z deseti chyb nahlásili externí výzkumníci přes HackerOne, hlášení zatím nejsou veřejná. Opravy psali členové core týmu James Snell, Matteo Collina, Antoine du Hamel, Filip Skokan a Rafael Gonzaga. Commity byly do veřejných větví přidány 20. října odpoledne, den před vydáním, takže kdo sledoval repozitář, viděl obsah oprav s předstihem.
Vydání kromě CVE aktualizuje i závislosti: c-ares 1.34.9 ve všech větvích, OpenSSL 3.5.9 ve 24.x a 22.x, SQLite 3.53.4 ve 22.x, undici ve všech větvích a kořenové certifikáty z NSS 3.131.1. Nic z toho není označené jako breaking change; jde o patch verze.
CVE-2026-111497: Brotli dekodér zapisuje mimo paměť a volá ho víc kódu, než si myslíte
Chyba není v kódu Node.js samotného, ale v knihovně Brotli od Googlu, kterou Node.js přibaluje a vystavuje přes modul zlib. Oprava v Node.js je cherry-pick upstream commitu „Detect and report invalid stream earlier" od Evgenije Ključnikova z Googlu, datovaného 27. února 2026. Oprava tedy ležela na hlavní větvi Brotli osm měsíců, než ji někdo označil za bezpečnostní. Mechanismus podle analýzy diffu: pokud komprimovaný proud deklaruje jediný typ bloku a pak přesto požádá o přepnutí bloku, dekódování na rychlé cestě tento selhavší krok ignorovalo a pokračovalo, což vedlo k zápisu mimo přidělenou paměť. Opravený dekodér vrací novou chybu BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH a zastaví se. Google ve stejný den vydal Brotli 1.2.1, 1.1.1 a 1.0.10 s jednořádkovou poznámkou o CVE-2026-111497; vlastní advisory ani issue repozitář nemá.
Chybu nahlásil Matteo Collina, správce undici a Fastify, opravu připravil Antoine du Hamel. O tom, jak daleko se dá dostat, Node.js mlčí. Vercel ve svém bulletinu píše, že výzkumníci předvedli únik paměti procesu i spuštění příkazů na neopravených 22.x, 24.x a 26.x, s oprávněním procesu Node.js. Zneužití v praxi nikdo nehlásí a katalog CISA KEV chybu neobsahuje.
Důležitější než mechanismus je otázka, kdo vlastně Brotli dekóduje. Node.js sám od sebe nic nedekomprimuje, ale váš kód nebo knihovny ano, často aniž o tom víte:
- Zabudovaný
fetch()(undici) automaticky rozbaluje odpovědi s hlavičkouContent-Encoding: br. Stačí, aby vaše aplikace stáhla data ze serveru, který ovládá útočník. PoslatAccept-Encoding: identitynepomůže, zlý server může odpovědět Brotli i tak. - axios, got i node-fetch odpovědi dekomprimují ve výchozím nastavení.
- Express 5 používá body-parser 2.x, který od verze 2.0.0 umí Brotli a má
inflate: truejako výchozí. Útočník tedy může poslat komprimované tělo požadavku. Express 4 s body-parserem 1.x Brotli nepodporuje. - Přímé volání
zlib.brotliDecompress(),brotliDecompressSync()nebocreateBrotliDecompress()na cizí data, typicky v proxy, CDN logice nebo při zpracování uploadů. - Self-hosted Next.js: podle Vercelu optimalizace obrázků Brotli odpovědi neblokuje.
Kdo Brotli jen komprimuje, vstupní bod nemá. A pozor na build: Debian a Homebrew staví Node.js s přepínačem --shared-brotli, tedy proti systémové knihovně. Tam opravu nepřinese nová verze Node.js, ale balíček libbrotli. Na Homebrew byl brotli 1.2.1 k dispozici dřív než opravený node. Stejná chyba se týká i dalších projektů s vlastní kopií Brotli: Bun měl backport v době psaní stále v otevřeném pull requestu, nginx modul ngx_brotli aktualizoval submodul 22. října, Chrome opravený kód obsahuje už od března.
TLS a DNS: obejití kontroly hostname, ne klasický MITM na každé spojení
Zpráva, že chyby „umožňují MITM", potřebuje upřesnění. Tři chyby v TLS mají společný vzor: IP adresa zapsaná neobvyklým způsobem se nepozná jako IP adresa, kontrola certifikátu spadne do větve pro doménová jména a certifikát vydaný na jméno pak ověří spojení na IP adresu. Útočník ale musí mít certifikát od autority, které klient věří, s položkou DNS: ve tvaru IP adresy. To není triviální, i když po říjnovém kompromitování eMudhry je to méně teoretické než dřív.
CVE-2026-106069 (high, všechny větve): host se na IP adresu změní až po normalizaci. Příklad z testů opravy: url.domainToASCII() přečte 0127.0.0.1 jako oktalový zápis a vrátí 87.0.0.1, zatímco systémový resolver přes dns.lookup() vrátí 127.0.0.1. Certifikát s DNS:87.0.0.1 tak ověří spojení na localhost. Oprava od Mattea Colliny odmítá hosty, které se stanou IP adresou až po domainToASCII(). Stejný commit řeší i CVE-2026-106072 (medium), kdy nekanonická IPv4 adresa nechá DNS SAN ověřit IP koncový bod.
CVE-2026-105483 (high, jen 24.x a 26.x): IP adresa zapsaná plnošířkovými číslicemi, tedy 127.0.0.1, prošla proti certifikátu pro 127.0.0.1. Jde o regresi a commit Jamese Snella ji popisuje slovy „chyba nízké závažnosti, která se nezneužívá snadno, kontrola hostname se prostě dá obejít". Projekt ji přesto označil jako high, což je jeden z rozporů tohoto vydání.
CVE-2026-105482 (high, všechny větve): dns.resolve*() předávalo jména obsahující nulový znak knihovně c-ares, která jako C kód čte řetězec jen po první nulu. Z dotazu example.com\0.trusted.corp tak vznikl dotaz na example.com. Pokud aplikace nejdřív validuje, že jméno končí na důvěryhodnou doménu, a pak ho pošle do resolveru, validuje něco jiného, než se skutečně zeptá. Opravená verze vyhodí ERR_INVALID_ARG_VALUE.
K TLS patří ještě jedna změna bez čísla CVE. Mozilla dostala 17. října hlášení, že byly kompromitovány privátní klíče osmi mezilehlých certifikátů autority eMudhra (emSign), a prohlížeče je během 17. až 19. října zablokovaly. Node.js reaguje ve všech třech verzích: řetězce obsahující blokované veřejné klíče odmítá s chybou CERT_REVOKED a kořenové úložiště z NSS 3.131.1 už kořen emSign ECC Root CA - G3 neobsahuje. Pokud vaše aplikace volá API, jehož certifikát vede k eMudhře, po aktualizaci spojení selže. Správná reakce je tlačit na provozovatele API, ne vypínat rejectUnauthorized.
Zbytek vydání: keep-alive, náhodná čísla ve snapshotech, Permission Model
| CVE | Závažnost | Větve | Co opravuje |
|---|---|---|---|
| CVE-2026-111497 | high | 26, 24, 22 | Brotli dekodér: zápis mimo paměť, možné spuštění kódu |
| CVE-2026-105482 | high | 26, 24, 22 | dns.resolve ořezává jména s nulovým znakem |
| CVE-2026-106069 | high | 26, 24, 22 | TLS: host se stane IP adresou až po normalizaci |
| CVE-2026-105483 | high | 26, 24 | TLS: IP adresa plnošířkovými číslicemi |
| CVE-2026-105481 | medium | 26, 24, 22 | Keep-alive socket zpracuje odpověď zapsanou před odesláním požadavku |
| CVE-2026-106072 | medium | 26, 24, 22 | Nekanonická IPv4 nechá DNS SAN ověřit IP koncový bod |
| CVE-2026-106074 | medium | 26, 24, 22 | crypto.randomUUID() a randomInt() opakují hodnoty ve snapshotech a SEA |
| CVE-2026-106070 | low | 26 | ZipFile vrátí útočníkem řízené bajty po neplatné hlavičce |
| CVE-2026-106071 | low | 26 | Permission Model: nadbytečná oprávnění přes wildcard |
| CVE-2026-106073 | low | 26, 24, 22 | Permission Model: obejití přes fs.realpathSync |
Z prostředních tří stojí za pozornost CVE-2026-106074. Kdo distribuuje aplikaci jako single executable (SEA) nebo používá startovací snapshoty, má v binárce zapečené cache entropie, takže každý spuštěný proces generuje stejná UUID a stejná „náhodná" čísla. Aktualizace runtime nestačí, tyto artefakty je potřeba znovu sestavit. Keep-alive chyba se týká HTTP agenta, který mohl přiřadit požadavku odpověď, která na socketu ležela ještě před jeho odesláním. Chyby v Permission Modelu se vás netýkají, pokud --permission nepoužíváte.
Koho se to týká: podporované větve dostaly opravu, 20.x a 25.x ne
Opravu dostaly tři podporované větve. 22.x (Jod) je v údržbovém LTS do 30. dubna 2027, 24.x (Krypton) podle plánu přešlo 20. října do údržbového režimu a končí 30. dubna 2028, 26.x je zatím Current a 28. října se stane LTS. Ve stejný den začíná alfa fáze Node.js 27 s novým ročním cyklem.
Node.js 20.x skončilo 30. dubna 2026, 25.x 1. června 2026, a Node.js připomíná, že verze po konci životnosti jsou při každém bezpečnostním vydání postižené a opravu nedostanou. To je v praxi největší skupina ohrožených: Node 20 je stále výchozí verze na řadě hostingů, v Debianu trixie a v mnoha Dockerfile. Přechod z 20 na 22 je obvykle bezbolestný, z 20 na 24 vyžaduje otestovat nativní moduly. Co obnáší volba verze na hostingu, rozebírá náš průvodce Node.js hosting: co potřebujete vědět.
Kde opravu vzít, stav 22. října dopoledne:
- nodejs.org, nvm, fnm: opravené verze jsou v
index.jsonod vydání,nvm install 24je stáhne rovnou. - Docker Hub: tagy
22.23.4,24.22.1,26.12.1a jejichslimvarianty byly nahrané 21. října večer (slim) a 22. října po 02:30 UTC (plné a alpine). Plovoucí tagynode:22,node:24anode:26se posunuly, obraz pinovaný nanode:24.22.0zůstává zranitelný. Stavějte sdocker build --pull. - NodeSource: 22.23.4 a 24.22.1 v repozitářích. Homebrew:
node,node@24inode@22aktualizované. - Alpine: opravený jen
nodejs-current26.12.1 v edge; balíčkynodejsve stabilních větvích zatím ne. Debian: tracker eviduje chybu jako neopravenou ve všech větvích (bookworm má Node 18, trixie 20), oprava tam přijde přeslibbrotli. Fedora: 22.23.4 ani 24.22.1 zatím nejsou. Chocolatey:nodejs-ltsčeká na moderaci na 24.22.0.
Jak reagují provideři: CloudLinux staví, Plesk opravil jen Windows, Vercel nasadil WAF
Na rozdíl od PHP tentokrát žádný český ani slovenský hosting nic nepublikoval. Webglobe, Websupport, Forpsi, nextHosting i Český hosting měly 21. a 22. října na stavových stránkách a blozích jen PHP. Není to překvapivé: Node.js na sdíleném hostingu obvykle běží přes CloudLinux Node.js Selector a oprava přijde s jeho balíčky.
| Provider / platforma | Stav (22. 10. 2026, 12:30 UTC) |
|---|---|
| CloudLinux | Incident od 10:28 UTC: staví alt-nodejs 22.23.4, 24.22.1 a 26.12.1 pro CloudLinux OS 7 až 9 a TuxCare 7 až 10, plus ea-nodejs22 pro cPanel. Do stabilních repozitářů slibuje do 12:40 UTC. Buildy pro starší, už nepodporované verze Node.js, které CloudLinux dál dodává, běží také a jejich čísla oznámí zvlášť. |
| cPanel EasyApache 4 | Verze 25.91 z 21. října řeší PHP, libcurl a nginx, ea-nodejs v changelogu nemá. Opravený ea-nodejs22 přijde přes CloudLinux. |
| Plesk | Obsidian 18.0.81 Update 4 z 21. října aktualizuje Node.js 24.22.1 a 22.23.4 jen ve Windows sekci. Pro Linux changelog žádnou položku nemá. |
| Vercel | Bulletin: WAF pravidla blokující příchozí vektor nasazena 21. října pro všechny projekty zdarma, opravené runtime se „postupně nasazují". Projekty na 22.x a 24.x nemusí nic měnit, projekty na Node 20 musí přepnout verzi a znovu nasadit. WAF nekryje odpovědi, které vaše funkce samy stahují. |
| Heroku | Buildpack v375 (classic) a heroku/nodejs 5.8.4 (CNB) z 21. října obsahují všechny tři verze. Stačí nový deploy. |
| Render | Nové služby dostávají výchozí 24.22.1; služby založené před 21. říjnem mají starší výchozí verzi. Přesně pinované verze se neposouvají. |
| Paketo | node-engine 8.11.0 z 21. října. |
| Netlify, Cloudflare, Railway, Fly.io, AWS Lambda, Google Cloud, Azure, DigitalOcean | Žádné prohlášení. Lambda v režimu Auto dostane opravu dvoufázovým rolloutem bez udání termínu, obrazy kontejnerů musíte přestavět sami. Na Fly.io je verze zapsaná v Dockerfile, posuňte ji ručně. Cloudflare Workers neběží na Node.js, ale na workerd s vlastní kopií Brotli; zda je zasažený, Cloudflare neuvedl. |
Kdo nechce čekat na CloudLinux, může v cPanelu přepnout aplikaci na vyšší hlavní verzi, ale to opravu nepřinese, dokud nový balíček není v repozitáři. Rozumnější je sledovat incident a po instalaci balíčků aplikaci restartovat.
Co udělat dnes: podle toho, kde aplikace běží
Zákazník hostingu s Node.js Selectorem (cPanel, Plesk). Verzi binárky opravuje provider, vy zkontrolujte tohle:
- Zjistěte verzi, na které aplikace běží. V cPanelu v Setup Node.js App, v Plesku na kartě domény. Pokud je to 20 nebo starší, přepněte na 22 nebo 24 a aplikaci otestujte; stará větev opravu nedostane ani od CloudLinuxu, i když pro ni balíček vyjde, je to jen dočasná záplata na nepodporovaný kód.
- Po oznámení providera aplikaci restartujte. Tlačítko Restart v selectoru nebo
touch tmp/restart.txtu Passengeru. Běžící proces drží starou binárku. - Pokud provider nic neoznámil, zeptejte se konkrétně na alt-nodejs 22.23.4 / 24.22.1. Jak aplikaci na hostingu správně provozovat, popisuje návod Jak nasadit Node.js aplikaci na hosting.
Správce VPS nebo vlastního serveru. Tady je odpovědnost na vás:
- Aktualizujte na 26.12.1, 24.22.1 nebo 22.23.4 přes nvm, NodeSource nebo distribuční balíček, jakmile existuje. Ověřte
node -v. - Zjistěte, jestli Node.js používá systémový Brotli:
ldd $(which node) | grep brotlina Linuxu,otool -Lna macOS. Pokud ano, aktualizujte ilibbrotli(1.2.1, 1.1.1 nebo 1.0.10). - Restartujte všechny procesy:
pm2 restart all(apm2 update, pokud sám PM2 běží na staré binárce),systemctl restart, u kontejnerů rebuild a redeploy. - Znovu sestavte SEA binárky a startovací snapshoty, jinak zůstane chyba s opakovanými UUID.
- Dočasná opatření, pokud nemůžete aktualizovat hned: v body-parseru nastavte
inflate: false(odmítne komprimovaná těla požadavků), u axiosudecompress: false. Profetch()žádné obejití neexistuje, server může poslat Brotli bez ohledu naAccept-Encoding. U DNS kontrolujtename.includes('\0')před volánímdns.resolve*, u TLS odmítejte hosty, které nejsou IP adresou podlenet.isIP(), ale stanou se jí pourl.domainToASCII(). Nic z toho nenahrazuje aktualizaci. - Neřešte selhání certifikátů po aktualizaci vypnutím
rejectUnauthorizedneboNODE_TLS_REJECT_UNAUTHORIZED=0. Pokud spojení padá naCERT_REVOKED, protistrana používá certifikát od eMudhry a má problém ona.
Vývojář a agentura. Projděte projekty podle verze runtime a způsobu nasazení. Tři rizikové skupiny: cokoliv na Node 20 nebo starším, obrazy a Dockerfile s pinovanou patch verzí (node:24.22.0, .nvmrc s přesným číslem, volta.node v package.json), a aplikace, které stahují obsah z cizích serverů (webhooky, scrapery, proxy, image optimizers), protože tam Brotli dekódování probíhá bez vašeho vědomí. Rozsah engines.node: ">=24" posune verzi na většině PaaS automaticky, přesný pin ne.
Shrnutí
Node.js opravil deset chyb a jedinou, která může vést ke spuštění kódu, zdědil od Googlu, kde oprava osm měsíců ležela bez bezpečnostního označení. Vystavený je každý, kdo nechá Node.js dekódovat cizí Brotli data, což díky automatické dekompresi ve fetch(), axiosu a Expressu 5 znamená většinu aplikací, které s něčím komunikují. TLS chyby neumožňují odposlech každého spojení, ale v kombinaci s certifikátem od důvěryhodné autority obejdou kontrolu hostname, a přesně takové certifikáty mohly z kompromitované eMudhry vzejít. Oprava je k dispozici všude kromě stabilních distribučních balíčků; CloudLinux slíbil alt-nodejs během středečního poledne, Plesk pro Linux zatím mlčí. Kdo má aplikaci na Node 20, nemá co aktualizovat a musí migrovat. Pro majitele běžného webu na PHP se nic nemění; pro každého, kdo provozuje Node.js backend, proxy nebo self-hosted Next.js, je to úkol na dnešek.

