A defesa contra prompt injection que a maioria das empresas montou pressupõe um usuário mal-intencionado digitando algo. Isso resolve o caso menos interessante. O caso que importa é aquele em que o usuário é inocente e a instrução hostil chega pelo conteúdo.
Como funciona
O agente recebe uma tarefa legítima: revise as issues abertas, resuma este documento, leia esta página. Ao executar, ele traz conteúdo de terceiro para o contexto. Esse conteúdo contém texto imperativo. O modelo não tem, arquiteturalmente, como distinguir instrução do usuário de instrução que apareceu no meio dos dados.
A demonstração da Invariant Labs é o exemplo canônico: uma issue maliciosa num repositório público bastou para levar um agente com acesso ao GitHub a ler repositórios privados e publicar o conteúdo. O desenvolvedor pediu uma revisão de issues. Só isso.
Não houve exploração de vulnerabilidade. Houve uso do sistema exatamente como ele foi construído para funcionar.
Por que filtro não resolve
A resposta comum é filtrar o texto de entrada procurando padrões suspeitos. Isso falha por três motivos: o espaço de formulações é infinito, o payload pode estar em outro idioma ou codificado, e existe ocultação — pesquisadores demonstraram payloads escondidos em blocos Unicode invisíveis dentro de metadados de ferramenta.
Filtro reduz ruído. Não é fronteira de confiança.
O que efetivamente contém
- Marcar contexto contaminado. Se conteúdo externo entrou nesta tarefa, restrinja verbos de escrita externa pelo resto dela. É a mitigação de maior retorno.
- Separar leitura externa de escrita externa em agentes distintos, com identidades distintas.
- Aplicar teto de delegação, para que o agente não alcance o que o usuário não alcançaria.
- Aprovação humana nos quatro verbos irreversíveis, com o argumento literal exibido.
- Logar a origem do conteúdo lido antes de cada chamada — é o que torna a investigação possível depois.
O reenquadramento
Pare de tratar isso como problema de modelo e trate como problema de fluxo de dados. A pergunta deixa de ser “como impeço o modelo de obedecer” e passa a ser “quais ações continuam disponíveis depois que dado não confiável entrou”. A segunda pergunta tem respostas de engenharia. A primeira, por enquanto, não tem.