Keras opravil čtení cizích souborů přes odkazy v HDF5 už potřetí za půl roku
Soubor s váhami pro Keras nemusí obsahovat žádná data – stačí, když ukáže na jiný soubor HDF5 na disku oběti, a knihovna ho poslušně načte do modelu. Hlášení CVE-2026-9335 vyšlo 2. srpna 2026, opravená vydání byla přitom ke stažení už od konce června. Je to třetí zranitelnost téhož druhu od února a pokaždé za ní stojí jiný odkazovací mechanismus téhož formátu.

Model se v knihovně Keras ukládá do souboru .keras, .h5 nebo .weights.h5 a uvnitř všech tří je formát HDF5. Ten umí proti obyčejnému archivu jednu věc navíc: místo dat může uložit odkaz do jiného souboru na disku. Knihovna h5py takový odkaz při běžném přístupu k položce tiše následuje, a přesně na tom stojí zranitelnost CVE-2026-9335, zveřejněná 2. srpna 2026.
Necelý kilobajt, ve kterém není ani řádek kódu
Keras má pomocné funkce safe_get_h5_group a safe_get_h5_dataset, jejichž jediným úkolem je odkazy typu ExternalLink a SoftLink odmítnout. Dvě místa je obcházela: veřejná utilita KerasFileEditor na prohlížení a úpravu souborů s váhami a větev pro staré soubory .h5 ve funkci load_weights. Obě sahaly do stromu HDF5 přímo, takže odkaz následovaly.
V popisu opravy (návrh změny 22899) stojí, že podvržený soubor stačí velký zhruba 944 bajtů a neobsahuje žádný kód v Pythonu, takže projde jakoukoli obranou postavenou na statické analýze. To je na celé věci podstatné: nástroje, které soubory s modelem prověřují, hledají hlavně nebezpečný pickle a spustitelný kód. Tady žádný není.
Co se dá takhle přečíst, má svou hranici – cílem odkazu musí být zase soubor HDF5, ne libovolný soubor na disku. Autor opravy jmenuje dva případy, kdy to i tak bolí: cizí uložený stav učení na sdíleném výpočetním clusteru a model stažený do mezipaměti ~/.cache/huggingface. Když si oběť soubor otevře v editoru a uloží, zapíšou se přečtené tenzory ven jako obyčejné datové sady, takže z editoru je rovnou nástroj na odnesení dat.
GitHub dal zranitelnosti známku 6,5 z deseti podle metodiky CVSS 3.0, mimo jiné proto, že se bez součinnosti oběti využít nedá: někdo ten soubor musí načíst. Americká databáze NVD měla svůj záznam 9. srpna 2026 pořád ve stavu „Received“, tedy bez vlastního rozboru a bez vlastní známky.
Bezpečný režim na tohle nedosáhne
Kdo načítá cizí modely, obvykle spoléhá na přepínač safe_mode. Dokumentace funkce load_model ho ale popisuje úzce: rozhoduje o tom, „jestli se zakáže nebezpečná deserializace lambdy“, a výslovně dodává, že „tento argument se týká pouze formátu modelu Keras v3“ (přeloženo). Načítání vah ze starého souboru .h5 tedy nekryje ani zapnutý.
Potřetí od února, pokaždé jiným mechanismem
Odkazovací prvky formátu HDF5 nejsou v Kerasu problém poprvé. Za posledního půl roku vyšla tři hlášení a všechna popisují totéž chování, jen jinou cestou:
- CVE-2026-1669 (18. února 2026, známka 7,1) – takzvané externí úložiště dat. Soubor s váhami směroval čtení na libovolný čitelný soubor na disku a jeho bajty skončily jako hodnoty v modelu.
- CVE-2026-12480 (1. července 2026, známka 5,5) – virtuální datové sady. Hlášení samo o sobě píše, že jde o neúplnou opravu předchozího případu.
- CVE-2026-9335 (2. srpna 2026, známka 6,5) – odkazy
ExternalLinkaSoftLink.
Souvislost není naše domněnka. V popisu poslední opravy stojí, že původní záplata na CVE-2026-1669 přidala kontrolu jen na úrovni datové sady, kdežto stejná pojistka pro skupiny se na tohle místo nedostala. Ke cti projektu patří dodat, že vlastní ukládání v Kerasu odkazy tohohle druhu nikdy nevytváří, takže oprava odmítá jen podvržené soubory a na běžné váhy nesahá.
Oprava byla venku dřív než hlášení
Nález přišel přes platformu huntr 4. května 2026. Návrhy změn 22899 a 22900 vznikly 15. května a do hlavní větve se dostaly 20. května, tedy šestnáct dní po ohlášení. Ve vydání 3.15.0 byly 24. června a ve 3.12.3 o dva dny nato. Veřejný záznam vyšel až 2. srpna, tedy devětatřicet dní po vydání 3.15.0.
Kdo se řídí databázemi zranitelností, dozvěděl se o díře skoro šest týdnů poté, co byla záplata ke stažení. Poznámky k vydání 3.12.3 přitom obě opravy jmenují a popisují, takže informace veřejná byla – jen jinde, než se hledá. Podobný odstup jsme popisovali u rozhraní Open WebUI, tam šlo o osm dní.
Která verze je v pořádku
Rozsah zranitelných verzí má dvě části: všechno pod 3.12.3 a pak řada od 3.13.0 výš. Slovní popis hlášení mluví o verzích do 3.14.0 včetně, strojově čitelný rozsah u téhož záznamu ale sahá až pod 3.15.0, takže zahrnuje i vydání 3.14.1. Rozdíl mezi těmi dvěma údaji hlášení nevysvětluje a bezpečnější je držet se toho širšího.
Řada 3.14 opravu nedostala vůbec. Její poslední vydání 3.14.1 je ze 7. května 2026, tedy z doby před sloučením záplaty, a nic novějšího v téhle větvi nevyšlo – kdo na ní stojí, musí přejít na 3.15. Odpověď „mám aktuální verzi“ tu proto nestačí; rozhoduje číslo.
Zatím poslední vydání jsou 3.15.1 a 3.12.4, obě z 29. července 2026, a obě přinesla další bezpečnostní opravy kolem HDF5 – mimo jiné kontrolu všech mezilehlých skupin při procházení souboru.
Zůstává z toho jedna nepohodlná věc. Soubor s váhami stažený od cizího člověka je vstup jako každý jiný, jenže kontroly, které se dnes na modely pouštějí, hledají spustitelný kód. Podvržený odkaz v HDF5 žádný neobsahuje, a přesto stačí.