모델 컨텍스트 프로토콜(MCP) 위협 모델링: mcpscan을 사용한 에이전트 도구 보안 강화
요약
본 글은 LLM 인터페이스를 로컬 환경에 연결하는 오픈 표준인 Model Context Protocol(MCP)의 위협 모델을 분석합니다. MCP는 에이전트에게 강력한 실행 기능을 부여하지만, 이로 인해 임의 코드 실행, 프롬프트 주입 등 심각한 보안 위험이 발생할 수 있습니다. 이를 방지하기 위해 mcpscan이라는 정적 분석 도구를 소개하고 사용법을 시연합니다.
핵심 포인트
- MCP는 LLM과 로컬 시스템 간의 연결 고리 역할을 합니다.
- 도구 오염, 명령어 주입 등 다양한 공격 벡터가 존재합니다.
- mcpscan은 MCP 서버와 프로젝트를 위한 경량 정적 보안 스캐너입니다.
- 배포 전 mcpscan을 사용해 아키텍처 취약점을 감사해야 합니다.
모델 컨텍스트 프로토콜(MCP) 위협 모델링: mcpscan을 사용한 에이전트 도구 보안 강화
모델 컨텍스트 프로토콜(Model Context Protocol, MCP)은 LLM 인터페이스(예: Claude Desktop 및 Claude Code)를 로컬 및 원격 실행 환경에 연결하는 오픈 표준으로 부상했습니다. MCP는 모델이 시스템 도구를 실행하고, 데이터베이스를 쿼리하며, 파일시스템을 구문 분석할 수 있도록 함으로써, 단순한 텍스트 생성과 능동적인 에이전트 실행 사이의 격차를 해소합니다.
하지만 AI 에이전트에게 실행 기능을 부여하는 것은 호스트 환경에 직접적인 공격 벡터를 도입합니다. MCP 서버가 사용자 수준 권한으로 로컬에서 실행되기 때문에, 손상되거나 부적절하게 정리된 도구는 임의 코드 실행(arbitrary code execution), 간접 프롬프트 주입(indirect prompt injection), 자격 증명 유출(credential exfiltration), 그리고 권한 상승(privilege escalation)으로 이어질 수 있습니다.
본 글에서는 모델 컨텍스트 프로토콜의 위협 모델을 분석하고, 주요 공격 벡터를 분석하며, mcpscan을 사용한 정적 분석 감사(static analysis auditing)를 시연합니다.
graph TD
User([User Prompt]) --> Client[MCP Client / Claude Engine]
Client -->|JSON-RPC via stdio/SSE| Host[MCP Host Environment]
...
1. MCP 보안 경계 및 아키텍처
MCP는 클라이언트-호스트-서버 아키텍처에서 작동하며, 호스트 애플리케이션은 stdio 또는 Server-Sent Events (SSE)를 통해 서버와 통신합니다.
엄격한 스키마 검증과 결정론적 호출자 권한 부여에 의존하는 REST API와 달리, MCP는 LLM 추론 엔진 바로 아래에 위치합니다. 이 아키텍처는 고유한 운영 취약점을 도입합니다.
주요 공격 벡터
벡터 A: 간접 프롬프트 주입 (도구 오염)
MCP 도구가 신뢰할 수 없는 외부 데이터를 가져올 때(예: 웹페이지 구문 분석, 이메일 헤더 읽기 또는 git 커밋 스캔), 해당 데이터에 포함된 악성 페이로드는 클라이언트 모델의 컨텍스트 창을 조작할 수 있습니다.
sequenceDiagram
autonumber
actor User
...
벡터 B: 서브프로세스 래퍼를 통한 명령어 주입
많은 커뮤니티 MCP 서버는 CLI 도구(예: git, docker, 또는 kubectl)를 래핑합니다. 정제되지 않은 LLM 매개변수를 서브쉘에 직접 전달하는 것은 전형적인 명령 주입 벡터를 만듭니다:
# MCP 도구의 취약한 실행 패턴
import subprocess
...
벡터 C: 자격 증명 유출 및 과도한 범위(Excessive Scope)
.claude/claude_desktop_config.json에 저장된 구성에는 종종 API 키, 연결 문자열 또는 제한되지 않은 루트 파일 시스템 마운트(/)가 포함됩니다. 권한이 과도한 도구는 로컬 상태를 읽고 로깅이나 네트워크 사이드 채널을 통해 토큰을 외부 엔드포인트로 전송할 수 있습니다.
2. mcpscan을 사용한 정적 분석 (Static Analysis)
배포 전에 MCP 서버 구현 및 로컬 환경 구성을 감사하기 위해, 우리는 mcpscan을 사용합니다. 이는 MCP 서버와 Claude Code 프로젝트를 위해 특별히 구축된 경량의 정적 공급망 보안 스캐너입니다.
flowchart LR
Target[대상 저장소 / 구성] --> Scanner[mcpscan 엔진]
Scanner --> Rules{규칙 평가}
...
주요 기술 속성 (Key Technical Attributes)
- 런타임 종속성 없음(Zero Runtime Dependencies): 제한된 CI/CD 환경에서 실행하기 위해 Python 표준 라이브러리를 사용하여 구축되었습니다.
- 정적 패턴 분석(Static Pattern Analysis): 소스 라인에 대한 정규 표현식 기반 규칙 일치를 통해 안전하지 않은 서브프로세스 호출, 동적 평가(
eval), 그리고 부적절한 역직렬화(improper deserialization)를 Python 및 TypeScript/JavaScript 소스 코드에서 감사합니다. 전체 AST 파싱이 필요하지 않아 종속성 없이 유지될 수 있습니다. - 구성 검사 (Configuration Inspection): 노출된 비밀 정보와 광범위한 디렉터리 접근을 위해
.claude/및.mcp/JSON 파일을 감사합니다. - SARIF 2.1.0 네이티브 출력: 보고서를 GitHub Code Scanning 및 엔터프라이즈 대시보드 파이프라인에 직접 내보냅니다.
3. 탐지 규칙 매트릭스 (Detection Rules Matrix)
mcpscan은 수십 개의 규칙(전체 최신 목록은 mcpscan --list-rules 실행)을 제공합니다. 대표적인 다섯 가지 범주:
| Rule ID | 카테고리 | 탐지 초점 | 심각도 |
|---|---|---|---|
| MCP001 | Command Injection | shell=True 또는 os.system()을 사용한 미처리(Unsanitized) subprocess 호출 | 높음 |
| ... |
4. 실습 워크플로우 및 CI/CD 통합
로컬에서 감사 실행하기
MCP 서버 저장소나 로컬 구성에 대해 mcpscan을 실행하려면:
# 스캐너 클론
git clone https://github.com/glatinone/mcpscan.git
cd mcpscan
...
자동화된 GitHub Actions 파이프라인
mcpscan을 GitHub Actions에 직접 통합하여 모든 풀 리퀘스트(pull request)를 스캔하고 발견된 결과를 GitHub Code Scanning에 업로드할 수 있습니다:
name: MCP 보안 스캔
on:
...
5. 심층 방어 엔지니어링 관행 (Defense-in-Depth Engineering Practices)
MCP 서버를 작성할 때는 다음 핵심 방어 경계(defensive boundaries)를 적용해야 합니다:
- 구조화된 서브프로세스 실행: 셸에 원시 문자열 버퍼(raw string buffers)를 전달하는 것을 피하세요. 명시적인 인자 목록(`subprocess.run([
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기