본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 15. 13:49

Agentjacking: AI 코딩 에이전트가 자체 도구 파이프라인을 통해 하이재킹되는 방식

요약

AI 코딩 에이전트가 도구 실행 파이프라인을 통해 공격당하는 'Agentjacking' 공격 방식에 대해 설명합니다. 에이전트가 읽는 파일이나 외부 리소스에 포함된 악성 프롬프트 인젝션을 통해 자율적인 도구 사용 루프가 조작될 수 있음을 경고합니다.

핵심 포인트

  • Agentjacking은 모델 자체가 아닌 도구 실행 파이프라인을 공격 대상으로 함
  • 에이전트가 읽는 데이터(파일, 웹, API 응답)에 악성 지침을 주입하여 실행 유도
  • 에이전트의 자율성이 인간의 검토 과정을 생략하게 만들어 공격 위험을 높임
  • 단순한 샌드박싱만으로는 데이터 유출 및 외부 서비스 호출 공격을 막기 어려움

당신의 AI 코딩 에이전트는 파일을 읽고, 셸 명령(shell commands)을 실행하며, 외부 API를 호출할 수 있습니다. 이는 임의 코드 실행 프리미티브(arbitrary code execution primitive)에 대한 정확한 설명이기도 하며, 공격자들은 이미 이 점을 파악했습니다.

The Hacker News의 최근 보고서는 AI 기반 코딩 에이전트의 도구 실행 파이프라인(tool-execution pipeline)을 조작하여 에이전트를 하이재킹하는 공격 유형인 "Agentjacking"에 대해 상세히 다루고 있습니다. 에이전트는 모델 수준에서 침해되는 것이 아니라, 에이전트가 신뢰하는 도구들을 통해 침해됩니다. 에이전트가 악성 내용을 읽고, 이를 실행하도록 추론하는 과정에서 사람이 변경 사항(diff)을 확인하기도 전에 당신의 환경은 장악됩니다.

이것은 에이전트 보안 문제(agentic security problem)의 가장 명확한 형태입니다. 공격 표면(attack surface)은 LLM이 아니라, 바로 자율성(autonomy)입니다.

Agentjacking이 실제로 작동하는 방식

프로젝트의 스캐폴딩(scaffold)을 수행하고, 테스트를 실행하며, PR(Pull Request)을 푸시할 수 있는 현대적인 코딩 에이전트들은 도구 사용 루프(tool-use loop)를 통해 작동합니다. 이들은 지침을 받고, 도구를 호출하며(파일 읽기, 명령 실행, API 쿼리), 결과를 관찰하고, 다음에 무엇을 할지 결정합니다. 그 관찰-행동(observation-action) 루프가 바로 이들을 유용하게 만드는 핵심입니다.

동시에, 바로 그 점이 이들을 취약하게 만듭니다.

이러한 유형의 공격은 이 루프를 목표로 합니다. 에이전트가 관찰하게 될 무언가—에이전트가 읽는 파일, 가져오는 웹 페이지, 의존성(dependency)의 README, 조작된 도구 응답 등—에 악성 콘텐츠를 주입함으로써, 공격자는 에이전트의 다음 행동을 하이재킹할 수 있습니다. 에이전트는 자신의 추론을 따르며 공격자가 지정한 코드나 명령을 실행하게 됩니다. 에이전트는 자신이 무해한 일을 하고 있다고 속는 것이 아닙니다. 에이전트의 관점에서는 실제로 무해한 일을 하고 있는 것입니다. 악성 페이로드(malicious payload)가 정당한 지침으로 위장되어 있기 때문입니다.

핵심 익스플로잇 체인(exploit chain)은 다음과 같습니다:

  1. 공격자가 에이전트가 읽을 수 있는 어딘가(파일, 외부 리소스, 도구 출력 등)에 적대적 콘텐츠 (adversarial content)를 배치합니다.
  2. 에이전트가 해당 콘텐츠를 도구 결과 (tool result)로서 흡수합니다.
  3. 해당 콘텐츠에는 데이터처럼 보이는 것 안에 프롬프트 인젝션 (prompt injection)이 포함된 지침 페이로드 (instruction payload)가 들어 있습니다.
  4. "관찰한 데이터"와 "따라야 할 지침"을 구분할 방법이 없는 에이전트는 주입된 지침에 따라 행동합니다.
  5. 임의의 셸 명령 (shell commands)이 실행되거나, 파일이 유출되거나, 에이전트가 공격자가 제어하는 인프라로 호출을 보냅니다.

코딩 에이전트를 생산적으로 만드는 자율성 — 즉, 각 단계마다 인간의 승인 없이 다단계 작업을 수행할 수 있는 능력 — 이 이러한 공격을 잡아낼 수 있는 인간의 체크포인트를 제거해 버립니다.

기존 방어 체계가 놓친 것들

단순한 방어 방식은 에이전트의 실행 환경을 샌드박싱 (sandboxing)하는 것입니다. 이는 필요하지만 충분하지는 않습니다. 샌드박싱은 피해 범위 (blast radius)를 제한할 뿐, 인간이 검토하기 전에 에이전트가 데이터를 유출하거나, 외부 서비스를 호출하거나, 자신의 출력을 오염시키도록 유도되는 것을 막지는 못합니다.

