Skip to main content

Visão Geral

Agentes CrewAI podem chamar ferramentas que executam ações reais. Texto não confiável no contexto do modelo pode mudar essas ações. Esta página mostra como limitar esse risco. Referência relacionada: OWASP Top 10 for LLM Applications (prompt injection e agency excessiva). O CrewAI oferece blocos de construção: hooks, guardrails, saídas estruturadas e estado de Flow. Ele não liga esses recursos como um padrão seguro. Você deve definir ferramentas, allowlists e checagens de aprovação no código da aplicação. Human-in-the-loop (HITL) é aprovação, não um controle. Ele pausa para uma pessoa aceitar, rejeitar ou comentar. Não autentica o aprovador, não verifica o papel dele e não prova que ele tinha permissão para decidir. Esta página cobre o modelo de ameaça e o comportamento por caminho de execução. Para limites de execução (max_rpm, max_iter, max_execution_time), verbosidade e configurações do agente, veja Agentes e Personalize Agentes.

Controles por caminho de execução

O CrewAI tem dois caminhos de execução comuns. Alguns controles funcionam em apenas um caminho.

agent.kickoff()

Agent.kickoff() executa um AgentExecutor. Ele não cria uma Task nem um Crew. Retorna LiteAgentOutput. Métodos @on em uma classe @CrewBase são adicionados à lista global de hooks quando você cria aquele crew. Depois disso, esses hooks também podem rodar em chamadas posteriores a agent.kickoff() no mesmo processo. Eles não ficam limitados a um único crew. Veja Interação direta com o agente.

Crew e Flow

Kickoffs de Crew e Flow podem usar Task guardrails, Task human_input e execution boundary hooks. Tool hooks e LLM hooks também se aplicam.

1. Entradas confiáveis vs não confiáveis

Marque toda entrada que chega ao modelo como confiável ou não confiável. Regras:
  1. Um rótulo no prompt não impede o modelo de seguir texto não confiável. Use controles em código.
  2. Não adicione texto não confiável a instruções de nível de sistema. Mantenha-o em uma seção marcada.
  3. Dê a cada agente apenas os campos de que ele precisa.
  4. Carregue credenciais no código da ferramenta a partir do ambiente ou de um gerenciador de segredos. Não as coloque em prompts, memória ou argumentos de ferramenta que o modelo monta.
  5. Aplique política em código (tool hooks, allowlists de argumentos, guardrails).
O texto de backstory é um controle fraco. Ele não impede o modelo de seguir texto não confiável. Use tool hooks e allowlists abaixo para aplicar a política. Para entradas de Crew e Flow, use execution boundary hooks (INPUT). Esses hooks não rodam em agent.kickoff() isolado. Para MCP, veja Segurança MCP.

2. Prompt injection

Prompt injection é texto não confiável que tenta substituir as instruções do agente. Exemplos: ignorar regras anteriores, chamar ferramentas, vazar dados ou mudar a tarefa. Exemplos:
  • “Ignore all previous instructions and…”
  • “You are now in developer mode…”
  • Instruções codificadas ou multilíngues voltadas a filtros
  • Pedidos para revelar o system prompt ou encaminhar contexto privado
Não dependa só do texto do prompt. Limite o que o agente pode fazer depois que o modelo for induzido.

3. Prompt injection indireto

Prompt injection indireto coloca instruções em conteúdo que o agente busca depois. As instruções não estão na mensagem do usuário. Elas podem estar em uma página web, e-mail, PDF, ticket ou chunk de RAG. Exemplo:
  1. O usuário pede ao agente para resumir a página de um fornecedor e redigir um e-mail de outreach.
  2. O scrape ou a busca devolve texto da página pedindo BCC para um atacante e anexo de chaves de API.
  3. O agente segue esse texto ao redigir ou enviar o e-mail.
O que fazer:
  • Dê aos agentes de pesquisa apenas ferramentas de leitura e fetch. Dê aos agentes de ação apenas ferramentas que enviam, escrevem ou alteram dados.
  • Passe estado estruturado validado entre eles. Não passe saída bruta de ferramenta.
  • Faça allowlist de destinos em tool hooks (domínios; bloqueie faixas privadas e link-local quando necessário).
  • Para injeção de metadados de ferramentas MCP, veja Segurança MCP.
Use passos de Flow separados para pesquisa e envio. Assim o remetente não recebe conteúdo extraído bruto.

4. Abuso de ferramentas

Abuso de ferramentas é o uso de uma ferramenta válida de forma prejudicial. Exemplos: apagar dados, exportar dados, gastar dinheiro, enviar uma mensagem ou executar código.
  • Dê a cada agente apenas as ferramentas que o papel exige.
  • Restrinja argumentos em código.
  • Prefira credenciais de curta duração por ferramenta. Não compartilhe uma conta de alto privilégio.
