개요
CrewAI 에이전트는 실제 동작을 수행하는 도구를 호출할 수 있습니다. 모델 컨텍스트에 있는 신뢰할 수 없는 텍스트는 그 동작을 바꿀 수 있습니다. 이 페이지는 그 위험을 제한하는 방법을 보여 줍니다. 관련 참고: OWASP Top 10 for LLM Applications (프롬프트 인젝션 및 과도한 agency). CrewAI는 hooks, guardrails, 구조화된 출력, Flow state라는 구성 요소를 제공합니다. 이것들을 안전한 기본값으로 켜지는 않습니다. 도구, allowlist, 승인 검사는 애플리케이션 코드에서 설정해야 합니다. Human-in-the-loop (HITL)는 승인이지 통제가 아닙니다. 사람이 수락, 거부, 의견을 남기도록 일시 중지합니다. 승인자를 인증하지 않고, 역할을 확인하지 않으며, 결정할 권한이 있었음을 증명하지 않습니다. 이 페이지는 위협 모델과 실행 경로 동작을 다룹니다. 실행 제한(max_rpm, max_iter, max_execution_time), verbose, 에이전트 설정은 에이전트와 에이전트 맞춤화를 참고하세요.
실행 경로별 통제
CrewAI에는 두 가지 일반적인 실행 경로가 있습니다. 일부 통제는 한 경로에서만 동작합니다.agent.kickoff()
Agent.kickoff()는 AgentExecutor를 실행합니다. Task나 Crew를 만들지 않습니다. LiteAgentOutput을 반환합니다.
@CrewBase 클래스의 @on 메서드는 해당 crew를 생성할 때 전역 hook 목록에 추가됩니다. 그 이후에는 같은 프로세스의 이후 agent.kickoff() 호출에서도 실행될 수 있습니다. 하나의 crew에 한정되지 않습니다.
직접 에이전트 상호작용을 참고하세요.
Crew와 Flow
Crew와 Flow kickoff는 Task guardrails, Taskhuman_input, execution boundary hooks를 사용할 수 있습니다. Tool hooks와 LLM hooks도 적용됩니다.
1. 신뢰할 수 있는 입력 vs 신뢰할 수 없는 입력
모델에 도달하는 모든 입력을 신뢰할 수 있음 또는 신뢰할 수 없음으로 표시하세요.
규칙:
- 프롬프트의 라벨은 모델이 신뢰할 수 없는 텍스트를 따르는 것을 막지 않습니다. 코드 통제를 사용하세요.
- 신뢰할 수 없는 텍스트를 시스템 수준 지시에 추가하지 마세요. 표시된 섹션에 두세요.
- 각 에이전트에 필요한 필드만 주세요.
- 자격 증명은 환경 또는 secrets manager에서 도구 코드로 로드하세요. 프롬프트, 메모리, 모델이 만드는 도구 인자에 넣지 마세요.
- 정책은 코드에서 강제하세요(tool hooks, 인자 allowlist, guardrails).
backstory 텍스트는 약한 통제입니다. 모델이 신뢰할 수 없는 텍스트를 따르는 것을 막지 않습니다. 정책은 아래 tool hooks와 allowlist로 강제하세요.
Crew와 Flow 입력에는 execution boundary hooks (INPUT)를 사용하세요. 이 hooks는 단독 agent.kickoff()에서는 실행되지 않습니다. MCP는 MCP 보안을 참고하세요.
2. 프롬프트 인젝션
프롬프트 인젝션은 에이전트 지시를 덮어쓰려는 신뢰할 수 없는 텍스트입니다. 예: 이전 규칙 무시, 도구 호출, 데이터 유출, 작업 변경. 예:- “Ignore all previous instructions and…”
- “You are now in developer mode…”
- 필터를 겨냥한 인코딩 또는 다국어 지시
- system prompt를 공개하거나 비공개 컨텍스트를 전달하라는 요청
프롬프트 문구에만 의존하지 마세요. 모델이 유도된 뒤에 에이전트가 할 수 있는 일을 제한하세요.
3. 간접 프롬프트 인젝션
간접 프롬프트 인젝션은 에이전트가 나중에 가져오는 콘텐츠에 지시를 넣습니다. 지시는 사용자 메시지에 없습니다. 웹 페이지, 이메일, PDF, 티켓, RAG chunk에 있을 수 있습니다. 예:- 사용자가 벤더 페이지를 요약하고 outreach 이메일을 작성하라고 요청합니다.
- 스크레이프 또는 검색이 공격자에게 BCC하고 API 키를 첨부하라는 페이지 텍스트를 반환합니다.
- 에이전트가 초안을 작성하거나 보낼 때 그 텍스트를 따릅니다.
- 연구 에이전트에는 읽기 및 fetch 도구만 주세요. 실행 에이전트에는 보내기, 쓰기, 데이터 변경 도구만 주세요.
- 그 사이에 검증된 구조화 상태를 전달하세요. 원시 도구 출력을 전달하지 마세요.
- tool hooks에서 대상 allowlist를 만드세요(도메인; 필요하면 private 및 link-local 범위를 차단).
- MCP 도구 메타데이터 인젝션은 MCP 보안을 참고하세요.
4. 도구 남용
도구 남용은 유효한 도구를 해로운 방식으로 사용하는 것입니다. 예: 데이터 삭제, 데이터 내보내기, 지출, 메시지 전송, 코드 실행.- 각 에이전트에 역할에 필요한 도구만 주세요.
- 인자는 코드에서 제한하세요.
- 수명이 짧은 도구별 자격 증명을 선호하세요. 권한이 높은 계정을 하나 공유하지 마세요.
@on의 tools=는 sanitize_tool_name(소문자, 밑줄) 이후에 매칭됩니다. 정규화된 도구 이름을 사용하세요(예: send_email, 또는 FileWriterTool의 file_writer_tool).
도구 호출이 차단되면 도구는 실행되지 않습니다. 에이전트는 도구가 차단되었다는 메시지를 받습니다. 실행은 계속됩니다. 차단된 호출에도 POST_TOOL_CALL은 실행됩니다.
필요하면 POST_TOOL_CALL로 결과를 정리하세요. 이 단계는 선택 사항입니다. Tool Hooks를 참고하세요.
5. 출력 검증
핸드오프, 저장, 부수 효과, API 응답 전에 출력을 검사하세요.output_pydantic과 output_json은 스키마 형태만 검사합니다. 정책은 검사하지 않습니다. 의도나 비즈니스 규칙이 필요하면 guardrail callable을 추가하세요.
Task 경로 (Crew)
agent.kickoff() 경로
Agent.guardrail / guardrail_max_retries를 사용하세요. kickoff()에 response_format=을 전달할 수도 있습니다. Agent.guardrail은 Crew Task 실행 중에는 실행되지 않습니다.
문자열 또는 LLMGuardrail 검사는 Task 경로와 kickoff 경로 모두에서 동작합니다. Crew와 Flow 실행은 execution boundary hooks도 사용할 수 있습니다.
6. 승인 게이트
HITL은 승인이지 통제가 아닙니다. 사람에게 수락 또는 거부를 요청합니다. 그 사람을 인증하지 않고, 역할을 확인하지 않으며, 권한이 있었음을 기록하지 않습니다. 기본 콘솔input()은 키보드 앞에 있는 누구든 받습니다.
되돌릴 수 없거나, 비용이 크거나, 공개되는 동작 전에는 승인을 요구하세요. 일시 중지는 코드에 두세요. 프롬프트에만 의존하지 마세요.
Task
human_input=True는 에이전트가 도구를 실행하고 결과를 만든 후에 일시 중지합니다. 해당 출력이 수락되기 전에 최종 답변을 검토합니다. 도구 실행을 차단하지 않습니다. 그 Task의 에이전트는 사람이 실행을 보기 전에 파괴적인 도구를 호출할 수 있습니다. 실행 후 출력 검토로 충분할 때만 사용하세요. 실행 중 인간 입력을 참고하세요.
도구가 실행되기 전에 승인하려면 tool hook과 HookAborted를 사용하세요.
request_human_input도 승인입니다. yes를 입력한 사람을 검증하지 않습니다. 신원 또는 정책 검사가 필요하면 직접 추가하세요.
다른 옵션:
- Task
human_input=True— Task / Crew 경로에서만 실행 후 출력 검토. ToolCallHookContext.request_human_input—agent.kickoff()와 Crew 실행에서 동작합니다. 기본적으로 차단형 콘솔input()을 사용합니다.@human_feedback/ Enterprise HITL webhooks — Human-in-the-Loop, Flows의 Human Feedback. 같은 한계: 이 API 밖에서 추가하지 않으면 CrewAI는 승인자를 검증하지 않습니다.
7. 위임 제한
allow_delegation기본값은False입니다. 에이전트가 협업해야 할 때만True로 설정하세요.- 일부 에이전트에만 위임을 허용하고 다른 에이전트에는 막을 수는 없습니다. 한계는 crew 소속과 각 에이전트의
tools입니다. - Hierarchical process는
manager_agent.allow_delegation = True를 설정합니다. 고위험 도구는 전문 에이전트에 두세요. 그 도구는 hooks 또는 승인 뒤에 두세요. - A2A에서는
A2AClientConfig를 선호하세요. 원격 completion status를 신뢰하지 않으면trust_remote_completion_status=False로 두세요. A2A Agent Delegation을 참고하세요.
8. 에이전트 간 격리
- 읽기/쓰기 권한을 에이전트 간에 분리하세요. 예: researcher는 읽고, actor는 보내거나 씁니다.
- 신뢰할 수 없는 수집과 권한이 있는 동작에는 별도 crews 또는 Flow 단계를 사용하세요.
- 단계 간에 검증된 구조화 상태를 전달하세요. 원시 도구 출력을 전달하지 마세요.
- 에이전트별
knowledge_sources로 knowledge를 제한하세요. 메모리는 에이전트에 자체Memory또는MemoryScope를 주거나 crew에서 메모리를 끄세요. Task 경로에서 에이전트의memory=False는None이 됩니다. 그러면 crew에 메모리가 켜져 있으면 에이전트는 crew 메모리를 사용합니다. - E2B tools 또는 Modal 같은 외부 sandbox에서 코드를 실행하세요. sandbox 출력은 신뢰하지 마세요.
CodeInterpreterTool은 제거되었습니다.allow_code_execution은 deprecated이며 더 이상 코드 도구를 연결하지 않습니다. - 신뢰하는 MCP 서버에만 연결하세요. MCP 보안을 참고하세요.
관련 가이드
효과적인 에이전트 제작
전문화된 에이전트를 위한 roles, goals, backstories.
프로덕션 아키텍처
Flows, guardrails, 구조화된 출력.
Tool Hooks
도구 호출에 대한 정책 검사와 승인.
MCP 보안
MCP의 신뢰, 메타데이터 인젝션, 전송.
Task Guardrails
계속하기 전에 Task 출력을 검증합니다.
Human-in-the-Loop
Task 출력과 도구 호출에 대한 사람 검토.
에이전트 맞춤화
실행 제한, verbose, 에이전트 설정.
