Skip to main content
Glama
ibrahimsaleem

MCP Security Lab

MCP Security Lab

실행 가능한 작은 실제 Model Context Protocol 설정으로, 일곱 가지 의도적인 취약점과 그 수정 사항을 포함하여 각 위험이 실제로 작동하는 모습을 문서로 읽는 대신 직접 확인할 수 있습니다. 현재 공식 MCP 사양(2026-07-28)과 보안 모범 사례 문서, 그리고 OWASP MCP Top 10을 기반으로 구축되었습니다.

모든 것은 로컬에서 실행됩니다. 여기 있는 어떤 것도 실제로 중요한 시스템과 통신하지 않습니다.

문서

아래의 모든 내용은 GitHub에서 바로 읽을 수 있습니다 — 서버가 필요 없습니다 — 그리고 각 문서는 다음 문서로 연결됩니다:

  • docs/owasp-mcp-top10.md — OWASP MCP Top 10의 모든 위험 범주에 대한 필드 참조, MCP 서버가 실제로 무엇인지, 종단 간 요청 경로와 그 세 가지 명명된 위험 영역, 그리고 각 범주에서 해당 취약점을 시연하는 익스플로잇 스크립트(또는 가장 가까운 것)로의 링크.

  • docs/mcp-stateless-rewrite.md — 2026-07-28 사양의 무상태 재작성에 대한 전후 아키텍처 다이어그램, 이로 인해 이제 더 중요해진 OWASP 범주의 우선순위 목록, 모든 사양/로드맵 변경을 특정 OWASP 범주에 매핑하는 표, 그리고 구체적인 실패 시나리오가 있는 다섯 가지 새로운 취약점 패턴.

동일한 두 페이지는 대시보드 내에서 라이브 대화형 HTML로도 존재합니다(guidelines.html 및 rewrite.html, 아래 대시보드 참조) — 내용은 동일하며, 대시보드 버전은 소스 파일 대신 라이브 익스플로잇 실행기에 직접 연결됩니다.

Related MCP server: Damn Vulnerable Model Context Protocol (DVMCP)

다루는 내용

파일 도구

취약점

출처

run_diagnostics

명령 주입

OWASP MCP05

search_docs / get_secret_config

도구(설명) 중독

OWASP MCP03

get_cart

상태 핸들 하이재킹

MCP 보안 모범 사례

proxy_fetch_data

토큰 전달 / 혼동된 대리자

MCP 보안 모범 사례

read_user_file

불충분한 인증 + 감사 추적 없음

OWASP MCP07 / MCP08

read_calendar_events

범위 확장을 통한 권한 상승

OWASP MCP02

launch_from_config

클라이언트 실행 주입 (공급망 RCE)

OWASP MCP04 · 2026 연구

servers/vulnerable_server.py에는 일곱 가지 모두가 의도적으로 손상된 상태로 있습니다. servers/fixed_server.py에는 동일한 일곱 가지 도구가 패치된 상태로 있습니다 — 동일한 익스플로잇을 두 서버에 실행하고 결과가 뒤집히는 것을 확인하세요.

모든 OWASP MCP Top 10 범주는 이제 대시보드의 가이드라인 페이지에서 데모(또는 가장 가까운 실제 데모)로 연결됩니다 — MCP09(섀도우 MCP 서버)를 포함하여, 이는 단일 도구 호출 버그가 아닌 거버넌스 공백이므로 전용 익스플로잇 스크립트 대신 랩 자체로 설명됩니다.

최신 상태 유지

MCP는 빠르게 변화합니다 — 2026-07-28 사양 릴리스는 프로토콜의 가장 큰 재작성이었으며(완전히 무상태로 전환됨), 다음 릴리스를 다루는 새로운 로드맵이 불과 며칠 전인 2026-08-22에 게시되었습니다. 이 랩이 구축된 이후 변경된 사항과 그것이 위험 그림을 어떻게 바꾸는지 추적하는 두 곳이 있습니다:

  • docs/owasp-mcp-top10.md — "변경된 사항" 섹션, 또는 라이브 버전 http://127.0.0.1:8000/guidelines.html#2026-updates.

  • docs/mcp-stateless-rewrite.md — 전체 분석, 어떤 OWASP 범주가 이제 더 중요해졌는지와 그 이유를 포함, 또는 라이브 버전 http://127.0.0.1:8000/rewrite.html.

설정

python -m venv .venv
source .venv/bin/activate         # Windows: .venv\Scripts\activate
pip install -r requirements.txt

mcp SDK v1.26.0에 대해 검증됨 — 서버는 mcp.server.fastmcp에서 FastMCP를 가져옵니다(일부 튜토리얼은 mcp.server에서 직접 가져오거나, 이 SDK 라인에 존재하지 않는 mcp.server.mcpserver 모듈의 MCPServer 클래스를 참조하지만, API는 동일합니다). 설치된 버전이 다르면 pip show mcp를 실행하고 dir(mcp.server)에서 올바른 클래스 이름을 확인하세요 — 나머지(.tool() 데코레이터, .run(transport="stdio"))는 변경되지 않았습니다.

명령 주입 익스플로잇은 실제 ping 바이너리가 없어도 작동합니다 — 핵심은 셸 메타문자(;)가 해석된다는 것을 증명하는 것이며, "PWNED" 마커 파일이 이를 확인합니다.

사용하려는 키를 환경 변수로 설정하세요 — 절대 커밋하거나 채팅에 붙여넣을 수 있는 파일에 실제 키를 넣지 마세요:

