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

V bezobslužném režimu zastaví Continue CLI ničivý příkaz jen podle neúplného seznamu

Continue CLI umí běžet bez dohledu a v tom režimu spouští příkazy shellu bez ptaní. Jedinou tvrdou zábranou zůstává výčet nebezpečných cest: zná kořen, domovský adresář a čtyři systémové složky, ale /home, /root, /var, /opt ani /srv v něm nejsou. Hlášení CVE-2026-76072 vyšlo 24. srpna 2026 a opravenou verzi projekt zatím nevydal.

Starší textový terminál s klávesnicí
Continue CLI posílá příkazy rovnou do shellu; o tom, který projde, rozhoduje jediná funkce. Foto: ajmexico, Flickr (CC BY 2.0)

Continue je otevřený asistent pro psaní kódu. Vedle rozšíření do editoru má vlastní příkazovou řádku, která se spouští jako cn, a ta zná tři režimy. V běžném se před zápisem do souboru i před příkazem shellu ptá. Bezobslužný běh (cn -p) se nemá koho zeptat a režim --auto má povolené všechno. Právě těch dvou se týká zranitelnost CVE-2026-76072, kterou 24. srpna 2026 zveřejnila společnost VulnCheck.

Tvrdě zakázat příkaz umí jediné místo

Oprávnění drží Continue ve třech stupních: allow znamená spustit bez ptaní, ask zeptat se a exclude nástroj agentovi vůbec neukázat. Výchozí politiky v souboru defaultPolicies.ts dávají nástroji Bash v běžném běhu ask, v bezobslužném allow. Režim --auto je stručnější a nastaví allow úplně na všechno.

Nad tím stojí druhá vrstva. Než se příkaz spustí, posoudí ho funkce evaluateTerminalCommandSecurity, a podle souboru permissionChecker.ts se povolení přepíše na exclude jedině tehdy, když posudek zní disabled. U každého jiného posudku vyhraje nastavené povolení. Když je tedy Bash na allow, zastaví příkaz jedině verdikt disabled.

Ve výčtu nebezpečných cest je osm položek

