HiddenLayer popsal šest způsobů, jak v Mistral Vibe obejít schvalování příkazů
Bezpečnostní firma HiddenLayer zveřejnila 11. září šest záznamů CVE k nástroji Mistral Vibe, agentovi pro práci s kódem z příkazové řádky. Všechny popisují touž potíž z jiné strany: Vibe se rozhoduje, jestli se smí příkaz spustit bez dotazu, nad textem, který si sám poskládal ze syntaktického stromu, kdežto vykoná ho shell. Čtyři z šesti mají závažnost 10 z 10.
Bezpečnostní firma HiddenLayer vydala 11. září 2026 šest hlášení k nástroji Mistral Vibe. Je to agent pro práci s kódem, který běží v terminálu, sám si čte soubory v projektu a sám spouští příkazy. Aby u každého z nich neobtěžoval otázkou, vede si seznam těch, které smí provést rovnou. Právě ten seznam je v hlášeních terčem.

Kontroluje se text, vykonává se něco jiného
Vibe si příkaz před spuštěním rozebere knihovnou tree-sitter a z uzlů toho stromu poskládá zpátky podobu, nad kterou se pak ptá: je tohle na povolovacím seznamu a nesahá to mimo pracovní složku? Když obojí vyjde příznivě, příkaz jde do shellu bez dialogu.
Mezi tou poskládanou podobou a tím, co nakonec provede bash, je ale místo na rozdíl. A každé z šesti hlášení ukazuje jiný způsob, jak se do téhle skuliny vejít.
- CVE-2026-87983 – uvozovky kolem absolutní cesty zůstanou součástí řetězce, který se porovnává s hranicí pracovní složky. Python takový řetězec nepovažuje za absolutní cestu, protože nezačíná lomítkem; bash uvozovky zahodí a předá skutečnou cestu. Závažnost 9,2, zavedeno ve verzi 2.6.0.
- CVE-2026-87984 – cíl přesměrování výstupu se do kontroly cest nepočítá, takže povolený příkaz smí založit nebo přepsat soubor mimo složku. Závažnost 9,3, od verze 1.3.4.
- CVE-2026-87985 – argument zapsaný takzvaným ANSI-C uvozováním má v syntaktickém stromu vlastní druh uzlu, který se do skládané podoby nepřebírá. Kontrola ho tedy nevidí, shell ano. Závažnost 10, od verze 2.9.0.
- CVE-2026-87986 – zápis, kterému rozbor nerozumí, skončí v chybovém uzlu a vypadne z posuzované podoby. Bash nebo zsh ho přitom vykoná normálně. Závažnost 10, od verze 1.3.4.
- CVE-2026-87987 – přiřazení proměnných prostředí, které stojí před povoleným příkazem, se z kontroly vyjímá. U programů, jejichž chování se proměnnou prostředí řídí – hlášení jmenuje Git –, to stačí ke spuštění cizího kódu. Závažnost 10, od verze 2.6.0.
- CVE-2026-87988 – seznam příkazů považovaných za čtecí se rozrostl, aniž se stejně rozšířila množina těch, u kterých se prohlížejí cesty v argumentech. Závažnost 10, podle hlášení od verze 2.15.0.
Známky závažnosti jsou z metodiky CVSS 4.0 a pocházejí od nálezce, ne z nezávislého přepočtu. Pod všemi šesti stránkami je podepsaný Esteban Tonglet z HiddenLayeru.
Co z toho plyne pro uživatele
Vibe má v README větu „Safety First“ a za ní vysvětlení, že nástroj schvaluje spouštění nástrojů. Nabízí čtyři profily agenta: ask se ptá na všechno, plan je jen pro čtení, výchozí accept-edits schvaluje sám úpravy souborů a auto-approve schvaluje sám všechno s poznámkou, ať se používá opatrně. K tomu má systém důvěryhodných složek, aby se agent nespustil kdekoli.
Hlášení míří pod tuhle vrstvu. Dotaz, který se neobjeví, nemůže uživatel zamítnout, a přísnější profil agenta na tom nic nemění, protože rozhodnutí padne dřív. Čtecí varianta znamená vydané soubory, na které proces dosáhne – hlášení jmenují přihlašovací údaje, klíče SSH, tokeny k rozhraním a konfiguraci. Zápisová varianta znamená změněný soubor v projektu nebo v nastavení.
Ke spuštění je potřeba, aby agent takový příkaz dostal k provedení. Tím se okruh dotčených zužuje na toho, kdo Vibe pouští nad cizím zadáním, cizím repozitářem nebo obsahem staženým z webu. Naopak se nezužuje na nic menšího než celý domovský adresář: hranicí měla být pracovní složka a právě ta v popsaných případech nedrží.
Opravená verze v záznamech chybí
U všech šesti záznamů v databázi GitHubu není vyplněný ani jeden dotčený balíček a ani jedna opravená verze. Pole, ze kterého Dependabot pozná, že má komu co hlásit, tedy zůstalo prázdné. Vlastní evidence hlášení v repozitáři projektu je prázdná taky a soubor SECURITY.md v něm není; dotaz na něj vrací 404.
Sám nástroj se instaluje jako balíček mistral-vibe. Poslední verze 2.25.3 vyšla 11. září ve 13.06 UTC, tedy zhruba dvě a půl hodiny předtím, než se hlášení objevila v databázi GitHubu (15.32 UTC). V jejím seznamu změn stojí větvení konverzace, práce s odkazy na soubory a oprava práv k záznamům sezení. O povolovacím seznamu ani slovo.
Co je v dnešním kódu vidět
Rozhodování o oprávnění sedí v souboru vibe/core/tools/builtins/bash.py. Stáhl jsem ten soubor z balíčků verzí 2.25.1, 2.25.2 a 2.25.3 a porovnal ho s hlavní větví repozitáře. Všechny čtyři podoby jsou shodné do posledního bajtu, shodně 20 670 B. Poslední commit, který na ten soubor sáhl, je z 20. srpna a patří k vydání 2.24.3.
Výčet druhů uzlů, ze kterých se skládá posuzovaná podoba příkazu, obsahuje pět položek: command_name, word, string, raw_string a concatenation. Uzel pro ANSI-C uvozování mezi nimi není, a to ani v hlavní větvi – řetězec ansi_c_string se v celém souboru nevyskytuje ani jednou. Nález CVE-2026-87985 tedy v kódu k datu vydání tohoto textu zůstává.
U posledního z šesti hlášení vyšlo najevo něco jiného. Seznam čtecích příkazů má dnes 37 položek, od basename po which, a množina, u jejíchž příkazů se prohlížejí cesty, je sjednocením osmi příkazů měnících soubory právě s tímhle seznamem. Prošel jsem starší balíčky a to sjednocení tam nebylo vždycky: verze 2.19.1 z 9. července má obě množiny oddělené, verze 2.20.0 už sjednocené. V seznamu změn k 2.20.0 tomu odpovídá jediná položka, „Hardened bash tool permissions and cross-platform shell handling“, tedy zpřísnění oprávnění bez zmínky o čemkoli hlášeném.
Podle nás to vypadá, že tenhle nález byl zavřený zhruba dva měsíce před zveřejněním, jen se to nikde neřeklo. Jistotu z toho čtení udělat nejde – neověřoval jsem to spuštěním nástroje, a jestli změna pokrývá celý popsaný případ, ukáže až pokus. Za doložené považujeme to, co je vidět: kdy se obě množiny spojily a že u zbylých pěti nálezů se dotčená místa v kódu od srpna nezměnila.
Šest hlášení k jednomu vývojářskému nástroji v jeden den není v oboru novinka; loni v červenci vydal Microsoft za jediný den šest záznamů pro Visual Studio Code a Copilot. Rozdíl je v tom, že tam u každého záznamu stála verze, po kterou problém platí. Tady musí zájemce sáhnout do kódu.
Zdroje
- Hlášení HiddenLayer k obcházení přes uvozovky – popis, známka CVSS a dotčené verze; sousední stránky nesou zbylých pět nálezů
- Záznamy v databázi hlášení GitHubu – data zveřejnění a prázdná pole s dotčeným balíčkem
- Balíček mistral-vibe na PyPI – čísla verzí a časy jejich nahrání
- Seznam změn projektu – znění položky u vydání 2.20.0