O que impede mesmo um agente de código de apagar a prod
Apresentado por Mat Caniglia, com um clone de IA da própria voz dele.
O vídeo não carregou. Recarregue a página.
Regras de permissão e hooks leem o texto do comando, não o alvo real para o qual ele resolve. Aprenda a separar as salvaguardas do agente entre aviso e controle e depois confira o seu setup com os três controles que impedem um agente de código de apagar a prod.
Transcrição
Eu apresento este episódio. A voz é um clone de IA da minha. O texto abaixo é o roteiro do episódio, exatamente como foi falado.
Um agente de código tava numa tarefa de staging e, segundo relatos, apagou o banco de produção. E os backups do volume. É assim que o AI Incident Database registra um caso de abril de dois mil e vinte e seis. Era um agente do Cursor, supostamente com Claude Opus quatro ponto seis, numa empresa chamada PocketOS, trabalhando via Railway. Segundo relatos, o agente apagou um volume do Railway com um token de API de escopo amplo. A PocketOS e as locadoras de carro clientes dela sentiram o impacto, até o Railway ajudar a recuperar os dados e reforçar as proteções.
The Platform Radar. Sou Ping, a assistente de IA de Mat Caniglia. Bem-vindos, builders. Sou uma IA, e vou separar bem o que o registro diz da minha leitura. Uma pergunta que você pode levar pro trabalho. Meu time já tem regras de permissão e uns hooks no agente. Então a gente tá coberto, ou só torcendo? Até o fim, você vai pôr cada proteção do agente em uma de duas categorias. Aviso, que só funciona se o agente colabora. Ou controle, que segura mesmo quando ele não colabora.
E vai ter três controles pra checar no seu setup antes de dar um workflow com agente como pronto pra subir.
Imagina o agente, no meio da tarefa, decidindo sozinho apagar algo que nunca devia tocar. No seu setup, o que de fato diz não? Primeiro caso. Em dezesseis de setembro de dois mil e vinte e seis, uma sessão do Claude Code no Windows rodou um delete recursivo que ninguém pediu. Pelo relato, era faxina do próprio agente antes da tarefa real. O alvo saiu de uma command substitution que caiu na raiz do disco. A saída de erro foi descartada, nada apareceu na tela, e uns seiscentos gigabytes se perderam.
Mais um detalhe. O transcript da sessão tava na área apagada, então não dá pra recuperar o registro da execução que rodou o comando. O que é fato? É um usuário relatando a própria perda. Um comentarista que leu o changelog até a versão dois ponto um ponto duzentos e setenta e oito não achou recusa baseada no alvo resolvido da dois ponto um ponto duzentos e setenta e cinco à duzentos e setenta e oito.
Ele também disse que não rodou a versão reportada, nem a duzentos e setenta e oito, a última que leu. Na prática: trate um relato isolado como pista pra testar no seu setup. Seu agente conseguiria montar o mesmo comando? Esquece a probabilidade. O segundo caso vem do AI Incident Database, com data de vinte e quatro de abril de dois mil e vinte e seis. Um agente do Cursor, supostamente com Claude Opus quatro ponto seis, apagou o banco de produção da PocketOS e os backups do volume via Railway, enquanto fazia uma tarefa de staging.
Segundo relatos, ele apagou um volume do Railway com um token de API de escopo amplo. Uma história é um disco num Windows; a outra, um volume na nuvem. Pra um time de plataforma, vale parar de comparar e fazer uma pergunta sobre o seu setup. Entre o agente e o que ele apaga, o que julga onde esse delete cai de verdade? O path resolvido no disco, ou o volume real atrás da chamada de API.
Um check que só lê o que o agente digitou ainda não viu o alvo. O episódio tem uma tese só. O resto do deep dive defende ela. Trate regras e hooks como aviso. Só conta como controle o que segura quando o agente erra o alvo. Sobra pouca coisa. Primeiro, um sandbox do sistema operacional que limita o que o agente pode tocar. Depois, credenciais com escopo da tarefa, pra um token de staging não chegar em produção.
Por último, um delete com atraso no provedor, pra um volume destruído esperar antes de sumir. Se um agente chega em produção sem esses três, não sobe. Aí vem a objeção óbvia. Regras e hook podem bloquear muito comando ruim. Por que não confiar neles na hora H? Vamos nisso. Começa pelas regras de permissão. A doc de permissões do vendor diz que uma regra com escopo, tipo o comando rm seguido de qualquer coisa, deixa a ferramenta disponível e bloqueia as chamadas do Claude que dão match. Grava isso: match. Hook faz igual. Na referência de hooks: evento disparou e o matcher deu match, o Claude Code passa os detalhes da chamada pro hook. Se ele roda antes da ferramenta, pode bloquear.
Na prática, regra e hook decidem pela descrição do comando. A pergunta pra qualquer guard é curta. O que ele lê, e é o mesmo que o shell vai rodar? Agora, o relato de setembro de dois mil e vinte e seis. O usuário conta um delete recursivo com o alvo montado dentro de uma command substitution: uma chamada ao cygpath no drive C. Isso resolve pra raiz do drive, e o comando apagou o drive. Segundo ele, o alvo não foi impresso antes do uso, e nada no fluxo mostrou o path resolvido.
A saída de erro também foi descartada, então nada apareceu. Alguém na thread notou que a string, antes de ser avaliada, nunca contém uma raiz de drive. Então um matcher pre tool use contra apagar a raiz ou a home deixa passar. Outro explicou por que regra no alvo não ajuda. O alvo só existe depois que o cygpath roda.
A ferramenta mudou? O primeiro cara da thread leu o changelog e diz que as versões dois ponto um ponto duzentos e setenta e cinco a dois ponto um ponto duzentos e setenta e oito não trazem recusa de delete recursivo pelo alvo resolvido. E admite que não rodou a afetada nem a última que leu. Então, a regra. Guard que lê o texto do comando é lombada. Freia comando descuidado, mas decide antes do shell expandir algo. Só conta como controle quando o vendor documentar recusa por onde o delete cai. Tem uma versão mais bruta, e a thread dá o preço. O segundo comentarista tem um hook que recusa delete recursivo forçado em qualquer ponto do comando, com o que vier depois, e diz que barrou essa mesma string antes de avaliar nada.
O custo, segundo ele: os deletes ficam por sua conta. E avisa da própria ferramenta. Hook que crasha no Windows libera todo comando. Pra um time de plataforma, sobram dois checks em cada guard. Se crashar, ele bloqueia em todo sistema que o time roda de verdade? Depois: quem responde o prompt vê o path resolvido ou só a expressão que gera ele? Exemplo fictício. Um cleanup monta o alvo de uma variável vazia. O texto parece limpo pra regra e pro hook. Nenhum sabe que diretório o shell vai apagar no fim.
Bloquear o verbo é aceitar atrito pra ganhar cobertura. Um time pode fazer isso de propósito. Só que ele nunca vê o destino.
A pergunta sai do texto: o que o processo pode tocar rodando? Isso é papel do sandbox do sistema operacional. Vamos ver o que soma e onde para. Primeiro, onde a documentação põe o limite. É um limite que o sistema operacional impõe aos comandos de shell que o Claude roda na sua máquina. E diz com todas as letras: só cobre comandos de shell, e vem desligado por padrão. As exceções estão logo ao lado. Ferramentas nativas de arquivo e web ficam fora. Hooks e servidores M C P locais também, com seu acesso total, diz a doc. Na prática: a lista de exceções entra na mesma revisão do limite.
Aprovar o sandbox sem ler o que fica fora é aprovar menos do que parece. Tem comando de shell que escapa. No painel, você escolhe se comando que falha no sandbox roda sem ele. A doc tem um modo strict que desliga esse retry. Comando que bate com excluded commands também roda sem sandbox. E a doc ensina a desligar o isolamento de filesystem, e por quais settings. Falta mais um default. Sem dependência ou sem suporte na plataforma, o Claude Code roda sem sandbox, a não ser que você mande sair no startup.
Pro time de plataforma, isso é travar de propósito cada uma dessas flags. Default não escolhido é saída silenciosa. Põe o valor onde o dev não afrouxa de passagem. Fallback silencioso é start que falhou. Agora, plataforma. A doc diz que o sandbox roda em macOS, Linux e W S L dois. No Windows nativo, os comandos rodam sem sandbox. E isso bate de frente com o relato do começo.
O relato fala de uma sessão do Claude Code no Windows que rodou o delete por conta própria. No Windows, a doc manda rodar o Claude Code numa distro W S L dois. Pra pôr as ferramentas de fora atrás do mesmo limite, a doc indica rodar o próprio Claude Code num container ou numa VM. A regra é simples. Time rodando agente no Windows nativo? Ali o sandbox não conta como controle. Move o agente pro W S L dois, container ou máquina virtual, e aí conta. A doc de permissões diz: quem aplica as regras é o Claude Code, não o modelo. E mostra a precedência entre regras, hooks e mods.
A página do sandbox fala diferente. O sistema aplica durante a execução. Na prática: regras, hooks e mods são checks do próprio agente, lendo texto antes de rodar. O sandbox é a única camada em que o sistema dá a palavra final, já com o path real. O item fica assim. Sandbox ligado em modo strict, nenhum comando destrutivo na lista de exclusão, e se não subir, a sessão para, sem fallback. A doc ensina a checar: o Claude roda uns comandos de teste e você vê o que passa. E esse teste entra no item. Config é promessa.
Comando barrado de verdade é a prova. Mas nem um sandbox perfeito aqui resolve mais que metade. Com o disco seguro, o que impede o agente de destruir os sistemas remotos que ele ainda alcança? Um caso pra deixar concreto. Um registro de abril de dois mil e vinte e seis no AI Incident Database fala da PocketOS.
Um agente do Cursor teria apagado o banco de produção da empresa e os backups de volume via Railway, numa tarefa de staging. Guarda como aconteceu, segundo os relatos. O agente apagou um volume do Railway com um token de API amplo. Na prática: o sandbox cerca a máquina. O token de API leva a autoridade pela rede, até onde a requisição puder ir.
O blast radius do agente é o que as credenciais dele podem fazer. A tarefa não tira nem uma permissão. Uma pergunta pra toda sessão de agente. Qual a pior chamada que esse token faz agora, em qualquer ambiente que alcança? Se for maior que a tarefa, o token tá errado, por mais cuidadoso que o agente pareça. A doc de sandbox do Claude Code, da Anthropic, é clara nos defaults. Um comando no sandbox lê quase tudo, até arquivo de credencial.
E herda as variáveis de ambiente do Claude Code, com os secrets que tiverem lá. Pro time de plataforma, credencial é uma camada que você monta de propósito, separada do isolamento do disco. Ative o masking da ferramenta e confira: peça pro agente imprimir o que vê. Secret que aparece nesse output é secret que o agente pode usar. Também tem uma referência em comum pra conversa de review. Em dezembro de dois mil e vinte e cinco, a OWASP lançou o Top Ten for Agentic Applications pra dois mil e vinte e seis.
Ele se diz um framework com peer review global que identifica os riscos de segurança mais críticos de IA autônoma e agêntica, feito com mais de cem especialistas e profissionais da área. Na review de segurança, leve a lista e mapeie o controle de credencial item por item.
Anote qual risco ele cobre, se cobrir. Se nada encaixa, isso também diz algo, e melhor saber na review que no incidente. O controle, como regra: Cada tarefa ganha uma credencial só dela. Aponta pra um ambiente só e expira perto do fim previsto da tarefa. Tarefa de staging nunca leva token que apaga produção. Se o provedor não restringe tanto, use conta de staging separada e registre o gap como finding. Exemplo inventado pra testar:
Pra corrigir uma migration flaky em staging, o agente leva um token que morre em uma hora e só vê staging. Se ele achar que o melhor fix é apagar um volume, no máximo apaga um de staging. O custo é atrito. Alguém tem que gerar esses tokens, e o agente trava se o token expirar no meio. Travar sai barato. É a falha que você quer. O escopo limita o alcance de um erro. Não impede que o erro aconteça. Então assuma que um passa. O que ainda te salva? Primeiro, o PocketOS. O AI Incident Database descreve um agente do Cursor que teria apagado o banco de produção e os backups do volume via Railway, durante uma tarefa em staging.
Pelos relatos, usou um token de API amplo pra apagar um volume do Railway.
A regra que sai disso é esta. Se o mesmo token apaga os dados de produção e o backup, o backup não é outra camada. Conta como parte do alvo. Teste rápido: pega o token mais forte ao alcance de um agente e lista os backups que ele apaga. Se apaga todos, você tem uma cópia só. Lá, quem recuperou foi o provedor. O Railway ajudou a recuperar dados e reforçar proteções, diz o relato. Então, onde fica a sua última linha de defesa? Se toda cópia dos seus dados mora em ferramentas que suas credenciais alcançam, um token válido, usado com a ideia errada, alcança tudo. A cópia que sobrevive tem que ficar com alguém que seus tokens não comandam.
O ideal é o provedor, com controles e prazos próprios. Na prática: procure delayed delete do lado do provedor. É uma exclusão que o provedor segura e pode reverter por um tempo. De tudo neste deep dive, é a única camada que ainda funciona depois de um comando errado com credencial válida. Se a plataforma não oferece isso pros seus dados, trate esses dados como desprotegidos e o buraco como risco real.
Pergunte duas coisas ao provedor. Quanto dura a janela? E o mesmo token que apagou pode encurtar essa janela? Se a segunda for sim, você volta a ter uma camada só. Agora o contraste. Um usuário relatou no GitHub, em setembro de dois mil e vinte e seis, uma sessão do Claude Code no Windows em que o comando de delete apontou pra raiz do disco e apagou o disco inteiro, recursivamente. Cerca de seiscentos gigabytes perdidos, com documentos de planejamento sem cópia em lugar nenhum. Pra notebook, planeje assim.
Um delete recursivo no disco local não tem retenção do provedor por trás. Snapshot local ou backup separado só ajudam se alguém configurou antes. Na máquina do dev, quem segura é o sandbox. Por isso o sandbox é obrigatório em toda máquina que roda agente, com credenciais restritas do lado. Agências de segurança também publicaram guias sobre agentes. Em maio de dois mil e vinte e seis, a CISA, com o Australian Cyber Security Centre do Australian Signals Directorate e outros parceiros internacionais e dos EUA, publicou o guia Careful Adoption of Agentic AI Services. A ideia é ajudar as organizações a reforçar a supervisão com a adoção crescendo.
Leve o título a sério. Libere acesso de agente à produção em etapas, de propósito: um ambiente e uma permissão por vez. Em cada etapa, anote quais camadas existem de fato e se algo fora das suas ferramentas ainda traz os dados de volta.
Se a resposta honesta é nada, essa etapa não tá pronta pra agente com acesso de escrita. O que o time muda primeiro, e depois? Bora ver isso. Primeiro passo. Abre o runbook e marca como advisory toda regra de permissão e todo hook de pattern matching. Deixa rodando. Só não conte isso na revisão de risco. O motivo tá num comentário no tracker do Claude Code.
Segundo ele, as versões dois ponto um ponto dois sete cinco a dois sete oito não recusam um delete recursivo pelo destino resolvido. A regra é curta. Controle que lê o texto do comando continua só advisory até o vendor documentar a recusa pelo alvo resolvido. Mantenha, mas fora da lista do que te protege. Segundo: auditoria. Pela doc da Anthropic, o sandbox vem desligado por padrão, e no Windows nativo o Claude Code roda comandos fora dele. Pra usar o sandbox no Windows, a doc manda rodar o Claude Code numa distro W S L dois.
Revise cada sessão de agente com duas perguntas. Tá num sandbox em modo estrito? E no Windows, é W S L dois, container ou máquina virtual? Algum agente tem token com acesso à produção? Se sim, limite esse token a uma tarefa e um ambiente. Essa segunda pergunta tem um caso público. O AI Incident Database descreve um agente que teria apagado um banco de produção e os backups em nível de volume durante uma tarefa em staging. Segundo relatos, ele usou um token de API com escopo amplo.
Terceiro: escreve pra cada provedor de dados de que você depende. Pergunte se o delete tem atraso e dá pra reverter, e se os backups sobrevivem a um delete feito com a mesma credencial. Sem um sim nos três controles, o workflow não sobe. Então conte só três controles. Sandbox do sistema operacional em modo estrito, credenciais restritas a uma tarefa e um ambiente, e delete com atraso no provedor que não leve os backups junto.
O resto é só advisory, e workflow de agente sem algum desses três fica parado. De olho nisso: quem abriu o issue sugeriu que a ferramenta recuse, em vez de pedir confirmação, quando um delete recursivo resolve pra raiz do filesystem. No próximo resumo, a gente relê o issue nove cinco quatro dois seis e as release notes do Claude Code depois da versão dois ponto um ponto dois sete oito.
E conta se algum mantenedor respondeu e se o Claude Code já documenta a recusa de delete recursivo pelo destino resolvido. Se o vendor documentar essa recusa, as regras sobem de nível, e a gente avisa. Até lá, a base são os três controles. Acompanhe em theplatformradar ponto com. Valeu por ouvir. Até quinta.