export OPENAI_API_KEY="sk-..."
# and/or
export GEMINI_API_KEY="AI..."

익스플로잇 실행

일곱 가지 중 여섯 가지는 LLM이 전혀 필요 없습니다 — 결함이 모델 동작이 아닌 서버에 있음을 증명하기 위해 MCP 서버를 직접 호출합니다:

# Command injection
python exploits/exploit_cmd_injection.py servers/vulnerable_server.py
python exploits/exploit_cmd_injection.py servers/fixed_server.py

# State handle hijacking (guessing another user's cart ID)
python exploits/exploit_state_hijack.py servers/vulnerable_server.py
python exploits/exploit_state_hijack.py servers/fixed_server.py

# Token passthrough / confused deputy
python exploits/exploit_token_passthrough.py servers/vulnerable_server.py
python exploits/exploit_token_passthrough.py servers/fixed_server.py

# Insufficient auth + no audit trail (reading another user's file by ID)
python exploits/exploit_auth_audit.py servers/vulnerable_server.py
python exploits/exploit_auth_audit.py servers/fixed_server.py

# Privilege escalation via scope creep (redirecting a read-only tool's token)
python exploits/exploit_scope_creep.py servers/vulnerable_server.py
python exploits/exploit_scope_creep.py servers/fixed_server.py

# Client launch injection / supply chain RCE (untrusted config picks command/args)
python exploits/exploit_launch_injection.py servers/vulnerable_server.py
python exploits/exploit_launch_injection.py servers/fixed_server.py

도구 중독은 실제 모델이 필요합니다. 취약점은 모델이 도구 자체 설명의 숨겨진 지침을 따르는지 여부이기 때문입니다:

python exploits/exploit_tool_poisoning.py servers/vulnerable_server.py openai
python exploits/exploit_tool_poisoning.py servers/vulnerable_server.py gemini
python exploits/exploit_tool_poisoning.py servers/fixed_server.py openai

대시보드

로컬 웹 대시보드는 7가지 취약점을 카드로 표시하고, 각각에 대해 취약한 버전과 수정된 버전의 코드 차이를 볼 수 있으며, 버튼을 클릭하여 실제 익스플로잇 스크립트를 두 서버 중 하나에 실행할 수 있습니다 — 출력은 브라우저의 라이브 터미널 패널로 스트리밍되고 VULNERABLE/SAFE 판정으로 끝납니다.

pip install -r requirements.txt -r ui/requirements.txt
uvicorn ui.server:app --reload --port 8000

그런 다음 http://127.0.0.1:8000을 엽니다. 도구 중독 카드를 실행하려면 uvicorn을 시작하는 터미널에서 OPENAI_API_KEY / GEMINI_API_KEY를 설정하세요 — 대시보드는 자체적으로 키를 요청하지 않으며, 실행 중인 머신에 이미 설정된 환경 변수만 읽습니다.

직접 대화해 보기

agent.py는 범용 MCP 클라이언트 + 에이전트 루프입니다 — 두 서버 중 하나와 두 공급자 중 하나를 지정하고 대화형으로 채팅할 수 있습니다:

python agent.py servers/vulnerable_server.py openai
python agent.py servers/fixed_server.py gemini

문서 검색, 장바구니 확인, 호스트 진단 실행 등을 요청해 보고, [llm -> tool] / [tool -> llm] 줄을 관찰하여 무엇을 호출하기로 결정했는지와 무엇이 반환되었는지 정확히 확인하세요.

여기서 완전히 다루지 않는 것

현재 MCP 보안 문서의 두 가지 사항은 실제이지만 작은 로컬 랩에서 데모하기 어렵습니다. 구축하지 않더라도 읽어볼 가치가 있습니다:

  • OAuth 검색을 통한 SSRF — 악성 서버가 클라이언트의 메타데이터 가져오기를 169.254.169.254(클라우드 인스턴스 메타데이터)로 지정합니다. 실제 OAuth 흐름과 공격할 네트워크가 필요합니다.

  • 혼동 / localhost 리디렉션 URI 가장 — 의미 있게 시연하려면 실제 다중 인증 서버 설정이 필요합니다. 2026-07-28 사양은 이에 대한 구체적인 완화 조치를 추가했습니다(클라이언트는 이제 인증 코드를 교환하기 전에 iss 매개변수, RFC 9207을 검증해야 함) — 가이드라인 페이지의 "2026 업데이트" 섹션을 참조하세요.

둘 다 https://modelcontextprotocol.io/docs/2026-07-28/tutorials/security/security_best_practices에서 자세히 설명되어 있습니다.

확장하기

  • 동일한 패턴으로 다른 취약한 도구와 그 익스플로잇 스크립트를 추가하세요: 결함을 주석으로 달고, 익스플로잇을 작성하고, 수정 사항을 작성하세요.

  • 설치한 실제 타사 MCP 서버(허가를 받고 소유한 인프라에서)에 동일한 익스플로잇을 실행해 보세요 — 상태 하이재킹 및 인증 없음 패턴은 빠르게 구축된 서버에서 끊임없이 나타납니다.

  • fixed_server.py의 AUDIT_LOG를 실제 로그 싱크에 연결하고 .denied 이벤트에 대한 작은 탐지 규칙을 구축하세요 — 이는 기본적으로 MCP08(감사/원격 측정)을 구체화한 것입니다.

Related MCP Connectors

Related MCP Servers