Přeskočit na obsah
Bezpečnost 3 min čtení

Knihovna Transformers 5.17 přestala ukládat cizí kód před souhlasem

Knihovna Transformers uměla převzít z modelového repozitáře vlastní způsob generování. Soubor s cizím kódem však stáhla a uložila do mezipaměti dřív, než se uživatele zeptala, zda mu důvěřuje. Verze 5.17 z 9. září pořadí obrátila; záznam CVE-2026-80047 přitom uvádí zasažené verze jen do 5.8.1, ačkoli stejný sled volání zůstal i v 5.16.1.

Otevřený pevný disk s odkrytými plotnami a čtecím ramenem
Odmítnutí cizího kódu nezrušilo soubor, který už knihovna uložila na disk. Foto: Tookapic, Wikimedia Commons (CC0)

Pythonová knihovna Transformers dovoluje nahradit svůj běžný generátor kódem z jiného repozitáře na Hugging Face. Uživatel předá jeho jméno v parametru custom_generate a knihovna si z něj vezme soubor custom_generate/generate.py. Právě pořadí těchto kroků popisuje CVE-2026-80047, zveřejněné 1. září 2026.

Do verze 5.16.1 se soubor nejdřív stáhl a zkopíroval do místní mezipaměti dynamických modulů. Až potom přišlo vyhodnocení trust_remote_code, tedy souhlasu se spuštěním cizího kódu. Když uživatel souhlas odmítl, kód se nespustil. Soubor ale na disku zůstal.

U mezipaměti Transformers už vyšla opačná chyba: na souborovém systému jen pro čtení knihovna vrátila starší soubor, ačkoli na Hubu našla novější. Tentokrát zapisovat mohla, jen se zeptala pozdě.

Dotaz přišel až po zápisu souboru

Chyba není ve funkci, která Python spouští, ale ve sledu tří volání. Metoda load_custom_generate() ve verzi 5.16.1 začínala takto:

module = get_cached_module_file(...)
resolve_trust_remote_code(...)
get_class_in_module("generate", module)

První řádek soubor vyhledal na Hubu, stáhl ho do běžné mezipaměti a pak ho zkopíroval mezi moduly Transformers. Druhý řádek teprve zobrazil dotaz nebo vyhodil chybu, pokud bylo trust_remote_code=False. Třetí řádek modul načetl a spustil. Ochrana tedy správně zastavila poslední krok, nevrátila však ty první dva.

Záznam CVE jmenuje jako cíl adresář ~/.cache/huggingface/modules. Upozorňuje také na možnost, že takto odložený soubor později použije jiný, už důvěryhodný požadavek. Samotné první odmítnutí ale útočný kód nespustilo. Šlo tedy o trvalý zápis bez souhlasu a o riziko pozdějšího použití, ne o okamžité obejití dotazu.

Verze 5.17 obrátila pořadí

Opravu přinesl návrh #48620, otevřený a sloučený 8. září. Mění jediný soubor, přidává 15 řádků a osm odebírá. Nový sled nejdřív přes has_file() ověří, že vzdálený repozitář hledaný soubor vůbec má. Pak vyžádá souhlas a teprve po něm volá funkci, která soubor stáhne:

if not has_file(...):
    raise OSError(...)
resolve_trust_remote_code(...)
module = get_cached_module_file(...)

Kontrola existence dál komunikuje s Hubem, ale obsah generate.py na disk neukládá. Poznámky k vydání 5.17.0 změnu uvádějí v oddílu o generování větou o odstranění bezpodmínečného stahování vzdáleného souboru. Číslo CVE u ní nestojí. Hotový balíček se na PyPI objevil 9. září v 15.39 UTC.

Veřejný rozsah verzí končí u 5.8.1

Bezpečnostní tiket NixOS přebírá ze záznamu CVE rozsah od 4.49.0 do 5.8.1. První z těchto balíčků vyšel v únoru 2025, poslední v květnu 2026. Jenže v následující verzi 5.9.0 stojí get_cached_module_file() pořád před resolve_trust_remote_code(). Totéž platí pro 5.16.1 z 26. srpna.

Stejný sled ukazuje přímo porovnání zdrojových souborů. Verze 5.16.1 proti staršímu vydání zpřísnila souhlas i pro kód z místního adresáře, stažení vzdáleného souboru před souhlasem však ponechala. První veřejné vydání, u kterého lze obrácené pořadí doložit, je 5.17.0. Veřejně uvedený konec rozsahu na 5.8.1 proto nepopisuje všechny balíčky se stejnou chybou v toku programu.

Běžného načtení modelu se tahle cesta netýká

Funkce se nepouštěla při každém stažení vah. Sporná větev začínala tehdy, když program přímo zavolal load_custom_generate() nebo předal do generate() vzdálený repozitář v parametru custom_generate. Dokumentace Transformers tu funkci popisuje jako způsob, jak k libovolnému modelu připojit vlastní dekódovací smyčku z Hubu.

Kdo takový parametr nepoužívá, na tuto konkrétní chybu nenaráží. Kdo ho používá se vzdáleným repozitářem, má opravené pořadí od verze 5.17.0. Povýšení balíčku přitom řeší až další stažení. Návrh #48620 dříve uložené dynamické moduly nemaže.

Zdroje

Diskuse

Zatím tu nikdo nediskutuje. Můžete být první.

Napsat příspěvek

Diskutovat můžete i bez účtu. S registrací se ale příspěvek zveřejní hned a nemusíte pokaždé vyplňovat jméno. Účet už máte? Přihlaste se.

Nezveřejňujeme ho, slouží jen redakci.

Podporuje zápis Texy: **tučně**, *kurzíva*, odrážky, odkazy.

Dál k tématu

  1. Infrastruktura

    Opravy, které OpenAI uvádí z testů izolace modelů, vznikly dřív, než pozastavila trénink

    OpenAI 23. října popsala, jak její agenti při zkouškách unikali z virtuálních strojů a hledali cestu na internet. Jako doklad uvádí opravy v Kata Containers, gVisoru a…

  2. Bezpečnost

    Na příčinu chyb PHP2Shell, připisovaných modelům, narazil vývojář PHP už v roce 2024

    Nadace PHP zveřejnila 21. října časovou osu dvou kritických chyb, kterým se říká PHP2Shell. První náznaky problému s docházející pamětí podle ní našel vývojář placený…

  3. Bezpečnost

    Doloženou opravu chyby Plugin4Shell mají ze čtyř agentů jen Claude Code a Codex

    Firma Air Security v září popsala, jak u Claude Code, Codexu, GitHub Copilotu a Gemini CLI podvrhnout plugin, který tržiště připnulo na prověřený commit. Anthropic chybu…

  4. Bezpečnost

    Agenti z Tencent Cloud se hlásili jako Claude, styl jejich kódu ale Claudovi neodpovídá

    Agenti AI běžící na Tencent Cloud se mezi 28. zářím a 8. říjnem 2026 přes 2 600krát pokusili stáhnout data z mapové služby Amap, obcházeli její ochranu proti robotům a…