사용자 입력 레이어에만 적용되는 프롬프트 인젝션 필터 (prompt injection filters) 또한 이 문제를 완전히 놓칩니다. 하이재킹 (hijack)에는 악의적인 사용자 프롬프트가 필요하지 않습니다. 인젝션은 에이전트가 환경으로부터 읽어들이는 콘텐츠인 _도구 결과 (tool result)_를 통해 전달됩니다. 대부분의 애플리케이션 수준 방어 체계는 도구 결과에 무엇이 포함되어 있는지 가시성을 확보하지 못합니다. 공격자가 창문을 통해 들어오는 동안 정문만 지키고 있는 격입니다.

표준 LLM 가드레일 (guardrails) (예: "신뢰할 수 없는 코드를 실행하지 마십시오"와 같은 시스템 프롬프트 지침) 또한 불충분합니다. 왜냐하면 에이전트가 행동에 나설 시점에는 이미 악의적인 콘텐츠를 신뢰하도록 조작되었기 때문입니다. 프롬프트 인젝션 문제는 지침(instruction)만으로는 해결할 수 없습니다.

Sentinel이 이를 잡아내는 방식

Sentinel은 이 문제를 해결하기 위해 특별히 설계되었습니다. 투명한 에이전트 프록시 (agentic proxy)가 사용자의 에이전트와 Anthropic(또는 사용 중인 다른 모델) 사이에 위치하며, 도구 결과(tool results)가 에이전트로 반환되기 전에 이를 스캔합니다. 이것이 바로 Agentjacking이 악용하는 정확한 가로채기 지점입니다.

모든 도구 결과는 Sentinel의 3단계 탐지 파이프라인을 거칩니다.

Layer 1 — 정규화 (Normalization): 패턴 매칭을 수행하기 전에, Sentinel은 보이지 않는 문자, 유니코드 태그 블록 (U+E0000), 양방향 (bidi) 오버라이드 문자 등을 제거하고 호모글리프 (homoglyphs)를 해결합니다. 이러한 기술들은 일반 텍스트처럼 보이는 내용 안에 주입된 지침 (injected instructions)을 숨기기 위해 흔히 사용됩니다.

Layer 2 — 패스트 패스 정규 표현식 (Fast-path regex): Sentinel은 정규화된 콘텐츠에 대해 신뢰도가 높은 패턴 라이브러리를 실행합니다. 도구/함수 오용 (tool/function abuse) 패턴이 이 세트에 포함되어 있습니다. 에이전트의 다음 동작을 재지시하도록 설계된 문구들은 콘텐츠가 벡터 모델 (vector model)에 도달하기 전, 거의 제로에 가까운 지연 시간으로 여기서 포착됩니다.

Layer 3 — 벡터 유사도 (Vector similarity): 패스트 패스에서 확정적인 판결을 내리지 못할 경우, Sentinel은 의미론적 임베딩 (semantic embedding)을 계산하고 코사인 유사도 (cosine similarity)를 사용하여 공격 시그니처 임베딩 라이브러리와 비교합니다. strict 모드에서는 플래그 임계값이 0.25로 낮아집니다. 이는 정확한 정규 표현식 패턴과 일치하지 않더라도 의미론적으로 인접한 주입 시도들이 여전히 드러남을 의미합니다.

도구 결과의 점수가 차단 임계값(코사인 유사도 > 0.82)을 초과하면, Sentinel은 차단된 콘텐츠를 무해한 플레이스홀더 (placeholder)로 대체합니다. Anthropic SDK는 정상적인 형식의 응답을 받게 되며, 에이전트는 페이로드 (payload)를 절대 볼 수 없습니다.

Layer 4 — 비밀 정보 탐지 (Secret detection) (Teams & Enterprise): 도구 결과의 위협 점수가 차단을 트리거하지 않더라도, Layer 4는 독립적으로 실행되어 콘텐츠에 나타나는 모든 API 키, 토큰 또는 자격 증명 (credentials)을 삭제 (redact)합니다. 만약 주입된 페이로드가 .env 파일을 읽고 유출하려고 시도했다면, 에이전트가 이를 어디로든 전달하기 전에 비밀 정보가 삭제됩니다.

실제 사례에서의 모습

다음은 Sentinel의 투명 프록시 (transparent proxy)를 통해 Claude Code 스타일의 에이전트를 연결하는 방법입니다 (예시 설정이며, 실제 모델과 키로 교체하여 사용하세요):

import anthropic

# SDK가 Anthropic을 직접 가리키는 대신 Sentinel을 가리키도록 설정합니다.
...

그리고 Sentinel이 주입된 도구 결과 (injected tool result)를 포착했을 때 반환하는 응답은 다음과 같습니다 (Sentinel API를 기반으로 한 예시 응답 형태):

{
  "request_id": "f7e2d1...",
  "security": {
...

"action_taken": "blocked"와 `

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0