Bezpečnost

Tři z jedenácti chyb v bezpečnostním vydání Node.js jsou v modelu oprávnění

Node.js vydal 29. července bezpečnostní opravy pro všechny tři podporované řady. Z jedenácti zranitelností jsou tři v modelu oprávnění, tedy ve funkci, která má běžícímu programu zúžit přístup k souborům. U té nejzávažnější stačilo, aby povolená cesta začínala stejně jako sousední soubor, a povolení se rozlilo i na něj.

· 5 zhlédnutí

Node.js vydal 29. července opravy pro všechny tři podporované řady najednou: 26.5.1, 24.18.122.23.2. Oznámení projektu jmenuje jedenáct zranitelností. Vysokou známku dostaly tři: dvě v HTTP/2 a jedna v modelu oprávnění, tedy přímo v té části Nodu, která má běžícímu programu zúžit přístup k souborům. V témž modelu jsou ale i dvě další chyby ze seznamu.

Zatemněný sál s plátnem, na kterém je promítnutý snímek s nápisem Node.js Is Optimistic
Přednáška o Node.js na konferenci PHPBenelux, na plátně titulní snímek. Foto: mattsches, Flickr (CC BY 2.0)

Povolená cesta otevřela i sousední soubor

Nejzávažnější z té trojice je CVE-2026-58043 se známkou 7,5 podle CVSS, tedy vysoká. Model oprávnění si povolené cesty drží ve stromu, který shodné začátky ukládá jen jednou; říká se mu radixový strom. Když do něj přibyla cesta se stejným začátkem jako už uložená větev, označil se za povolený i uzel, který ve stromu vznikl jen jako společný začátek. Povolení se tak rozlilo na cestu, kterou nikdo nezadal.

Jak to vypadá, ukazuje test přidaný spolu s opravou. Program se pustí s přepínačem --permission a s povolením číst a zapisovat soubory secret1, secret2secret3; test pak hlídá, že soubor secret ve stejném adresáři přístupný není, protože v seznamu nestojí.

Vlastní oprava se vejde do pár řádků v jednom hlavičkovém souboru: v porovnávací smyčce se podmínka i > prefix_len mění na i >= prefix_len a přibývá kontrola, že se z uzlu nestane koncový, pokud jím předtím nebyl. Vektor CVSS počítá s útočníkem, který už kód v systému spouští, a s vysokou složitostí útoku. Na vysokou známku ji vytáhne až dopad: přenese se mimo součást, které se chyba týká, a zasáhne důvěrnost i celistvost dat.

Dvakrát se kontrolovala jiná cesta, než na kterou se zapisovalo

Zbylé dvě chyby v modelu oprávnění mají obě známku 3,3, tedy nízkou, a obě dovolily zapsat soubor mimo seznam povolený přepínačem --allow-fs-write.

CVE-2026-56847 šlo o záznamy o běhu: volání trace_events.createTracing().enable() je zapsalo kamkoli. Oprava přidává kontrolu oprávnění, která tam do té doby nebyla vůbec, a k tomu vytahuje skládání jména souboru ze vzoru s ${pid}${rotation} do samostatné funkce, aby se kontrolovala už hotová cesta.

CVE-2026-58039 se týká výpisu stavu procesu (process.report). Kontrola oprávnění dostala jen jméno souboru, kdežto zapisovalo se do něj až po připojení adresáře z přepínače --report-directory. Ptalo se tedy na jinou cestu, než do jaké se pak psalo, a soubor šlo takhle i přepsat. Oprava sestaví celou cestu jako první a teprve tu předá kontrole.

Co model oprávnění slibuje a co ne

Model oprávnění se zapíná přepínačem --permission a odřízne programu přístup k souborům, síti, spouštění procesů, vláknům, nativním doplňkům a dalším věcem naráz; jednotlivá povolení se pak vracejí přepínači jako --allow-fs-read. Přišel v Node.js 20 a od verzí 23.5.0 a 22.13.0 už není označený za experimentální.

