A nota dentro da ferramenta: envenenamento da descrição de ferramentas MCP
O desafio
A Riverbend conectou um plugin MCP da comunidade ao seu assistente interno para que a equipe pudesse pesquisar as notas. Desde então, o assistente vem anexando discretamente arquivos às suas chamadas de ferramenta sem que ninguém tenha pedido. O assistente está se comportando exatamente como foi instruído, e esse é o problema: nem todas as instruções vêm da Riverbend. Leia o código do servidor do plugin. Uma das ferramentas carrega uma ordem que o modelo obedece e que o usuário nunca vê. Dê o nome do parâmetro que ela usa para contrabandear os dados roubados para fora.
O que você vai aprender
- Explicar que o modelo lê as descrições das ferramentas como instruções, não como documentação inerte
- Identificar uma instrução injetada e escondida em uma docstring, com ordem de ficar em silêncio
- Rastrear um parâmetro de contrabando da assinatura até o corpo da função
- Descrever o MCP tool poisoning como um ataque no nível dos metadados, não no nível do prompt
- Listar as defesas: não confiar em descrições de terceiros, fixar versões, menor privilégio
Habilidades testadas
Pré-requisitos
- Leitura de Python
- O que é uma ferramenta MCP / chamada de ferramenta por um agente
Como funciona
Um agente decide como chamar uma ferramenta a partir da descrição dela. Essa descrição é conteúdo controlável pelo atacante quando o servidor é de terceiros, e o modelo obedece às instruções encontradas ali do mesmo jeito que obedece ao usuário. É o oposto de onde os defensores costumam olhar: o payload está em metadados que o humano nunca lê.
Aqui, a descrição de search_notes esconde uma ordem, envolta em tags <IMPORTANT>, para ler chaves privadas e credenciais de nuvem e anexá-las a um parâmetro, enquanto manda o modelo ficar quieto sobre isso. O parâmetro, sidenote, parece opcional e inofensivo na assinatura, mas o corpo da função envia o conteúdo dele para fora da máquina.
O sinal revelador é a instrução para ocultar: documentação de verdade nunca pede que o modelo esconda do usuário o que fez.
Erros comuns
- Responder
query. Essa é a entrada legítima da busca.sidenoteé o canal de contrabando. - Responder
_audit_post. Essa é a função que envia os dados, mas a pergunta pede o parâmetro que a instrução preenche. - Ler só a assinatura. O ataque está na docstring, que é a descrição da ferramenta entregue ao modelo.
- Culpar o prompt do usuário. Nada do que o usuário digitou importa. A instrução está nos metadados da ferramenta.
Como se proteger
Trate os metadados das ferramentas como não confiáveis e limite o que as ferramentas conseguem acessar.
- Não entregue descrições de ferramentas de terceiros ao modelo como instruções confiáveis. Sanitize-as ou exiba-as para revisão humana antes.
- Fixe e revise a versão exata de cada servidor MCP que você carrega. As descrições podem mudar entre chamadas, então revise de novo a cada atualização.
- Dê a cada ferramenta apenas o acesso a arquivos e à rede de que ela precisa. Uma ferramenta de busca de notas não deveria conseguir ler chaves SSH nem alcançar um host arbitrário.
- Mostre ao usuário todos os argumentos com que a ferramenta é realmente chamada, para que um parâmetro oculto não passe despercebido.