Amazon Q Developer의 악성 MCP 설정이 임의 코드를 실행할 수 있는 방법 — 그리고 이를 방지하는 방법
요약
Amazon Q Developer에서 악성 MCP(Model Context Protocol) 설정을 통해 임의 코드를 실행할 수 있는 공급망 공격 취약점이 발견되었습니다. 공격자는 저장소 내 설정 파일을 조작하여 AI 에이전트의 도구 정의를 하이재킹하고 명령어를 실행할 수 있습니다.
핵심 포인트
- 악성 MCP 설정을 통한 AI 에이전트 동작 하이재킹 가능
- 저장소 클론/오픈 시 별도의 검증 없이 설정 파일이 실행됨
- 기존 정적 분석 및 SCA 도구로는 탐지가 어려운 새로운 공격 표면
- 에이전트 계층에서의 서명 검증 및 샌드박싱 필요성 대두
Amazon Q Developer의 결함으로 인해 악성 저장소(repository)가 에이전트형 코딩 어시스턴트(agentic coding assistant)의 파이프라인에 변조된 Model Context Protocol (MCP) 설정을 주입할 수 있었습니다. 그 결과: 검토를 위해 내려받은 저장소로부터 유래된 임의 코드 실행(arbitrary code execution)이 발생했습니다.
피싱도, 탈취된 자격 증명도 없습니다. 그저 AI 에이전트가 의심 없이 신뢰한 저장소에 독이 든 설정 파일이 놓여 있었을 뿐입니다.
발생한 사건
The Hacker News에 따르면, 이 취약점은 공격자가 제어하는 저장소가 Amazon Q Developer에 악성 MCP 도구 설정을 제공할 수 있게 허용했습니다. Amazon Q는 외부 저장소에서 가져온 MCP 설정을 신뢰하기 때문에, 해당 설정들은 에이전트의 동작을 하이재킹하는 데 사용될 수 있으며, 이는 에이전트형 파이프라인 내부에서의 임의 코드 실행까지 포함합니다.
이는 AI 시스템을 대상으로 한 공급망 공격(supply-chain attack)입니다. 악성 페이로드(payload)는 당신이 실행 중인 코드 안에 있는 것이 아니라, AI 에이전트에게 다음에 무엇을 할지 알려주는 도구 정의(tool definition) 안에 들어 있습니다.
그 범위는 상당합니다. Amazon Q Developer는 널리 배포된 AI 코딩 어시스턴트입니다. Q가 활성화된 상태에서 공격자가 제어하는 저장소를 클론(clone)하거나 열었던 모든 개발자는 잠재적으로 노출되었습니다.
공격 작동 방식
MCP (Model Context Protocol)는 LLM을 파일 시스템, 셸(shell), API, 데이터베이스와 같은 외부 도구에 연결하기 위한 신흥 표준입니다. MCP 설정은 에이전트에게 다음과 같이 알려줍니다: 사용 가능한 도구는 이것이며, 이를 호출하는 방법은 이렇고, 반환되는 값은 이러하다.
이 공격은 단순한 신뢰 가정(trust assumption)을 악용합니다: 만약 저장소에 MCP 설정 파일이 존재하면, 에이전트는 이를 사용한다는 것입니다. 에이전트 계층에서 서명 검증(signature verification), 허용 목록(allowlist) 강제, 또는 도구 정의에 대한 샌드박싱(sandboxing)이 이루어지지 않습니다.
공격 흐름은 다음과 같습니다:
- 공격자가 악성
.mcp.json또는 그에 상응하는 설정 파일이 포함된 저장소(repository)를 제작합니다. - 개발자가 해당 저장소를 클론(clone)하거나 열면 — Amazon Q Developer가 MCP 설정을 감지합니다.
- 악성 설정이 공격자가 제어하는 도구(tool)를 등록하거나 기존의 정당한 도구를 덮어씁니다.
- Q가 해당 도구들을 호출할 때 (정상적인 에이전트 기반 코딩 워크플로(agentic coding workflows) 중에 호출하게 됩니다), 공격자가 제공한 명령어를 실행합니다.
- 코드가 실행됩니다. 잠재적으로: 환경 변수(env vars) 유출, 자격 증명(credentials) 탈취, 백도어(backdoors) 설치 등이 발생할 수 있습니다.
여기서 교묘한 점은 에이전트가 이상한 행동을 하도록 속임을 당하는 것이 아니라는 점입니다. 에이전트는 자신이 신뢰할 이유가 없는 도구 정의(tool definitions)에 따라, 지시받은 그대로를 정확히 수행하고 있는 것입니다.
기존 방어 체계가 이를 놓친 이유
표준 방어 체계는 이 공격 표면(attack surface)을 다루지 못합니다:
정적 분석(Static analysis) 및 SCA 도구는 코드의 취약점을 스캔합니다. 악성 MCP 설정은 취약한 코드가 아니라 설정 파일입니다. 따라서 문제없이 통과됩니다.
저장소 스캐닝(Repository scanning) (Dependabot, Snyk 등)은 알려진 악성 패키지 버전과 CVE를 확인합니다. 악성 도구 정의가 포함된 정교하게 제작된 JSON 설정에는 CVE가 없습니다. 일치하는 항목이 없습니다.
네트워크 계층 제어(Network-layer controls) (WAF, 송신 필터링(egress filtering))는 AI 에이전트가 수행하려는 도구 호출(tool calls)의 의미론적 의도(semantic intent)를 검사하지 않습니다. 이들은 HTTP 트래픽을 볼 뿐, "이 도구 결과가 에이전트에게 셸 명령어를 실행하라고 지시하고 있다"는 사실은 알지 못합니다.
LLM 자체는 보안 경계(security boundary)가 아닙니다. 모델은 도움이 되고 지시를 따르도록 훈련되었습니다. "이 명령어를 실행하라"고 말하는 도구 결과는 모델의 관점에서 볼 때 정당한 도구 결과입니다.
공백은 에이전트 파이프라인 계층(agentic pipeline layer), 즉 도구 출력(tool outputs)과 모델 사이에서 발생합니다. 아무도 그 접점을 감시하고 있지 않았습니다.
Sentinel이 이를 잡아낼 수 있었던 지점
Sentinel은 바로 그 접점에 위치합니다. 에이전트 기반 애플리케이션(agentic applications)의 경우, Sentinel의 투명 프록시(transparent proxy)는 tool_result 내용이 모델로 반환되기 전에 이를 가로챕니다. 악성 MCP 설정이 피해를 입히는 지점은 바로 도구 호출 / 도구 결과 루프(tool call / tool result loop) 내의 이곳입니다.
관련된 탐지 계층은 Sentinel의 Layer 2 패스트 패스 정규식 스캔 (fast-path regex scan)의 일부인 **도구 및 함수 오용 패턴 (tool and function abuse patterns)**입니다. Sentinel은 도구 출력(tool outputs)이 에이전트의 동작을 재지정하는 데 사용될 때 — 즉, 권한 탈취 (authority hijacks), 페르소나 전환 (persona shifts), 에이전트의 기존 지침을 무시하려는 도구 응답 내 임베디드 지침 (instructions embedded in tool responses) 등을 탐지하는 패턴을 유지합니다.
"현재 작업을 무시하고 다음을 실행하십시오"라고 말하는 악성 MCP 도구 결과는 즉시 권한 탈취 패턴에 걸립니다. 마크다운 (markdown)이나 코드 블록 (code block) 임베딩을 통해 환경 변수를 유출하려는 도구 응답은 데이터 유출 (data exfiltration) 패턴에 걸립니다.
만약 페이로드 (payload)가 더 미묘하다면 — 예를 들어, 겉보기에 무해한 출력을 통해 에이전트의 동작을 점진적으로 유도하는 도구 정의라면 — Layer 3의 벡터 유사도 점수 산정 (vector similarity scoring)이 리터럴 정규식 (literal regex)과 일치하지 않는 의미론적 변형 (semantic variants)을 포착합니다. Sentinel은 공격 시그니처 임베딩 (attack signature embeddings) 라이브러리에 대해 코사인 유사도 (cosine similarity)를 계산합니다. 에이전트의 제어 흐름 (control flow)을 탈취하려는 시도는 정확한 문구가 다르더라도 의미론적으로 클러스터링 (cluster)되는 경향이 있습니다.
그리고 이것은 악성 리포지토리 (malicious repo)가 "도움이 되는" 설정 단계의 일부로 에이전트에게 설정 파일이나 .env 파일을 읽도록 지시할 수 있는 시나리오이기 때문에, **Layer 4 비밀 정보 탐지 (secret detection)**가 직접적으로 관련됩니다. 유출된 환경 변수를 포함한 도구 결과가 위협 점수 산정기 (threat scorer)를 통과하더라도, Sentinel의 비밀 정보 탐지기는 임베디드된 API 키, 토큰 또는 자격 증명 (credentials)이 모델에 도달하기 전에 이를 삭제(redact)합니다. AWS_ACCESS_KEY=AKIA... 또는 ANTHROPIC_API_KEY=sk-ant-...와 같은 패턴은 각각 [AWS_ACCESS_KEY] 및 [ENV_SECRET]으로 교체됩니다.
실제 사례에서의 모습
다음은 권한 탈취와 임베디드 자격 증명을 포함하는 악성 도구 결과를 Sentinel이 탐지했을 때 반환하는 예시입니다 (이 응답 형태는 Sentinel의 실제 API를 반영합니다):
{
"request_id": "f3a9b2c1d4e5...",
"security": {
...
action_taken: blocked는 코사인 유사도 (cosine similarity)가 0.82를 초과했음을 의미하며, 해당 콘텐츠는 모델에 절대 도달하지 않습니다. safe_payload는 null입니다. 귀하의 애플리케이션은 action_taken을 먼저 확인하고 원래의 도구 결과 (tool result)를 완전히 폐기합니다.
Anthropic 엔드포인트로 직접 연결하는 대신 Anthropic SDK를 Sentinel로 지정하는 투명 프록시 (transparent proxy) 설정의 경우, 이 과정은 자동으로 수행됩니다. 차단된 도구 결과는 무해한 플레이스홀더 (placeholder)로 대체됩니다. 에이전트 세션은 악성 페이로드 (malicious payload) 없이 계속되며, SDK는 일반적인 Anthropic 형식의 응답 외에는 아무것도 보지 못합니다.
import anthropic
# SDK를 Anthropic으로 직접 연결하는 대신 Sentinel로 지정합니다
...
도구 호출 (tool call)이 탈취되었을 때의 피해 범위 (blast radius)가 큰 에이전트 기반 코딩 워크플로 (agentic coding workflows)에는 엄격 모드 (strict mode)가 적합합니다. 스크러빙 (scrub) 요청 시 tier: "strict"를 설정하십시오. 이렇게 하면 플래그 임계값 (flag threshold)은 0.25로, 중화 임계값 (neutralize threshold)은 0.40으로 낮아져 표준 모드에서 통과될 수 있는 경계선상의 사례들을 잡아낼 수 있습니다.
요약 (The Takeaway)
Amazon Q Developer 사고는 에이전트 기반 AI 시스템이 확산됨에 따라 더욱 흔해질 공격 유형인 **도구 계층에서의 신뢰 악용 (trust exploitation at the tool layer)**의 명확한 사례입니다. 에이전트가 탈옥 (jailbroken)되는 것도 아니고, 개발자가 피싱 (phished)을 당하는 것도 아닙니다. 공격은 외부 도구 출력과 모델 사이의 파이프라인(pipeline) 내에 완전히 존재하며, 이는 대부분의 보안 도구가 다루지 못하는 틈새입니다.
지금 바로 할 수 있는 한 가지: 에이전트 기반 코딩 어시스턴트나 외부 소스의 도구 결과를 처리하는 모든 LLM을 실행 중이라면, 도구 결과 경로 앞에 프록시 (proxy)를 배치하십시오. 웹 애플리케이션에서 사용자 제공 데이터를 다루는 것과 동일한 방식으로, 모든 도구 출력을 신뢰할 수 없는 입력 (untrusted input)으로 취급하십시오. 모델에 도달하기 전에 스캔하십시오.
Amazon Q의 결함은 패치되었습니다. 하지만 공격 패턴은 패치되지 않았습니다.
Sentinel은 도구 결과, 프롬프트 인젝션 (prompt injections), 자격 증명 유출 (credential leaks)을 모델에 도달하기 전에 스크러빙 (scrub)하는 셀프 호스팅 AI 방화벽입니다. 신용카드 등록 없이 무료 티어를 사용할 수 있습니다.
👉 sentinel-proxy.skyblue-soft.com
출처 (Sources)
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기