A injeção que desligou o sandbox do Cursor
Em 1º de julho de 2026, o Cato AI Labs divulgou o DuneSlide: duas falhas críticas no Cursor (CVE-2026-50548 e CVE-2026-50549, ambas CVSS 9.8) em que uma injeção de prompt que chega em um resultado de ferramenta MCP ou em um trecho de busca web dirige a ferramenta run_terminal_cmd e um fallback de symlink para sobrescrever o próprio helper de sandbox do Cursor. A guarda se cala por dentro, e o próximo comando roda como o desenvolvedor, com alcance a qualquer nuvem ou SaaS em que o editor esteja logado. Sem interação do usuário, corrigido no Cursor 3.0. Esta é uma história sobre onde uma fronteira pertence: no Bromure Agentic Coding a mesma fuga aterrissa dentro de uma VM descartável, o shell escapado encontra stubs no lugar dos tokens reais, e o PromptGuard pontua esse conteúdo não confiável no fio antes que o modelo aja sobre ele.
O DuneSlide não escapou do sandbox do Cursor. Ele convenceu o próprio agente do Cursor a sobrescrever o pequeno binário que impunha o sandbox, e a guarda emudeceu por dentro. Uma fronteira que vive no mesmo processo que o código que ela vigia é uma fronteira que o código consegue alcançar.
Um desenvolvedor pede ao Cursor para montar uma nova integração e o aponta para a documentação de um fornecedor, ou conecta um servidor Model Context Protocol para que o agente possa puxar dados ao vivo. O MCP é o plugue que permite a um agente de codificação chamar ferramentas externas e ler seus resultados. O Cursor busca a página, lê a saída da ferramenta, e dobra ambas no contexto sobre o qual ele raciocina. Em algum lugar desse texto retornado há uma frase que o desenvolvedor nunca escreveu, endereçada ao modelo e não a um humano. O agente a lê como uma instrução e age.
Em 1º de julho de 2026, o Cato AI Labs divulgou a cadeia que isso arma, e The Hacker News cobriu o caso no mesmo dia. Duas falhas, CVE-2026-50548 e CVE-2026-50549, ambas avaliadas em 9.8 de 10. O vetor de entrega é conteúdo não confiável que o agente já lê em seu nome: um resultado de ferramenta MCP, um trecho de uma busca web. Sem diálogo, sem clique, sem interação do usuário.
O que o DuneSlide faz.
O Cursor roda os comandos que seu agente gera dentro de um sandbox local,
e um binário helper decide o que esse sandbox permite. A primeira falha
vive no run_terminal_cmd, a ferramenta que o agente usa para rodar
comandos de shell. Essa ferramenta recebe um parâmetro working_directory,
e a injeção o define para um caminho que aponta para os próprios arquivos
do Cursor. O agente, seguindo a instrução contrabandeada, escreve por cima
do helper que fica em
/Applications/Cursor.app/.../helpers/cursorsandbox. A segunda falha é um
fallback na forma como o Cursor resolve links simbólicos: quando a
verificação de symlink falha, o Cursor confia no caminho intraprojeto do
atalho e escreve fora do projeto mesmo assim, aterrissando no mesmo helper.
De qualquer forma o resultado é um só. O binário que decide se um comando está confinado é substituído por um que não confina nada. O próximo comando que o agente roda executa como o desenvolvedor, fora do sandbox, com o alcance de quem quer que esteja logado no editor: o console da nuvem, os painéis SaaS, os repositórios que a sessão já consegue tocar. O Cursor corrigiu ambas as falhas na versão 3.0. Toda build anterior a ela está exposta.
A fronteira ficava dentro da sala que ela guardava.
Leia a cadeia de novo e a parte aguda não é o truque do symlink. É a
localização da guarda. O helper que decide se um comando está confinado
fica no mesmo disco que o projeto que o agente edita, no mesmo domínio de
confiança que o agente, alcançável pelo mesmo run_terminal_cmd que o
agente usa para o trabalho comum. O sandbox e o código que ele policia
rodam como um único usuário, em uma única máquina, com um único sistema de
arquivos entre eles. Dê ao agente a capacidade de escrever um arquivo,
deixe um atacante escolher qual arquivo, e o arquivo que ele escolhe é a
guarda.
Essa é a falha recorrente na segurança de agentes de codificação neste ano, e nós a documentamos em outras formas: uma credencial que o agente consegue ler é uma credencial que uma dependência comprometida consegue ler em o sandbox que guardava a chave, e um controle que o agente consegue desligar nunca foi um controle em por que o Bromure Agentic Coding não é um sandbox. O DuneSlide é a mesma lição no nível do próprio binário do sandbox. Uma guarda dentro do processo protege você até que o processo em que ela vive decida editá-la.
O mesmo ataque, a um hypervisor de distância.
O Bromure Agentic Coding põe a fronteira em algum lugar onde o agente não consegue escrever. O agente, os shells que ele gera, as ferramentas que ele chama, e qualquer código que essas ferramentas rodem vivem dentro de uma máquina virtual descartável com seu próprio kernel Linux. Cada byte que a VM envia ou lê cruza um proxy que roda no host macOS, abaixo do guest, do outro lado do hypervisor. Esse proxy é um único lugar, e faz vários trabalhos. Reproduza o DuneSlide contra ele e cada passo encontra um deles.
Comece pela fuga. A injeção ainda chega, o agente ainda roda
run_terminal_cmd, e ambos os CVEs ainda disparam. A sobrescrita aterrissa
nos próprios arquivos do guest. O disco do Mac, seu /Applications, seu
Keychain não estão no mundo da VM, então não há caminho de um symlink dentro
do guest para um binário no host. O raio de explosão é uma máquina que você
pode deletar e reconstruir em segundos.
Depois o passo do prêmio, o alcance à nuvem e ao SaaS. É por valor que o
ataque veio, e ele volta de mãos vazias. Os tokens reais ficam no host. A
VM contém stubs: arquivos de credencial com o formato certo e sem
significado na internet pública. Quando o agente faz uma chamada que
precisa de um segredo real, o proxy do host troca o stub pelo token real no
fio e o troca de volta para fora da resposta. Um shell escapado rodando
env | grep TOKEN ou lendo ~/.aws/credentials encontra placeholders. O
único momento em que uma credencial real existe é dentro de uma requisição
que o agente fez para trabalho real, e uma chamada que altera estado pausa
na fronteira para um prompt no host antes de partir. Buscas de pacotes
cruzam o mesmo proxy e são escaneadas na entrada. Uma linha, vários
trabalhos, todos eles abaixo do agente.
A fuga aterrissa no guest.
Ambos os CVEs ainda disparam sob o Bromure. A sobrescrita atinge arquivos dentro de uma VM descartável com seu próprio kernel, e o hypervisor não dá ao guest nenhuma syscall que alcance o host. Você reconstrói a VM e o dano vai junto com ela.
O token que ela queria nunca esteve lá.
O objetivo do DuneSlide é o acesso à nuvem e ao SaaS do desenvolvedor. Esses segredos ficam no host, e a VM carrega stubs que não significam nada na internet. O shell escapado faz grep por tokens e lê placeholders, então o passo do prêmio falha.
O PromptGuard lê o fio primeiro.
A garantia acima vale sem nenhum classificador: a fronteira da VM contém a
fuga e a troca de token esfomeia o prêmio, faça o modelo o que fizer. O
Bromure adiciona mais uma camada no mesmo proxy, mirada no exato vetor que
o DuneSlide usa. A injeção viaja em conteúdo que o agente ingere, um
resultado de ferramenta MCP ou um trecho de busca web, e esse conteúdo
cruza o proxy do host antes que o modelo o leia. Se ativado, o PromptGuard
o pontua ali. O estágio um é o Llama Prompt Guard 2 da Meta, vigiando a
saída de ferramenta e os fetches web em busca de texto que se dirige ao
modelo como uma instrução. Os arquivos de regras que um agente trata como
ordens permanentes, CLAUDE.md e seus irmãos, recebem em vez disso um
classificador ModernBERT ajustado, porque um arquivo que é feito para ser
todo instruções precisa de um modelo que pontue dano em vez de injeção.
Por perfil, o Bromure registra o acerto, o mostra a você para uma decisão, ou o bloqueia antes que o modelo veja o trecho envenenado. A colocação é o ponto, e é o mesmo argumento das camadas abaixo dela: um agente que já engoliu a injeção não pode ser confiado para reportá-la, então a verificação roda do outro lado da fronteira, onde a persuasão do agente não alcança. Documentamos o pipeline completo em como o Bromure detecta prompts maliciosos, e vimos a mesma classe de ataque chegar de carona na saída de um comando em a instrução que não era minha.
O DuneSlide está corrigido no Cursor 3.0, e atualizar é a jogada certa hoje. O padrão por trás dele não está corrigido, porque não é uma única falha. Qualquer agente de codificação que roda seu próprio confinamento em seu próprio processo está a uma frase convincente de distância de editar esse confinamento. A jogada que sobrevive ao próximo CVE com um nome diferente é manter a guarda, as credenciais, e a trilha de auditoria do outro lado de uma linha que o agente não consegue escrever. O Bromure Agentic Coding traça essa linha no hypervisor. É gratuito, de código aberto, e disponível hoje.