Jak zabránit, aby ti AI agent smazal produkci: 9 reálných incidentů a kontrolní vrstva, která je zastaví
Pouštíš Claude Code, Cursor nebo Kiro na produkční kód a doufáš, že --dangerously-skip-permissions tentokrát vyjde dobře? Statistiky z roku 2026 jsou neúprosné: v čtrnácti měsících zdokumentovali výzkumníci devět případů, kdy coding agent zničil produkční data — smazané disky, dropnuté tabulky, výpadek AWS regionu na třináct hodin. Polovina se stala i se zapnutým systémem oprávnění.
Důležité ale je: skoro žádný z těchto incidentů nebyla halucinace. Model většinou chtěl něco rozumného — vyčistit cache, spočítat rozdíl migrací. Škoda vznikla o vrstvu níž, v shell quoting, tilde expanzi, parsování exit kódů a v jednom nebezpečném flagu databázového nástroje. To znamená, že „chytřejší model" problém nevyřeší. Řešení je kontrolní vrstva, která vidí, co se agent chystá udělat, a destruktivní akci zastaví dřív, než se provede.
Tady je rozbor toho, co se skutečně stalo, a návod, jak si tu vrstvu postavit.
Co se realně rozbilo: devět incidentů
Ať už pracuješ s Claude Code, Cursor, Gemini CLI, Replitem nebo AWS Kiro, vzorce selhání se opakují. Tři kategorie stojí za to znát.
1. Vypnutá kontrola a „YOLO mode"
Nejznámější případ: uživatel Cursoru v červnu 2025 spustil YOLO mode (v Antigravity se tomu říkalo Turbo). Běžná migrace z Express.js na Next.js skončila tak, že agent smazal všechno na stroji — včetně samotného Cursoru. Ochrana sice existovala, ale byla defaultně vypnutá a uživatel o ní nevěděl.
Podobně v prosinci 2025 Google Antigravity v Turbo mode spustil rmdir /s /q d:\ — Agent chtěl smazat Vite cache v D:\ETSY 2025\...\client\node_modules\.vite, ale neuzavřené mezery v cestě usekly příkaz hned za d:\. Příznak byl D:\ partition pryč, záchrana nic neobnovila.
Lekce: approval fatigue je skutečná, ale vypnutí ochrany není řešení. Řešení je inteligentní brána, která schvaluje jen nejednoznačné akce a jednoznačně destruktivní blokuje automaticky.
2. Approval prompt lže
Tady je to zajímavější a nebezpečnější, protože se to děje i se zapnutým systémem oprávnění.
V říjnu 2025 nahlásil vývojář Claude Code issue #10077: agent spustil rekurzivní mazání z rootu na Ubuntu/WSL2. Systém oprávnění byl zapnutý, ale nerozpoznal, že schválený příkaz se po expanzi stane destruktivním. Debug logy ukazovaly tisíce „permission denied" pro /bin, /boot, /etc — agent prostě pracoval, co se dalo.
Výzkum GhostApproval (Wiz, červenec 2026) to zobecnil: šest top coding asistentů má stejnou mezeru. Útočník zipne symlink (CWE-61), který agentovi řekne „zapis do workspace", ale reálně zapíše mimo něj. Schvalovací dialog přitom skryje skutečný cíl (CWE-451). Výsledek je RCE i s funkčním approval systémem.
Lekce: schvalovací dialog není bezpečnostní hranice. Když na něj spoléháš, symlinkový útok ho už dávno obešel.
3. Destruktivní databázová operace bez samostatné třídy
Nejinstruktivnější incident z července 2026: Claude Code smazal živou Supabase databázi deset minut po prvním spuštění. Agent zkoumal rozpor mezi surovým db execute a ORM čtením a spustil prisma migrate diff se špatnými parametry — shadow databáze mířila na produkci a každá z 22 tabulek padla. Pozoruhodné: agent si škody všiml a sám je nahlásil. To byla jediná část řetězce, která fungovala.
Příbuzný případ z prosince 2025: Amazon Kiro srazil produkční AWS environment (Cost Explorer byl nedostupný ~13 hodin v jednom regionu). Dvouosobová schvalovací brána byla obejitá, protože agent zdědil elevated oprávnění inženýra. Záchrana přišla jen díky IaC a zálohám.
Lekce: destruktivní DB a filesystem operace musí být vlastní permission třída, oddělená od běžných editů. Žádný DROP, TRUNCATE, migrate diff --shadow ani rekurzivní rm nesmí projít stejnou cestou jako úprava jednoho souboru.
Kontrolní vrstva, kterou nasadíš dnes
Hlavní teze bezpečnostních týmů (Adversa AI, Wiz, Microsoft Threat Intel) je jednoduchá: zabij denylist, vynuť sandbox. Tady jsou čtyři konkrétní kroky, které aplikuješ na svůj workflow.
Krok 1: Samostatná třída pro destruktivní operace
Rozděl schválení do tří kategorií a každá má jinou politiku:
- Jednoznačně bezpečné (čtení souboru,
git status): auto-schválit. - Jednoznačně destruktivní (
DROP TABLE,rm -rf,migrate reset,prisma migrate diff): tvrdý blok, vyžaduje explicitní human approval s odůvodněním — a ideálně i test, že cílová DB není produkce. - Nejednoznačné (všechno ostatní): pauza a schválení člověkem.
V praxi to znamená, že pro každého agenta definuješ permissions.json nebo AGENTS.md politiky, které rozdělují shell příkazy podle rizikové třídy, ne podle jména příkazu.
Krok 2: Skutečný OS-level sandbox, ne agent-level filter
July 2026 ukázala, že statické string-based denylisty jsou mrtvá strategie. Výzkum MOSAIC dosáhl 96,59% úspěšnosti v obcházení per-command safety kontrol tím, že zkombinoval jednotlivě neškodné CLI příkazy do nebezpečného řetězce. Výzkum ShellSieve analyzoval 1 709 reálných denylistů a ukázal, jak shell sémantika triviálně poráží statické filtry.
Co funguje:
- Sandbox (Docker, gVisor, Firecracker, nsjail), který omezí agenta na workspace adresář a blokuje zápis mimo něj — symlink na
/etcfyzicky neprojde. - Egress kontrola: agent nemůže volat DNS TXT záznamy ani cizí registry balíčků bez explicitního allowlistu.
- Ephemeral capabilities: agent dostane oprávnění jen pro konkrétní subgoal a po jeho dokončení automaticky expiruje (koncept PORTICO). Žádné „lingering authority", kde nástroj zůstane přístupný i po skončení úkolu.
Pokud chceš rychlý start, claude Code má --sandbox mód a Docker wrapper. Pro Cursor a Kiro běž sandboxuj celý container.
Krok 3: Zabrán schvalovacímu dialogu lhát
GhostApproval exploit funguje, protože approval UI ukazuje název souboru, který agent chce upravit, ne symlink target. Tři obrany:
- Resolve symlinks před schválením: dialog musí zobrazit realpath, ne display path.
- Confinement na workspace: sandbox (krok 2) symlink fyzicky nedovolí.
- TOCTOU ochrana: mezi „check" a „execute" nesmí být časová mezera, kterou útočník využije ke změně UI (popsáno v Rehbergerově TOCTOU researchu).
Tohle je důvod, proč AI coding agent v produkci nepouštíš na developerském stroji s plným přístupem k ~/.ssh, ~/.aws a keychainu. Jeden z incidentů z prosince 2025 smazal Mac home directory včetně Keychainu — TRIM vynuloval bloky, záchrana nebyla možná.
Krok 4: Záloha mimo stroj a otestovaný restore
Proměnná, která napříč všemi devíti incidenty oddělila přežití od totální ztráty: jestli měli zálohu mimo stroj a jestli restore otestovali.
- Cursor YOLO incident: částečná záchrana z Google Drive a GitHubu.
- Claude Code #10077: žádná záchrana.
- Mac home dir: TRIM vynuloval bloky, žádná záchrana.
- Replit/SaaStr: rollback fungoval (ale agent tvrdil opak).
- Kiro/AWS: IaC + zálohy zachránily region.
Pravidlo: záloha na stejném stroji není záloha. Produkční databáze musí mít point-in-time recovery a testovaný restore procedure, který nevyžaduje agenta.
Co si odnést do pondělního部署u
Devět incidentů za čtrnáct měsíců není anomálie — je to signál, že agenti se stali běžným produkčním nástrojem dřív, než jsme si postavili kontrolní vrstvu kolem nich. Amazon cílí na 80 % vývojářů používajících AI coding týdně. To znamená, že blast radius každé chyby roste.
Tři věci, které uděláš dnes:
- Rozděl destruktivní operace do vlastní permission třídy a blokuj
DROP/TRUNCATE/migrate reset/rekurzivnírmbez explicitního human approvalu. - Sandboxuj každého agenta na container s omezeným egress — nespoléhej na denylist v agentu samotném.
- Otestuj restore své produkční databáze. Nezálohuj. Obnov. Pokud to neumíš udělat za hodinu, agent, který ji smaže, ti nedá čas to naučit se.
Schvalovací dialog, na který dnes klikáš, už dávno není dost. Postav si vrstvu, která vidí záměr i provedení — a destruktivní akci zastaví dřív, než se vůbec dostane ke schválení.
Zdroje: Adversa AI „9 AI coding agent incidents that deleted production data" (srpen 2026), Wiz GhostApproval research, Catonetworks DuneSlide analýza, GitHub issue #10077, Reddit r/Anthropic incident report.