Xinference spouštěl odpověď modelu jako kód
Při zpracování volání nástrojů pro Llama 3 posílal Xinference výstup modelu do pythonové funkce eval(). Nově zveřejněná chyba CVE-2026-61539 tak v testovaném výchozím nasazení otevírala cestu ke spuštění příkazů na serveru bez přihlášení. Oprava je součástí verze 2.7.0 už od dubna.

Bezpečnostní upozornění na kritickou chybu CVE-2026-61539 vyšlo 21. srpna. Oprava přitom leží ve veřejném repozitáři od 14. dubna a do vydání Xinference 2.7.0 se dostala 25. dubna. Kdo zůstal u verze 2.5.0 nebo starší, dozvěděl se o důvodu k aktualizaci až o čtyři měsíce později.
Požadavek prošel až k funkci eval()
Xinference zpřístupňuje místně provozované jazykové, obrazové a další modely přes rozhraní podobné API od OpenAI. Dotčená cesta začínala u neproudového požadavku na /v1/chat/completions, který obsahoval seznam nástrojů. Při použití backendu Transformers se odpověď dostala do dodatečného zpracování a u formátu pro Llama 3 skončila v parseru volání nástrojů.
Parser očekával text připomínající pythonový slovník: jméno nástroje a jeho parametry. Místo prostého načtení dat ale volal eval(model_output, {}, {}). Python tím text nečetl jako data, nýbrž jako výraz. Prázdné slovníky pro globální a místní proměnné z toho bezpečné pískoviště neudělají; běžící proces má stále přístup k objektům jazyka a přes ně lze dojít ke spuštění kódu.
Útočník nemusel ovládat model ani nástroj
Slabé místo nebylo ve vahách Llamy 3. Podstatné bylo, že text, který model vytvořil, Xinference následně vyhodnotil jako program. Podle upozornění mohl vzdálený útočník ovlivnit výstup vhodně sestaveným vstupem do chatu a požadavkem s nástroji. Když model vrátil výraz místo očekávaných dat, server ho provedl pod účtem procesu Xinference.
Autoři hlášení ověřovali výchozí nasazení bez zapnutého přihlašování. V něm stačil síťový přístup k API, nebyla nutná žádná práva ani akce dalšího uživatele. Právě z těchto podmínek vychází známka 10,0 podle CVSS 3.1: útok po síti, nízká složitost, žádné přihlášení a vysoký dopad na důvěrnost, integritu i dostupnost. Neznamená to, že každá instalace byla automaticky dosažitelná z internetu; rozhoduje její síťové vystavení a nastavení přístupu.
Oprava zachovala oba očekávané formáty
Opravný commit nahradil eval() na dvou místech. Parser nejdřív zkusí json.loads(), tedy běžný formát JSON, který modely pro volání nástrojů vracejí. Když text používá pythonový zápis s jednoduchými uvozovkami nebo hodnotami True, False a None, přejde na ast.literal_eval(). Ten přijímá literály, ale odmítá volání funkcí a další spustitelné výrazy.
Změna přidala také 25 testů. Pokrývají platný JSON, vnořené parametry, pythonové literály, poškozený vstup i několik tříd výrazů, které se nesmějí provést. Vývojář při opravě prošel i šest dalších parserů nástrojů; ty už používaly json.loads(). Chyba tak nebyla obecným problémem všech modelů podporovaných Xinference, ale dvou cest určených pro formát Llamy 3.
Opravená verze vyšla před veřejným upozorněním
První veřejné hlášení v repozitáři vzniklo 18. února. Po měsíci ho automat zavřel jako neaktivní, aniž by se nebezpečný kód změnil. Druhé hlášení číslo 4769 ze 6. dubna ukázalo na stejná dvě místa. O osm dní později projekt opravu přijal.
V poznámkách k vydání 2.7.0 stojí změna mezi opravami chyb a výslovně mluví o nahrazení eval() bezpečnými postupy kvůli vzdálenému spuštění kódu. Samostatné bezpečnostní upozornění a identifikátor CVE ale přibyly teprve 21. srpna. Časová osa vysvětluje nezvyklou situaci: záplata není nová, nové je přesné vymezení dopadu a kritická známka.
Rozhoduje skutečně nainstalovaná verze
Databáze GitHubu uvádí jako dotčený balíček xinference z PyPI ve verzi 2.5.0 a starší; první opravená je 2.7.0. Stejnou cílovou verzi uvádí také nezávislá databáze GitLabu. Provozovatel tedy potřebuje zkontrolovat verzi v prostředí, ze kterého server opravdu startuje, ne jen číslo v instalačním souboru nebo značku obrazu.
Aktualizace na 2.7.0 či novější odstraňuje oba nebezpečné průchody. Do té doby snižuje riziko omezení API na důvěryhodnou síť a zapnutí ověřování přístupu, ale samo chybu v parseru neopraví. Jestli je starší server dosažitelný pro cizí vstupy a zpracovává volání nástrojů pro Llamu 3, je odstavení této funkce bezpečnější než spoléhat na to, že model závadný výraz nevytvoří.
Zdroje: bezpečnostní upozornění GHSA-x2rj-828p-hx9m, hlášení chyby číslo 4769, opravný commit, vydání Xinference 2.7.0, záznam CVE-2026-61539 v NVD a GitLab Advisory Database.