Dokumentace ho přitom popisuje jako bezpečnostní pás: má bránit tomu, aby důvěryhodný kód nechtěně sáhl tam, kam nemá. A rovnou dodává, že proti škodlivému kódu neochrání; ten se přes model dostane a spustí si, co chce. Projekt přesto všechny tři nálezy vede jako zranitelnosti s vlastním číslem CVE. Podle nás správně: kdo si přepínač zapne, počítá s tím, že zadaný seznam cest platí doslova.

Zbytek seznamu: HTTP/2, TLS a jedna nedodělaná oprava

Osm dalších chyb míří jinam. Dvě vysoké jsou v HTTP/2. CVE-2026-56846 nechá podržené hlavičky obejít strop maxSessionMemory, takže se dá na dálku vyčerpat paměť. CVE-2026-56848 vede k sáhnutí do už uvolněné paměti, když se odeslání dat zavolá znovu uprostřed jejich přijímání.

Vlastní příběh má CVE-2026-58040. Záznam u ní říká, že jde o neúplnou opravu CVE-2026-48934 z červnového bezpečnostního vydání: znovupoužitá relace TLS v agentovi HTTPS umí přeskočit ověření jména serveru. Původní chyba měla známku 4,3, ta nová 6,3.

Model oprávnění navíc není v takovém seznamu poprvé. Červnové vydání ze 18. června řešilo obcházení modelu přes FileHandle.utimes() (CVE-2026-48935) a server na unixovém socketu, který obešel jeho síťové omezení (CVE-2026-48936), a i ta druhá byla podle oznámení jen neúplnou opravou staršího nálezu.

Zbývají čtyři středně hodnocené a jedna nízká. Agent HTTPS si popletl klíče u certifikátů ve formátu PFX a mohl k požadavku připojit klientskou identitu z jiného certifikátu (CVE-2026-56850). Volání dns.resolveAny() ukončí proces, když odpověď obsahuje víc než 256 záznamů typu A (CVE-2026-58042). Synchronní funkce z node:zlib spadnou na podvržené délce typovaného pole, tedy objektu TypedArray (CVE-2026-58045). A zastaralý iterátor v node:sqlite dokáže znovu spustit připravený dotaz i po jeho resetu s novými parametry (CVE-2026-58041).

Nízko hodnocená CVE-2026-58044 má popis, který stojí za pozornost. Hlavičky nad limit maxHeadersCount Node zahodí z req.headers, ale pro určení hranic zprávy je používá dál. Před kódem aplikace tak umí schovat i hlavičku Content-Length. Předsazená proxy postavená v Nodu, která odchozí hlavičky skládá z toho, co vidí, a tělo požadavku přitom přeposílá po znovupoužitém spojení, pak dokáže požadavky rozsynchronizovat.

Která řada dostala co

Všech jedenáct oprav má jen 24.18.1. Ve 26.5.1 chybí CVE-2026-56846, kterou oznámení hlásí pro řady 24.x a 22.x, a ve 22.23.2 chybí CVE-2026-58041, hlášená pro řady 26.x a 24.x. Ve všech třech vydáních se navíc aktualizovaly knihovny undici a llhttp kvůli veřejně známým dírám.

Node.js 20 opravy nedostal, jeho podpora podle plánu vydání skončila 30. dubna 2026. Oznámení k tomu opakuje obecné pravidlo projektu: verze po konci podpory jsou při bezpečnostním vydání zasažené vždycky. Řada 22 je od loňského října v režimu údržby a končí 30. dubna 2027, řada 24 vydrží do 30. dubna 2028 a řada 26 se na dlouhodobou podporu přepne letos v říjnu.

Vydání se přitom dvakrát odsunulo. Nejdřív o den kvůli dodatečnému testování, pak ještě jednou kvůli potížím s infrastrukturou; oba odklady projekt zapsal přímo do oznámení. Čísla CVE se v registru objevila až po vydání, u CVE-2026-58039 nese záznam datum 31. července.

Bezpečnost

Diskuse

Zatím tu nikdo nediskutuje.

Diskutovat mohou přihlášení čtenáři – přihlaste se nebo si založte účet.

← zpět na výpis