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

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.

Mapa datových center a síťové infrastruktury ve Spojených státech
Mapa datových center, optických sítí a přenosových linek ve Spojených státech v roce 2025. Foto: DOE / National Renewable Energy Laboratory (NREL), Wikimedia Commons (Public domain)

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, FalseNone, 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.

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 NVDGitLab Advisory Database.

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. Bezpečnost

    Přihlášený uživatel OpenShift AI může načíst společné klíče NVIDIA

    Red Hat zveřejnil 7. září zranitelnost CVE-2026-86332 se skóre 6,5. Přihlášený uživatel dashboardu OpenShift AI může bez správcovského oprávnění načíst společný klíč…

  2. Bezpečnost

    Hlídač agentů v API OpenAI umí konverzaci zastavit, hotové kroky ale nevrátí zpět

    Spolu s modelem GPT-6 Astra ohlásilo OpenAI 3. září 2026 systém, který na pozadí čte uvažování agenta a při podezření na nezamýšlený přenos dat nebo destruktivní zásah…

  3. Bezpečnost

    Dynamicky sestavený Bifrost mohl bez přihlášení spustit modul z webu

    Správní rozhraní AI brány Bifrost před verzí 2.0.0 přijímalo od nepřihlášeného volajícího internetovou adresu vlastního zásuvného modulu. V dynamickém sestavení mohl…

  4. Bezpečnost

    Souběžné načtení dvou vektorů promptu obešlo ve vLLM pojistku proti loňské díře

    Záznam CVE-2026-73557 popisuje, že pojistka, kterou vLLM přidal v prosinci 2025 proti chybě CVE-2025-62164, stála na přepínači společném pro celý proces. Když server…