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, Taskhuman_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:
- Um rótulo no prompt não impede o modelo de seguir texto não confiável. Use controles em código.
- Não adicione texto não confiável a instruções de nível de sistema. Mantenha-o em uma seção marcada.
- Dê a cada agente apenas os campos de que ele precisa.
- 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.
- Aplique política em código (tool hooks, allowlists de argumentos, guardrails).
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:- O usuário pede ao agente para resumir a página de um fornecedor e redigir um e-mail de outreach.
- O scrape ou a busca devolve texto da página pedindo BCC para um atacante e anexo de chaves de API.
- O agente segue esse texto ao redigir ou enviar o e-mail.
- 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.
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).
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)
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. Oinput() 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 emagent.kickoff()e em execuções de Crew. Por padrão usa uminput()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éFalsepor padrão. Defina comoTrueapenas 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
toolsde 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. Mantenhatrust_remote_completion_status=Falsea menos que você queira confiar no status de conclusão remoto. Veja Delegação de Agente A2A.
8. Isolamento entre agentes
- Separe acesso de leitura e escrita entre agentes. Exemplo: um pesquisador lê; um ator envia ou escreve.
- Use crews separados ou passos de Flow para ingestão não confiável e ação privilegiada.
- Passe estado estruturado validado entre os passos. Não passe saída bruta de ferramenta.
- Limite knowledge com
knowledge_sourcespor agente. Para memória, dê ao agente seu próprioMemoryouMemoryScope, ou desligue a memória no crew. No caminho da Task,memory=Falseem um agente viraNone. O agente então usa a memória do crew se o crew tiver memória habilitada. - Execute código em um sandbox externo como ferramentas E2B ou Modal. Trate a saída do sandbox como não confiável.
CodeInterpreterToolfoi removido.allow_code_executionestá deprecated e não anexa mais uma ferramenta de código. - Conecte-se apenas a servidores MCP em que você confia. Veja Segurança MCP.
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.