Ten verdikt vydává funkce isCriticalCommand v souboru evaluateTerminalCommandSecurity.ts. U mazání chce dvě věci naráz: přepínač, který je zároveň rekurzivní a vynucený, a k tomu cestu z výčtu nebezpečných. Ten výčet obsahuje /, /*, ~, ~/*, /usr, /etc, /bin, /sbin a cesty začínající čtyřmi posledními. Přečetli jsme si ho v hlavní větvi a od popisu v hlášení se neliší.

Nejsou v něm /home, /root, /var, /opt ani /srv. Rekurzivní vynucené smazání kterékoli z nich podmínku nesplní, verdikt disabled nepadne a bezobslužný běh takový příkaz spustí bez ptaní.

Příkaz find s přepínačem -delete dopadne podobně. Z výčtu bezpečných příkazů vypadne, jenže skončí ve stupni „vyžaduje povolení“ – a to povolení v bezobslužném běhu má. Nástroje shred, wipefs, truncatepkexec funkce neřeší vůbec; v celém souboru o 1 241 řádcích se ani jednou neobjeví.

Proměnná se cestou k posudku vypaří

Druhá mezera je v rozboru příkazové řádky. Continue ji rozebírá knihovnou shell-quote, jenže ta bez předaného prostředí nahradí odkaz na proměnnou prázdným řetězcem. Vyzkoušeli jsme si to v samostatně nainstalované verzi 1.10.0: z řádku, který rekurzivně maže obsah proměnné $HOME, vyjdou tři části a poslední z nich je prázdná. Nebezpečná cesta mezi nimi tím pádem není. Příkaz se pak předává shellu a ten si proměnnou dosadí zpátky.

Cizí text si agent přinese sám

Aby na tom záleželo, musí model k napsání takového příkazu něco přimět. Proto je v hlášení řeč i o nástroji Fetch: ve výchozích politikách má allow, a to i v běžném režimu, s poznámkou autorů, že úplně jen ke čtení není. Agent tedy sám stahuje stránky, čte soubory v repozitáři, texty hlášení i výstup serverů MCP. Že pokyn schovaný v takovém obsahu dokáže agenta zmást, jsme popisovali u útoku, který mu místo pokynů podvrhne fakta.

Co funkce naopak zastaví

Seznam zakázaného krátký není. Funkce tvrdě blokuje mkfs a všechno, co tím jménem začíná, dále sudo, su, doas, runas a další nástroje na zvýšení oprávnění, zápis pomocí dd na zařízení v /dev, práva 777 nebo bit setuid u chmod, převod vlastnictví na roota, zavádění jaderných modulů, změny pravidel firewallu, eval, exec a na Windows format, cipher i rekurzivní tiché mazání ze systémového disku. Rekurzivní smazání kořene nebo domovského adresáře zapsaného vlnovkou zastaví taky. Potíž není v tom, že by se na ničivé příkazy nemyslelo; je v tom, že se u mazání všechno opírá o jmenovitý výčet cest.

Nahlášeno v červnu, soubor beze změny od loňska

Nálezce George Chen v hlášení číslo 13001 píše, že věc poslal 13. června 2026 e-mailem a nedostal odpověď; veřejně ji zapsal 19. července 2026. Hlášení je otevřené dosud a oba komentáře pod ním jsou od lidí mimo projekt. Poslední změna posuzovacího souboru je přitom z 30. října 2025 a byla to oprava jiného obcházení, tehdy přes zalomení řádku.

Hlídač závislostí na to neupozorní

Záznam v databázi GitHubu je typu unreviewed a nemá vyplněný ani jeden dotčený balíček, takže Dependabot na něj neupozorní. Čísla závažnosti jsou dvě, každé z jiné verze stupnice: VulnCheck uvádí 8,3 podle CVSS 4.0, databáze GitHubu 7,4 podle CVSS 3.1. Dotčené jsou verze do 1.5.47 včetně, a 1.5.47 je zároveň poslední, kterou projekt na npm vydal, 18. června 2026. Za měsíc do 24. srpna eviduje npm u toho balíčku 15 149 stažení.

Co s tím zatím jde dělat

V bezobslužném běhu se terminál vypnout dá. Přepínače --exclude--ask mají podle dokumentace i podle kódu vyšší přednost než výchozí politiky, takže cn -p --exclude Bash agentovi shell sebere. Kdo ho potřebuje, může povolení zúžit vzorem na argumenty. V režimu --auto tahle cesta ale nevede nikam: plánovací i automatický režim jsou podle téže stránky absolutní a přepínače i soubor permissions.yaml ignorují. Zbývá pustit agenta v kontejneru nebo na stroji, o jehož data nejde.

Za pozornost stojí ještě jeden rozpor. Dokumentace píše, že Bash má výchozí stupeň ask a že se v bezobslužném režimu nástroje se stupněm ask vylučují, protože je nemá kdo schválit. Ve výchozích politikách má ale Bash v témž režimu allow. Kdo čte jen dokumentaci, čeká opak toho, co dělá kód.

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

    Zapnuté MCP v Chainlitu dovolovalo bez přihlášení spouštět příkazy na serveru

    Kdo v Chainlitu ručně zapnul podporu MCP, vystavil rozhraní, přes které mohl nepřihlášený klient poslat příkaz operačnímu systému. Další chyba dovolovala serveru…

  2. Bezpečnost

    Server mcp-searxng posílal heslo k instanci SearXNG klientovi hned po připojení

    Prostředník mezi asistentem a vyhledávačem SearXNG posílal ve verzi 1.11.0 celý obsah proměnné SEARXNG_URL, tedy i jméno a heslo v ní zapsané, jako logovací zprávu…

  3. Bezpečnost

    SGLang omezuje vzdálená média na 64 MiB

    Inference server SGLang 0.5.18 nově omezuje jeden vzdálený obrázek, video nebo zvuk na 64 MiB. Pro servery přístupné nedůvěryhodným klientům přidal také volitelný seznam…

  4. Bezpečnost

    Hydra zakázala v konfiguraci šedesát čtyři citlivých jmen včetně os.system

    Funkce instantiate() v knihovně Hydra zavolá to, co v konfiguraci stojí pod klíčem _target_. Vydání 1.3.4 proti tomu postavilo seznam 64 zakázaných jmen, jenže…