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

Do jména balíčku šlo ve stata-mcp schovat příkaz, který Stata rovnou spustila

Server stata-mcp pouští statistický program Stata z agentních nástrojů. Do verze 1.19.0 skládal jméno instalovaného balíčku rovnou do příkazu pro Statu, takže se do něj dal přidat druhý příkaz, a Stata umí spouštět i programy operačního systému. Vlastní seznam nebezpečných příkazů projekt měl, jenže se kontroloval jinde.

Server stata-mcp zpřístupňuje statistický program Stata agentním nástrojům. Model přes protokol MCP dostane sadu nástrojů, kterými spouští do-soubory, čte logy a doinstalovává balíčky. Jeden z nich, ado_package_install, skládal jméno balíčku rovnou do příkazu, který se posílá Statě. Hlášení o tom vyšlo 12. srpna 2026 pod označením GHSA-49m4-vp58-wgc9 a číslem CVE-2026-55071.

Pracovní stůl s notebookem, telefonem a sešitem
Server stata-mcp neběží v datovém centru, ale na počítači, kde má badatel svá data. Foto: Free-Photos, Wikimedia Commons (CC0)

Konec řádku uprostřed jména balíčku

Ve verzi 1.18.2 vypadala obsluha instalace takhle:

def install(self, package: str) -> str:
    install_command = f"ssc install {package}{self.REPLACE_MESSAGE}"
    runner_result = self.controller.run(install_command)

Hodnota package přišla od volajícího a nikdo ji nekontroloval. Výsledný řetězec putuje do Staty přes knihovnu pexpect, tedy tak, jako by ho někdo psal do jejího příkazového řádku. Použitá metoda sendline() pošle celý řetězec včetně případných konců řádku a Stata pak každý řádek vykoná zvlášť. Kdo tedy do jména balíčku dostal konec řádku, dostal tam i druhý příkaz.

Tím by to skončilo u statistiky, kdyby Stata neuměla i příkazy operačního systému. Umí je: shell, winexecunixcmd spustí program mimo ni, s právy účtu, pod kterým server běží. Hlášení proto vede chybu jako vkládání kódu (CWE-94) a dává jí podle CVSS 3.1 známku 8,4 bodu z deseti, tedy vysokou závažnost. Ta známka počítá s místním přístupem (vektor AV:L), ne s útokem po síti. Volat ten nástroj ale může každý, kdo se k serveru dostane, včetně samotného modelu na druhém konci spojení, a pokud někdo vystaví přenos přes HTTP, dostane se k němu i klient odjinud.

Seznam zakázaných příkazů projekt měl

Zajímavější než chyba sama je, že se jí projekt bránit uměl. Soubor guard/blacklist.py vede výčet nebezpečných příkazů Staty a jsou v něm všechny tři jmenované, k tomu xshell, erase, rmdir, bloky pythonmata i zkratky, které Stata uznává místo plných názvů. Kontrola nad tím výčtem se ale volala na jediném místě: před spuštěním do-souboru. Instalace balíčku svoje volání neměla, takže na ni seznam nedosáhl.

Nešlo o ochranu, kterou by si uživatel musel zapnout. Volba IS_GUARD má v nastavení výchozí hodnotu zapnuto, takže seznam běžel a jen se ho na téhle cestě nikdo nezeptal. Druhá věc, která to zhoršovala: nástroj byl zapsaný v profilu all a právě ten se použije, když se u příkazu neuvede --core ani --all. Chybná konfigurace tedy potřeba nebyla, stačilo server spustit.

Oprava zúžila jméno balíčku na písmena a číslice

Verze 1.19.0 z 9. června 2026 nespravila jen ten jeden řádek. Mění čtyři věci naráz:

  • nástroj se přesunul do profilu unsafe, takže se bez přepínače --unsafe vůbec nezaregistruje;
  • jméno balíčku ze zdrojů ssc a net musí projít výrazem ^[A-Za-z0-9]+$, tedy jen písmena a číslice, žádná mezera ani konec řádku;
  • volání vyžaduje výslovné potvrzení a na vrstvě MCP se server zeptá uživatele sám;
  • repozitář na GitHubu musí být na seznamu povolených, jinak instalace skončí chybou.

V popisu toho nástroje k tomu autor napsal, že obsah repozitářů z GitHubu nekontroluje nic a podívat se do nich musí uživatel. Je to poctivá věta, ale taky připomínka, že proti balíčku, který si člověk sám schválí, žádný výraz nepomůže.

Devět vydání ze sta čtyř je v pořádku

Zásah je široký. Evidence OSV vypisuje jako dotčených 95 vydání, tedy všechna od prvního po 1.18.2. Balíček stata-mcp má na PyPI 104 vydání se souborem ke stažení, takže nezasažených je devět: 1.19.0 až po dnešní 1.21.4 z 5. srpna 2026. Rozdíl obou čísel je náš odečet, obě vstupní čísla jsou ve zdrojích odkázaných výš.

Mezi opravou a hlášením uplynuly dva měsíce a pár dní. Poznámky k vydání 1.19.0 zamlčovací nejsou: přímo píšou, že nová kontrola jména balíčku má zabránit vkládání příkazů. Chybělo jim jediné, číslo. A podle čísla se řídí nástroje, které hlídají závislosti za člověka, takže projekt, který si stata-mcp přibalil a poznámky nečetl, se o chybě dozvěděl teprve 12. srpna.

Kontrola patří tam, kde se řetězec skládá

Rozestup mezi tím, co server slibuje, a tím, co doopravdy vynutí, je u serverů MCP téma, na které jsme narazili u serveru Dynatrace: i tam část ochran existovala jako popis, ne jako podmínka v kódu. Tady je poučení konkrétnější. Ochrana byla podmínkou v kódu, jen stála na jedné ze dvou cest, kudy vede řetězec do interpretu.

Server MCP má tu vlastnost, že mu nástrojů přibývá. Každý nový je další cesta k témuž interpretu, a kdo kontrolu pověsí na cestu místo na místo, kde se příkaz skládá, ji musí pověsit znovu pokaždé. Oprava v 1.19.0 to řeší i takhle: validace se volá uvnitř install(), tedy o patro níž, než kde se dřív kontrolovalo.

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

    Čtení cizích souborů v XAgentu má třetí číslo CVE a opravu jen ve zdrojových kódech

    VulnCheck zveřejnil 11. srpna záznam CVE-2026-72713: obsluha adresy /workspace/file v autonomním agentu XAgent přečte i soubory mimo vyhrazený adresář. Táž funkce už má…

  2. Bezpečnost

    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…

  3. Bezpečnost

    Úložiště LangGraphu vracelo i záznamy z prostoru, jehož jméno začínalo stejně

    Knihovna LangGraph ukládá paměť agentů do jmenných prostorů a aplikace jimi běžně oddělují data jednoho uživatele od druhého. Úložiště pro Postgres a SQLite je ale…

  4. Bezpečnost

    Open WebUI vydalo sedmnáct záznamů CVE až osm dní po opravné verzi

    Rozhraní Open WebUI, které si lidé staví před vlastní modely, vydalo 27. července 2026 verzi 0.11.0 s bezpečnostními opravami a v poznámkách rovnou napsalo, že je zatím…