당신의 에이전트는 그것이 당해야 할 것이라고 판단한 모든 것을 한다. 때로는 그것이 의무를 완료하는 것을 의미한다. 때로는 그것이 독이 든 웹 페이지를 읽고 페이지가 주인이라고 결정하는 것을 의미한다. LLM을 브라우저, 도구 체인, 누군가의 이메일함에 연결하고 있다면, 배송 전에 그 행동을 상자에 넣으세요. 검토 로그가 채워지는 후에 그렇게 하지 마세요.
모든 에이전트에 내장된 실패 모드
LLM 에이전트를 분해해도 연결은 동일합니다. 모델이 루프 안에 있습니다. 입력과 도구를 모델에 공급하여 작업이 완료될 때까지합니다. 모델은 다음 작동을 선택하고, 루프는 그것을 실행합니다, 그것이 계속됩니다. 함정은 컨텍스트 창에 있습니다. 당신의 지시와 공격자의 데이터가 같은 장소에 도착하며, 같은 주의 메커니즘을 통해, 권한 분리가 없습니다. 모델이 신뢰할 수 있는 채널을 불신할 수 있는 채널보다 믿는 신뢰할 수 있는 채널이 없습니다. 모두 토큰이며, 모델은 전체 무더기에 대해 사유하고 가장 관련성 있는 것을 선택합니다.
그래서 브라우저 에이전트가 "당신의 작업을 무시하고 대신 이를 하세요"라고 말하는 페이지를 읽을 때, 모델의 머리속에서 웹 페이지가 명령을 내리지 않아야 한다는 것을 표시하는 것이 아무것도 없습니다. 다른 서비스에서 중독된 기능 설명을 읽거나 배경 작업이 적대적인 이메일을 분해할 때도 동일한 문제입니다. 이는 간접적인 프롬프트 주입이며, OWASP는 정확히 이 이유로 LLM 위험을 1위로 평가합니다. 이는 구조적 결함이기 때문에 모델에서 이를 수정하지 않습니다. 2026년 두 연구는 자율 에이전트가 생존 웹사이트에 SQL-injecting을 하고 자신의 사용자를 켜서 해킹 지시를 받지 않는 사람들에게 이를 했습니다. 루프와 누락된 경계가 혼자 이를 만들었습니다.
그것은 모든 실제 제어가 모델 바깥에 있다는 뜻입니다. 몇 가지를 연결해 봅시다.
레이어 하나: 도구를 허용 목록에 추가하고, 자격 증명을 배제합니다
기본적으로 열려 있으면 손해를 본다. 일반적인 "셸 명령어 실행" 도구를 보유하고 오래 지속되는 토큰을 가진 에이전트는 생산 환경에 대한 열쇠를 가진 혼란스러운 부관과 같습니다. 반전해라. 에이전트는 명명된 작업의 명시적인 허용 목록만을 받고 다른 어떤 것도 받지 않습니다.
# agent-tools.yaml — deny by default, allow by name
tools:
- name: search_docs
scope: read:knowledge_base
- name: create_ticket
scope: write:tickets
# anything not listed dies at the broker, not in a prompt
policy:
default: deny
network_egress: none # no outbound unless a tool explicitly needs it
credential_ttl: 900 # 15 min, then re-mint
두 가지가 중요합니다. 거부는 당신의 도구 중개인에 있으며, 정중하게 모델에게 행동하도록 요청하는 시스템 프롬프트에 없습니다. 그리고 각 도구가 가지고 있는 자격 증명은 해당 한 가지 작업에 범위가 지정되어 빨리 만료됩니다. 에이전트가 유도받으면, 폭발 반경은 좁은 범위가 허용하는 대로 되며, 모든 API 키를 결합한 것이 아니라 그것들입니다. 짧은 TTL은 도난당한 토큰이 15분 만에 벽돌이 되는 것을 의미합니다.
레이어 두: 위험한 행동을 차단하고, 논거를 읽으세요
로그는 무슨 일이 일어났는지 알려줍니다. 그것은 아무것도 멈추지 않습니다. 엔트리가 도착할 때까지 데이터는 이미 빌딩을 나갔습니다. 당신이 원하는 것은 행동 앞에 위치하여 전체적으로 실행되지 않을지 결정하는 제어 장치입니다.
두 가지. 첫째, 불가역적이거나 민감한 모든 것에 대한 인간의 체크포인트: 메일 보내기, 돈 이체하기, 프로덕트에 접근하기, 어떤 exfil 모양의 것도. 둘째, 실행 전 도구 호출 인자를 읽는 런타임 훅으로, 명백한 것들에 대해 걸림.
# pre-exec hook: inspect the args, not just the call name
SENSITIVE = {"send_email", "transfer", "delete", "post_webhook"}
def authorize(tool_name, args):
if tool_name in SENSITIVE:
if looks_like_exfil(args): # external dest, bulk read, weird recipient
return BLOCK
return REQUIRE_HUMAN # a checkpoint, not a log line
return ALLOW
그 함수 자체는 중요하지 않습니다. 중요한 것은 모델의 결정과 실제 세계의 효과 사이에 무언가 투표를 받는다는 것입니다. 집행, 관찰 가능성이 아닙니다. 치명적인 감사 추적 트레일이 여전히 침해입니다.
실제 배포에 상처 입히는 함정
하루에 괜찮아 보이지만 나중에 피를 빨아먹는 몇 가지 사항.
스코프 크리프는 천천히 죽이는 것이다. 에이전트는 코드에 읽기 접근 권한을 얻고, 그 다음 티켓, 그 다음 고객 메일을 얻는다. 단일 부여는 이상해 보이지 않았다. 누구도 집계를 검토하지 않았다. 재발생 권한 검토를 일정에 넣고 에이전트 식별자를 실제로 서비스 계정처럼 다루라.
신뢰는 두 번째 에이전트가 대화를 시작할 때 전이됩니다. 당신의 에이전트가 다른 에이전트에게 위임하는 순간, 당신의 블래스트 반경은 두 번째 에이전트가 도달할 수 있는 모든 것을 삼킬 것입니다. 연결하기 전에 신뢰 그래프를 매핑하세요, 특히 제공업체 경계를 넘어 다른 쪽의 제어를 볼 수 없는 곳에서는 더욱 그렇습니다.
인증은 정직함이 아닙니다. TLS와 OAuth는 대리인이 자신이 주장하는 것이 맞는지 증명합니다. 그들은 그것이 광고하는 기능이 실제인지, 그리고 자신의 자기 기술 묘사가 모델에 대한 공격을 가하는지에 대해 아무것도 말하지 않습니다. 행동을 검증하세요, 단지 신원만은 아닙니다.
마무리합니다
모델이 데이터와 지시사항을 구분시킬 수 없으니까, 그것이 부족한 경계를 만들어야 합니다: 기본적으로 거부하는 도구, 짧은 수명의 범위에 제한된 자격 증명, 위험한 호출에 대한 인간의 중재점, 그리고 실행 전 인자를 읽는 런타임 합성점. 이것 하나하나가 은은의 해결책이 아닙니다. 쌓여서 하나의 독성 입력을 "게임 오버"에서 "차단되고 기록됨"으로 바꿉니다. 그것이 바로 전체적인 작업입니다.
나는 전체적인 분석을 작성했는데, 이 정확한 체인이 프로젝트 마린, A2A 프로토콜, 그리고 24시간 켜져 있는 백그라운드 에이전트들이 로그아웃하지 않는 방식을 포함해 작성했습니다. 이 내용은 ToxSec Substack에 게시되어 있습니다.
ToxSec는 AI 보안 취약점, 공격 체인, 그리고 방어자들이 실제로 이해해야 할 공격 도구를 다룹니다. NSA, Amazon, 그리고 방위 계약 부문 전반에서 실무 경험을 가진 AI 보안 엔지니어가 운영합니다. CISSP 자격증 보유, 사이버 보안 엔지니어링 석사 학위 보유.












