Knihovna wandb před verzí 0.29.0 nehlídala cestu ke staženému souboru
Klient wandb před verzí 0.29.0 spojil zvolenou složku s názvem souboru ze serveru, aniž odmítl nadřazené nebo absolutní cesty. Kompromitovaný či útočníkem provozovaný backend proto mohl při stažení zapisovat jinam na počítači uživatele. Oprava byla na PyPI od 26. srpna; CVE-2026-91771 vyšlo 15. září.
Veřejný záznam CVE-2026-91771 přibyl 15. září 2026. Týká se Pythonové knihovny wandb, přes kterou se z platformy Weights & Biases stahují soubory z běhů a artefakty s daty nebo modely. Verze před 0.29.0 neověřovaly, zda cesta vrácená serverem zůstane uvnitř složky, kterou uživatel pro stažení zvolil.

Cestu skládalo jméno ze serveru
Dokumentace metody File.download() popisuje parametr root jako místní složku, do které se má soubor uložit. Kód ve verzi 0.28.0 však vzal tento kořen a připojil k němu hodnotu self.name prostým voláním os.path.join. Jméno přitom podle veřejného hlášení nálezce pochází z odpovědi GraphQL serveru.
Když takové jméno obsahuje odkaz na nadřazenou složku nebo absolutní cestu, spojení už nemusí mířit pod root. Tomuto druhu chyby se říká path traversal, tedy únik z určené části souborového systému pomocí cesty. Starší klient pak data zapsal tam, kam ukazovalo jméno ze serveru. Už existující soubor sice bez volby replace=True nepřepsal, nový soubor mimo zvolenou složku ale vytvořit mohl.
Podmínka útoku je podstatná. Cestu musel ovládat backend a uživatel musel stažení spustit. Nešlo tedy o možnost, jak z internetu bez dalšího kroku napadnout každý počítač s knihovnou wandb. Riziko se týkalo klienta připojeného ke kompromitované nebo útočníkem provozované instalaci. W&B vedle svého cloudu nabízí také vlastní instalaci Self-Managed, za jejíž zabezpečení a aktualizace odpovídá provozovatel.
Oprava kontroluje unixové i windowsové cesty
Opravný commit mění v metodě File.download() jediný řádek: místo přímého spojení cesty volá validate_fspath. Vlastní kontrola odmítá absolutní cesty a části ... Cestu rozebírá současně jako unixovou a windowsovou, takže zachytí také písmeno disku nebo síťovou cestu zapsanou pro Windows.
Změna je širší než jedna metoda. Popis návrhu číslo 12516 uvádí, že dřívější pojistka už hlídala běžné stahování artefaktu, ale ne cestu přes artifact.files() a File.download(). Bez kontroly zůstalo také jméno artefaktu použité jako výchozí cílová složka. Nové testy proto zahrnují relativní únik, unixovou absolutní cestu, windowsové písmeno disku i síťovou cestu.
Podobný směr cesty už se v archivu objevil u indexu vah v knihovně Transformers. Tam nedůvěryhodný místní soubor vedl ke čtení mimo složku modelu. U wandb posílal cestu server a klient podle ní zapisoval. Jde tedy o jiný produkt, jiný zdroj vstupu a opačnou operaci se souborem.
Opravená verze předběhla číslo CVE o dvacet dní
Nálezce v hlášení píše, že chybu poslal firmě e-mailem 15. června a připomněl ji 29. června a 4. srpna. Vývojář W&B otevřel opravný návrh 20. srpna a o den později ho projekt začlenil. Verze wandb 0.29.0 vyšla 26. srpna a její poznámky už odmítání relativních cest uvádějí v oddílu Security.
Číslo CVE vydala firma VulnCheck až 15. září. Rozdíl mezi veřejným vydáním opravy a záznamem je vlastním přepočtem kalendářních dat dvacet dní. Správci, kteří sledují jen databáze zranitelností, se tak o chybě dozvěděli později než ti, kteří čtou poznámky k vydání. PyPI nyní nabízí verzi 0.30.0; hranicí opravy zůstává 0.29.0.
Známku 8,8 zatím NVD nepotvrdila vlastním rozborem
VulnCheck ohodnotil chybu známkou 8,8 podle CVSS 3.1 a 8,7 podle CVSS 4.0; obě znamenají vysokou závažnost. Starší vektor počítá se síťovým útokem bez oprávnění, ale s účastí uživatele. Dopad může být vysoký, pokud zápis zasáhne soubor, který systém později načte nebo spustí.
Nejde však o tři nezávislá bodování. NVD vede záznam ve stavu Received a přebírá známky i popis od VulnChecku. Databáze GitHubu ho označuje jako unreviewed a nemá u něj vyplněný dotčený balíček. Samotný rozdíl mezi kódem 0.28.0 a 0.29.0 chybu potvrzuje, ale veřejné podklady neuvádějí zneužití v provozu ani vlastní hodnocení výrobce.
Kdo knihovnu používá, může nejdřív ověřit její verzi v seznamu závislostí nebo přímo v Pythonu. Vydání 0.29.0 a novější popsaný únik cesty odmítají. Kontrola staženého artefaktu pomocí Artifact.verify() aktualizaci nenahrazuje: podle dokumentace se spouští až po stažení a porovnává obsah s manifestem. Chybě bylo potřeba zabránit ještě před zápisem na disk, což dělá právě nová kontrola cesty.
Zdroje
- Hlášení číslo 12592 v repozitáři wandb – původ jména souboru, podmínky útoku a časová osa oznámení
- Opravný commit W&B – změna validace a testované tvary cest
- Hlášení VulnCheck – dotčené verze, datum a známky CVSS
- Poznámky k vydání wandb 0.29.0 – datum dostupnosti opravy a oddíl Security
- Dokumentace
File.download()– význam cílové složkyroot