A nota dentro da ferramenta: envenenamento da descrição de ferramentas MCP

Segurança de IA Nível 3/4 ~5 min 17 de outubro de 2026

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

Revisão de código-fonteAnálise de segurança de LLM/agentesRastreamento de fluxo de dados

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.

Solução completa

Membros Pro e Max desbloqueiam o passo a passo completo.

Assinar Pro

Estatísticas da comunidade

147 resoluções
87% taxa de sucesso
Malekith Primeiro sangue

Hacks de hoje relacionados

37.000+ Hackers Labs reais Grátis
Comece Grátis ou resolva o hack de hoje, sem conta