por AgentRedTeam (LX AI)
Testes de abuso de ferramentas para agentes LLM
A forma mais rápida de superconfiar um agente é testá-lo apenas se responde bem. Os testes de abuso de ferramentas colocam a questão oposta: o que o agente pode fazer que o seu operador não pretendia? Os algoritmos podem sinalizar padrões comuns, mas ataques novos ainda escapam, por isso a disciplina combina a varredura com revisão humana em vez de substituí-la.
Ferramentas excessivamente amplas
Começo por analisar o âmbito que cada ferramenta expõe. Uma ferramenta que aceita um comando de shell bruto, um URL arbitrário ou um caminho de escrita em forma livre dá ao modelo um alcance muito além da tarefa para a qual foi construída. Na prática, já vi uma ferramenta de "resumir esta página web" que felizmente recupera endpoints de administração internos quando o usuário fornece um URL criado que aponta para um serviço privado. O teste é simples: invocar a ferramenta com um pedido de aparência inofensiva e, em seguida, variar a entrada para ver se a ferramenta pode ser redirecionada para um alvo não intencionado. Se o agente puder alcançar um host que não está na lista de permissões, o teste falha.
Para mitigar, substituo a definição frouxa por um contrato estreito: a ferramenta só aceita URLs que correspondem a um padrão pré-registrado ou só aceita comandos de um conjunto whitelisted. Também adiciono verificações em tempo de execução que rejeitam qualquer argumento que contenha sequências de travessia, como "../" ou pontos e vírgulas que possam iniciar um novo comando. A correção reside na interface da ferramenta, não nos pesos do modelo. Verifico a correção executando o mesmo conjunto de entradas após a alteração e confirmo que o agente retorna um erro em vez de realizar a ação indesejada.
Para referência sobre tratamento de entrada seguro, consulte a folha de dicas de injeção de SQL da OWASP: SQL Injection Prevention Cheat Sheet. Ela mostra como consultas parametrizadas e listas de permissões estritas param a injeção, o que se mapa diretamente à limitação de argumentos de ferramenta.
Falta de confirmação em ações destrutivas
As ferramentas de exclusão, transferência e envio são perigosas porque podem causar perda irreversível. Eu projeto um teste que tenta acionar uma dessas ações sem um passo de aprovação explícito. Primeiro, eu dou ao agente um objetivo como "remover arquivos temporários" e, em seguida, eu forneço um caminho de arquivo que aponta para um ativo de produção. Se o agente prosseguir com a exclusão do arquivo sem pedir um token de confirmação, uma verificação de política ou um sinal de humano-no-loop, eu registro uma descoberta.
Eu também testo se o agente pode dividir a operação destrutiva em várias chamadas para contornar um portão de confirmação. Por exemplo, uma ferramenta pode exigir aprovação para "excluir arquivo", mas permitir "mover arquivo para lixo" e, em seguida, "esvaziar lixo" como etapas separadas. Ao encadear essas chamadas, eu verifico se a fronteira de confirmação pode ser contornada.
A solução é tornar cada ferramenta destrutiva exigir uma aprovação assinada ou uma decisão de política que não possa ser forjada pelo agente. Eu armazeno o token de aprovação em um serviço separado que o agente deve chamar e eu registro cada solicitação para auditoria. Após adicionar o portão, eu reruno o teste e confirmo que o agente agora retorna um erro de permissão em vez de realizar a exclusão.
Exfiltração secreta através de argumentos de ferramentas
Os agentes muitas vezes precisam chamar serviços externos, e essas chamadas podem se tornar um caminho de vazamento se o agente escrever segredos em argumentos de ferramentas que deixam a fronteira de confiança. Executo um teste que semeia um segredo canário - como uma chave de API falsa ou uma string única - no ambiente do agente. Em seguida, peço ao agente que execute uma tarefa que usa uma ferramenta de e-mail, uma ferramenta de webhook ou uma ferramenta de registro. Monitoro onde o canário aparece: no corpo do e-mail, na carga do webhook ou em um arquivo de log que é enviado para um sistema externo.
Se o canário aparecer fora da lista de saída aprovada, o teste falha. Também testo a exfiltração indireta: o agente pode primeiro escrever o segredo em um arquivo temporário, então chamar uma ferramenta de upload de arquivos que envia o arquivo para um servidor remoto. Ao monitorar o sistema de arquivos e o tráfego de rede, posso capturar esses vazamentos em várias etapas.
Para reduzir o risco, implemento listas de permissão de saída na camada de rede e adiciono filtragem de saída que limpa padrões de segredos conhecidos antes que sejam colocados em qualquer argumento de ferramenta. Também rotulo o canário regularmente para garantir que o filtro permaneça eficaz. Após aplicar esses controles, repito o teste e verifico que o canário nunca deixa a fronteira.
Para orientação sobre como gerenciar segredos com segurança, consulte a folha de dicas de gerenciamento de segredos da OWASP: Secrets Management Cheat Sheet. Ela aborda a integração de cofres, tokens de curta duração e controles de acesso rigorosos que mapeiam diretamente as mitigações descritas aqui.
Confusão de privilégio e identidade
Quando um agente reutiliza uma única conta de serviço para muitas ferramentas diferentes, uma violação em uma ferramenta de baixa privilégio pode dar ao atacante acesso a todas as outras ferramentas que compartilham essa identidade. Eu projeto um teste que mapeia cada ferramenta à identidade sob a qual ela é executada. Primeiro, eu listo todas as ferramentas que o agente pode chamar, então eu verifico a conta de serviço ou chave de API associada. Eu procuro sobreposições: uma ferramenta que apenas lê dados públicos compartilhando as mesmas credenciais que uma ferramenta que pode escrever em um banco de dados.
Em seguida, eu tento escalar privilégio usando a ferramenta de baixo valor para obter uma posição, então usando essa posição para chamar a ferramenta de alto valor. Por exemplo, se uma ferramenta de registro somente leitura vazou um token que pode ser usado por uma ferramenta de armazenamento somente escrita, eu verifico se o agente pode encadear essas chamadas para armazenar dados arbitrários. Se a cadeia for bem-sucedida, o teste sinaliza um risco de confusão de privilégio.
A solução é segregação de credenciais: cada ferramenta obtém sua própria identidade de menor privilégio, e o agente deve solicitar o token apropriado de um serviço de token seguro antes de invocar a ferramenta. Eu também adiciono logs de auditoria que registram qual identidade foi usada para cada chamada. Após implantar a segregação, eu repito os passos de mapeamento e encadeamento e confirmo que a ferramenta de baixo valor não pode mais obter um token que funcione para a ferramenta de alto valor.
O que a varredura heurística detecta e o que ela ignora
As heurísticas estáticas são boas em detectar bandeiras vermelhas óbvias: uma ferramenta com o nome "exec", um parâmetro que contém "http://" sem validação, ou uma operação de escrita em um caminho que corresponde a "/etc/passwd". Estes padrões são fáceis de codificar em um conjunto de regras e detectam muitos erros ingênuos. No entanto, as heurísticas não podem raciocinar sobre sequências de etapas individualmente seguras que, em conjunto, produzem um resultado prejudicial. Por exemplo, uma ferramenta que busca uma URL e outra ferramenta que armazena o conteúdo buscado podem cada uma passar em uma verificação heurística, mas um atacante pode encadeá-las para exfiltrar dados de um serviço interno.
Devido a esta lacuna, trato um scan limpo como "nenhum padrão conhecido detectado" em vez de "seguro para implementar". Sempre sigo o scan com uma sessão de revisão manual onde percorro o grafo de chamadas do agente, procuro fluxos de dados indiretos e tento construir cenários de ataque em várias etapas. A revisão foca na lógica de negócios: o agente alguma vez precisa combinar dados de duas ferramentas de uma forma que possa ser abusada? Se a resposta for sim, projeto um teste direcionado que imita a cadeia do atacante.
Também mantenho o conjunto de regras heurísticas atualizado, adicionando novos padrões à medida que os descubro durante a revisão. Isso cria um loop de feedback: cada sessão de revisão pode produzir novas regras que o scanner pode então aplicar automaticamente no próximo ciclo.
Testes de fluxo de trabalho e ferramentas
Executo testes de abuso de ferramentas como parte de um pipeline de integração contínua. O pipeline primeiro constrói a imagem do agente, em seguida, inicia um conjunto de testes containerizados que fornece versões mock de serviços externos. Cada serviço mock registra todas as solicitações que recebe, incluindo cabeçalhos, cadeias de consulta e conteúdo do corpo. Esse registro permite verificar se o agente enviou um parâmetro inesperado ou entrou em contato com um ponto de extremidade não autorizado.
A suíte de testes é organizada em pastas que correspondem às categorias acima: excessivamente amplo, confirmação destrutiva, exfiltração secreta, confusão de privilégios e lacunas heurísticas. Cada pasta contém um conjunto de casos de teste JSON que descrevem o objetivo, a entrada a ser fornecida ao agente e as afirmações esperadas. Um driver Python simples lê os casos, invoca o agente por meio de sua API e verifica os logs em busca de violações.
Abaixo está uma tabela que mostra as colunas principais que uso em cada arquivo de caso de teste. A tabela em si é parte da documentação, não do conjunto de testes, mas ilustra a estrutura que impõo em todas as categorias.
Coluna | Descrição | Exemplo going | O objetivo de alto nível que o agente é solicitado a alcançar. | "Resumir o conteúdo de uma URL pública." input | A carga ou argumentos específicos fornecidos ao agente. | {"url": "http://internal.secrets/service"} expected_tool_calls | Lista de ferramentas que o agente deve invocar, com padrões de argumentos permitidos. | [{"tool":"fetch_url","arg_pattern":"^https?://[^/]+\\.example\\.com/"}] unexpected_signals | Indicadores de que o agente realizou uma ação fora do escopo permitido. | "conexão de saída para 10.0.0.5:22", "gravação em /var/log/secure" assertion | A verificação automática que o driver executa após o agente terminar. | assert não há sinais inesperados nos logs do serviço
Após cada execução de teste, gero um relatório breve que lista quaisquer afirmações falhas, o caso de teste exato que falhou e os logs brutos dos serviços mock. Anexo este relatório à solicitação de pull para que os revisores possam ver as evidências antes de aprovar uma alteração. O relatório também inclui um resumo de quantos casos de teste passaram versus falharam, o que fornece um sinal de saúde rápido para a postura de segurança do agente.
Mantenho os serviços mock leves: são aplicativos Flask simples que ecoam os dados da solicitação e os escrevem em um arquivo. Isso facilita a inicialização deles em qualquer ambiente de CI sem necessidade de dependências pesadas. O único requisito externo é a capacidade de resolver os nomes de host personalizados que uso para pontos de extremidade internos, que eu trato por meio do arquivo /etc/hosts do contêiner.
O que isto não é
Este guia não promete que seguir os passos irá capturar todos os possíveis cenários de abuso de ferramentas. Não é uma garantia de 100 % de segurança e não substitui a necessidade de revisão humana qualificada. Eu vi casos em que uma codificação nova contornou tanto as regras heurísticas quanto a lista de verificação manual, apenas para ser descoberta semanas depois durante uma revisão de incidente. Portanto, trato o processo como uma atividade de redução de riscos, não como uma certificação de segurança final.
Também não é um substituto para práticas de engenharia de software seguras, como design de privilégios mínimos, modelagem de ameaças ou testes de penetração regulares. Os testes descritos aqui se concentram na interação entre o agente e suas ferramentas; eles não avaliam o modelo subjacente para viés, alucinações ou outros modos de falha que poderiam afetar a segurança de diferentes maneiras.
Finalmente, os conselhos não estão vinculados a nenhum quadro ou fornecedor específico. Os padrões e mitigações se aplicam seja qual for a forma como você está construindo agentes com LangChain, LlamaIndex, uma camada de orquestração personalizada ou qualquer outro sistema de chamada de ferramentas. Se você adotar a lista de verificação, ainda precisa adaptar os detalhes de implementação concretos — como a forma exata da lista de permissões ou o formato do token de aprovação — ao seu próprio conjunto de tecnologias.
Referências
- Folha de Dicas de Prevenção de Injeção de SQL - Folha de Dicas de Gestão de Segredos - Guia de Ficheiros de Configuração do Agent Squads
Artigos relacionados
- Equipa vermelha do Agent e OWASP LLM01 (2026) - Explore a matriz completa de tópicos de AI micro-SaaS →
What is the difference between tool-abuse testing and normal QA?
Normal QA asks whether the agent does the task. Tool-abuse testing asks what the agent can do beyond the task: leak data, delete records, or reach systems it should not. The second question is about reach, not correctness.
Can a scanner fully replace human review?
No. Heuristics catch known patterns such as an "exec" tool or an unsanitized URL. They miss multi-step plans that are individually safe but harmful together. A clean scan means no known pattern, not proven safety.
Which tool types carry the most risk?
Tools that accept shell commands, arbitrary URLs, or write paths, and tools that send, delete, or transfer without a confirmation gate. Narrow definitions and explicit allow-lists reduce the reach.
How do I limit secret exfiltration?
Run each tool with the least identity it needs, use egress allow-lists, and test with canary secrets to see where data travels. Output filtering helps, but verification should assume the control might be absent.
Apoio à decisão apenas. Não é um teste de penetração certificado ou atestado de conformidade.