tools= em @on é comparado depois de sanitize_tool_name (minúsculas, underscores). Use o nome sanitizado da ferramenta (por exemplo send_email, ou file_writer_tool para FileWriterTool).
Se um tool hook levantar qualquer exceção que não seja HookAborted, o CrewAI ignora o erro e a ferramenta ainda executa. Só HookAborted (ou um retorno legado False) bloqueia a chamada.
Quando uma chamada de ferramenta é bloqueada, a ferramenta não executa. O agente recebe uma mensagem de que a ferramenta foi bloqueada. A execução continua. POST_TOOL_CALL ainda roda em chamadas bloqueadas. Use POST_TOOL_CALL para limpar resultados se precisar. Esse passo é opcional. Veja Tool Hooks.

5. Validação de saída

Verifique a saída antes de entregá-la, armazená-la, causar um efeito colateral ou devolvê-la de uma API. output_pydantic e output_json verificam só a forma do schema. Eles não verificam política. Adicione um guardrail callable quando precisar de intenção ou regras de negócio.

Caminho da Task (Crew)

Veja Task Guardrails.

Caminho agent.kickoff()

Use Agent.guardrail / guardrail_max_retries. Você também pode passar response_format= em kickoff(). Agent.guardrail não roda durante a execução de Task do Crew. Checagens de string ou LLMGuardrail funcionam no caminho da Task e no caminho de kickoff. Execuções de Crew e Flow também podem usar execution boundary hooks.

6. Portões de aprovação

HITL é aprovação, não um controle. Pede a uma pessoa para aceitar ou rejeitar. Não autentica essa pessoa, não verifica o papel dela e não registra que ela estava autorizada. O input() padrão do console aceita quem estiver no teclado. Exija aprovação antes de ações irreversíveis, caras ou públicas. Coloque a pausa no código. Não dependa só do prompt. Task human_input=True pausa depois que o agente executou as ferramentas e produziu um resultado. Ele revisa a resposta final antes que essa saída seja aceita. Não bloqueia a execução de ferramentas. Um agente nessa Task ainda pode chamar ferramentas destrutivas antes que qualquer humano veja a execução. Use só quando a revisão da saída após a execução for suficiente. Veja Input humano na execução. Para aprovação antes de uma ferramenta rodar, use um tool hook e HookAborted:
request_human_input ainda é aprovação. Não valida quem digitou yes. Adicione sua própria checagem de identidade ou política se precisar. Outras opções:
  • Task human_input=True — revisão da saída após a execução só no caminho Task / Crew.
  • ToolCallHookContext.request_human_input — funciona em agent.kickoff() e em execuções de Crew. Por padrão usa um input() de console bloqueante.
  • @human_feedback / webhooks HITL Enterprise — Human-in-the-Loop, Human Feedback em Flows. O mesmo limite: o CrewAI não verifica o aprovador a menos que você adicione isso fora dessas APIs.

7. Limitando a delegação

  • allow_delegation é False por padrão. Defina como True apenas quando os agentes precisarem colaborar.
  • Você não pode permitir delegação para alguns agentes e bloqueá-la para outros. Os limites são a associação ao crew e as tools de cada agente.
  • O processo hierárquico define manager_agent.allow_delegation = True. Mantenha ferramentas de alto risco em agentes especialistas. Coloque essas ferramentas atrás de hooks ou aprovações.
  • Para A2A, prefira A2AClientConfig. Mantenha trust_remote_completion_status=False a menos que você queira confiar no status de conclusão remoto. Veja Delegação de Agente A2A.

8. Isolamento entre agentes

  1. Separe acesso de leitura e escrita entre agentes. Exemplo: um pesquisador lê; um ator envia ou escreve.
  2. Use crews separados ou passos de Flow para ingestão não confiável e ação privilegiada.
  3. Passe estado estruturado validado entre os passos. Não passe saída bruta de ferramenta.
  4. Limite knowledge com knowledge_sources por agente. Para memória, dê ao agente seu próprio Memory ou MemoryScope, ou desligue a memória no crew. No caminho da Task, memory=False em um agente vira None. O agente então usa a memória do crew se o crew tiver memória habilitada.
  5. Execute código em um sandbox externo como ferramentas E2B ou Modal. Trate a saída do sandbox como não confiável. CodeInterpreterTool foi removido. allow_code_execution está deprecated e não anexa mais uma ferramenta de código.
  6. Conecte-se apenas a servidores MCP em que você confia. Veja Segurança MCP.
Veja Arquitetura de Produção.

Guias relacionados

Criando Agentes Eficazes

Roles, goals e backstories para agentes especializados.

Arquitetura de Produção

Flows, guardrails e saídas estruturadas.

Tool Hooks

Verificações de política e aprovação em torno de chamadas de ferramentas.

Segurança MCP

Confiança, injeção de metadados e transporte para MCP.

Task Guardrails

Valide saídas de Task antes que elas continuem.

Human-in-the-Loop

Revisão humana da saída da Task e das chamadas de ferramentas.

Personalize Agentes

Limites de execução, verbosidade e configurações do agente.