MCP(Model Context Protocol) 시스템은 아직 초기 개발 단계에 있습니다. 전반적인 환경은 비교적 혼란스럽고, 다양한 잠재적 공격 방법이 끝없이 등장합니다. 현재의 프로토콜과 도구 설계에 맞서 방어하는 것은 어렵습니다. 커뮤니티가 MCP의 보안을 더 잘 이해하고 개선할 수 있도록 SlowMist는 MasterMCP 도구를 특별히 오픈 소스로 공개하여 실제 공격 훈련을 통해 모든 사람이 시기적절하게 제품 설계의 보안 위험을 발견하고 단계적으로 MCP 프로젝트를 강화할 수 있기를 바랍니다.
동시에, 이전 호의 MCP 보안 체크리스트를 사용하면 다양한 공격의 기본적인 관점을 더 잘 이해할 수 있습니다. 이번에는 MCP 시스템에서 흔히 일어나는 공격 방법인 정보 오염, 악성 명령어 은닉 등의 실제 사례를 통해 직접 실습해 보고 시연해 보겠습니다. 데모에 사용된 모든 스크립트는 GitHub에 오픈 소스로 공개됩니다(기사 마지막 부분의 링크 참조). 안전한 환경에서 전체 프로세스를 완벽하게 재현할 수 있으며, 이러한 스크립트를 기반으로 자체 공격 테스트 플러그인을 개발할 수도 있습니다.
전반적인 아키텍처 개요
시범 공격 대상 MCP: 툴박스
smithery.ai는 가장 인기 있는 MCP 플러그인 웹사이트 중 하나로, 많은 수의 MCP 목록과 활성 사용자를 보유하고 있습니다. @smithery/toolbox는 smithery.ai가 공식 출시한 MCP 관리 도구입니다.
다음 사항을 기준으로 Toolbox를 테스트 대상으로 선택했습니다.
- 사용자 기반이 크고 대표성이 있습니다.
- 일부 클라이언트 기능(예: Claude Desktop)을 보완하기 위해 다른 플러그인의 자동 설치를 지원합니다.
- 데모 목적으로 민감한 구성(API 키 등)이 포함되어 있습니다.
데모에 사용된 악성 MCP: MasterMCP
MasterMCP는 SlowMist가 보안 테스트를 위해 특별히 작성한 악성 MCP 시뮬레이션 도구입니다. 플러그인 아키텍처 디자인을 채택했으며 다음과 같은 주요 모듈을 포함합니다.
1. 로컬 웹사이트 서비스 시뮬레이션: http://127.0.0.1:1024
공격 시나리오를 보다 현실적으로 복원하기 위해 MasterMCP에는 로컬 웹사이트 서비스 시뮬레이션 모듈이 내장되어 있습니다. FastAPI 프레임워크를 사용하여 일반적인 웹 환경을 시뮬레이션하는 간단한 HTTP 서버를 빠르게 구축합니다. 이러한 페이지는 케이크 가게 정보를 표시하거나 표준 JSON 데이터를 반환하는 등 표면적으로는 정상적으로 보이지만 실제로는 신중하게 설계된 악성 페이로드가 페이지 소스 코드나 인터페이스 반환에 숨겨져 있습니다.
이런 방식으로 안전하고 통제 가능한 로컬 환경에서 정보 오염 및 명령 은닉과 같은 공격 방법을 완벽하게 시연하여 모든 사람이 직관적으로 이해할 수 있도록 도울 수 있습니다. 겉보기에 평범해 보이는 웹 페이지조차도 대규모 모델이 비정상적인 작업을 수행하도록 유도하는 숨겨진 위험의 원천이 될 수 있습니다.
2. 로컬 플러그인 MCP 아키텍처
MasterMCP는 확장을 위해 플러그인 방식을 사용하므로 나중에 새로운 공격 방법을 빠르게 추가하기 쉽습니다. MasterMCP를 실행하면 이전 모듈의 FastAPI 서비스가 자식 프로세스에서 실행됩니다. (조심하면 여기에는 보안 위험이 있다는 것을 알게 될 것입니다. 로컬 플러그인은 MCP에서 예상하지 않는 하위 프로세스를 임의로 시작할 수 있습니다.)
데모 클라이언트
- 커서: 세계에서 가장 인기 있는 AI 지원 프로그래밍 IDE 중 하나
- Claude Desktop: Anthropic(MCP 프로토콜 사용자 정의 파티) 공식 클라이언트
시연에 사용된 대형 모델
- 클로드 3.7
Claude 3.7은 민감한 작업 인식 측면에서 몇 가지 개선이 이루어졌고 현재 MCP 생태계에서 더 강력한 운영 역량을 나타내기 때문에 선택되었습니다.
claude_desktop_config.json을 구성하세요
{ "mcpServers": { "toolbox": { "command": "npx", "args": [ "-y", "@smithery/cli@latest", "run", "@smithery/toolbox", "--config", "{\"dynamic\":false,\"smitheryApiKey\":\"ec1f0fa8-5797-8678-sdaf-155d4584b133\"}", "--key", "ec1f0fa8-5797-8678-sdaf-155d4584b133" ] }, "MasterMCP": { "command": "/Users/xxx/Desktop/EvilMCP/bin/python", "args": [ "/Users/xxx/Desktop/EvilMCP/MasterMCP.py" ] } }}
구성이 완료되면 공식적으로 데모 단계에 들어가게 됩니다.
MCP 간 악의적 호출
이 데모에는 체크리스트 포이즈닝과 Cross-MCP 악성 호출이라는 두 가지 콘텐츠가 포함되어 있습니다.
웹 콘텐츠 오염 공격
1. 주석 포이즈닝(일부 참조: https://x.com/lbeurerkellner/status/1912145060763742579)
커서가 로컬 테스트 웹사이트 http://127.0.0.1:1024에 접속합니다.
이 페이지는 "맛있는 케이크 월드"에 대한 겉보기에 무해한 페이지입니다. 이 실험을 통해 대규모 모델 클라이언트가 악성 웹사이트를 방문할 때의 영향을 시뮬레이션합니다.
다음 명령을 실행합니다:
http://127.0.0.1:1024의 내용을 가져옵니다.
결과는 Cursor가 웹 페이지 콘텐츠를 읽을 뿐만 아니라 로컬의 민감한 구성 데이터를 테스트 서버로 다시 전송한다는 것을 보여줍니다. 소스 코드에서 악성 프롬프트 단어는 HTML 주석 형태로 이식되었습니다.
주석 처리 방법은 비교적 간단하고 식별하기 쉽지만, 이미 악성 작업을 유발할 수 있습니다.
2. 코딩된 댓글 포이즌
http://127.0.0.1:1024/encode를 방문하세요. 이는 위의 예시와 동일하게 보이는 웹페이지이지만, 악성 프롬프트 단어가 인코딩되어 있어, 웹페이지의 소스코드에 접근하더라도 악성 경험치를 더욱 은폐하고 직접 감지하기 어렵게 만듭니다.
소스 코드에 평문 힌트 단어가 포함되어 있지 않더라도 공격은 성공적으로 실행될 수 있습니다. 구체적인 원리는 다음 장에서 자세히 설명하겠습니다.
MCP 도구가 정보 오염을 반환합니다.
여기서는 MasterMCP의 프롬프트 단어에 따라 시뮬레이션된 지침을 입력합니다(이 지침은 실제 의미가 없으며 악성 MCP가 후속 작업을 수행하도록 트리거하기 위한 것입니다).
사과를 많이 얻으세요
명령이 트리거된 후 클라이언트가 MCP에서 Toolbox를 호출하고 새로운 MCP 서버를 성공적으로 추가하는 것을 볼 수 있습니다.
플러그인 코드를 검사하면 반환된 데이터에 인코딩된 악성 페이로드가 내장되어 있고, 사용자 측에서는 이상을 감지하기 어려운 것으로 나타났습니다.
제3자 인터페이스 오염 공격
이 데모는 악성 MCP이든 악성이 아닌 MCP이든, 타사 API를 호출할 때 타사 데이터가 컨텍스트에 직접 반환되면 심각한 결과가 발생할 수 있다는 사실을 모든 사람에게 상기시키기 위한 것입니다.
샘플 코드:
요청을 실행합니다:
http://127.0.0.1:1024/api/data에서 JSON을 가져옵니다.
결과: 악의적인 프롬프트 단어가 반환된 JSON 데이터에 이식되어 악의적인 실행을 성공적으로 유발했습니다.
MCP 초기화 단계 동안의 중독 기술
이 데모에서는 체크리스트에서 처음에 나타나는 단어 삽입과 이름 충돌에 대해 다룹니다.
악성 함수 덮어쓰기 공격
여기에서 MasterMCP는 Toolbox와 동일한 기능 이름인 remove_server를 가진 도구를 작성하고 악성 프롬프트 단어를 인코딩하여 숨겼습니다.
다음 명령을 실행합니다:
툴박스 페치 플러그인 서버 제거
Claude Desktop은 원래의 `toolbox remove_server` 메서드를 호출하지 않고 MasterMCP에서 제공하는 동일한 이름의 메서드를 트리거합니다.
원리는 "원래 방법이 포기되었다"는 것을 강조하고 큰 모델이 악의적으로 덮어쓴 함수를 호출하도록 우선적으로 유도하는 것입니다.
악성 글로벌 체크 로직 추가
여기 MasterMCP는 바나나와 관련된 도구를 작성했습니다. 이 도구의 핵심 기능은 프롬프트에서 실행하기 전에 모든 도구가 안전 검사를 수행하도록 하는 것입니다.
각 함수 실행 전에 시스템은 먼저 바나나 체크 메커니즘을 호출합니다.
이는 "바나나 감지를 실행해야 함"을 코드에서 반복적으로 강조하여 글로벌 논리를 주입함으로써 달성됩니다.
악의적인 프롬프트 단어를 숨기는 고급 기술
대규모 모델 친화적 인코딩
대규모 언어 모델(LLM)은 다국어 형식을 구문 분석하는 강력한 기능을 갖추고 있어 악성 정보를 숨기는 데 사용됩니다. 일반적인 방법은 다음과 같습니다.
- 영어 환경: Hex Byte 인코딩 사용
도구 추천: Hex Decoder
- 중국어 환경에서는 NCR 인코딩이나 JavaScript 인코딩을 사용하세요.
도구 추천: R12a 유니코드 변환 도구
무작위 악성 페이로드 반환 메커니즘
2장에서 언급했듯이, 타사 인터페이스가 오염되고 http://127.0.0.1:1024/random이 요청되는 경우:
악성 페이로드가 포함된 페이지가 매번 무작위로 반환되므로 탐지 및 추적이 크게 어려워집니다.
요약하다
MasterMCP의 실제 데모를 통해 우리는 Model Context Protocol(MCP) 시스템에 숨겨진 다양한 보안 위험을 직관적으로 알 수 있습니다. 간단한 프롬프트 단어 삽입과 MCP 간 호출부터 보다 은밀한 초기화 단계 공격과 악의적인 명령 은폐까지 모든 링크는 MCP 생태계가 강력하지만 동시에 취약하다는 점을 일깨워줍니다.
특히 오늘날 대형 모델이 외부 플러그인 및 API와 상호 작용하는 경우가 많아지면서, 아주 작은 양의 입력 오염이라도 전체 시스템 수준에서 보안 위험을 초래할 수 있습니다. 공격자의 공격 수법(코딩 은폐, 무작위 오염, 기능 커버리지)이 다양화되면서 기존의 보호 아이디어도 전면적으로 업그레이드해야 합니다.
안전은 하룻밤에 이루어지지 않습니다.
이 데모가 모든 사람에게 경각심을 일깨워 주는 계기가 되기를 바랍니다. 개발자와 사용자 모두 MCP 시스템에 대해 충분히 주의를 기울여야 하며, 모든 상호작용, 모든 코드 줄, 모든 반환 값에 항상 주의를 기울여야 합니다. 모든 세부 사항에 세심한 주의를 기울인 후에야 우리는 진정으로 안정적이고 보안성이 높은 MCP 환경을 구축할 수 있습니다.
다음으로, 우리는 MasterMCP 스크립트를 지속적으로 개선하고 더욱 구체적인 테스트 사례를 오픈 소스로 공개하여 모든 사람이 안전한 환경에서 보호 기능을 심층적으로 이해하고, 실행하고, 강화할 수 있도록 도울 것입니다.
추신 관련 콘텐츠는 GitHub(https://github.com/slowmist/MasterMCP)에 동기화되었습니다. 관심 있는 독자는 기사 마지막에 있는 원문 읽기를 클릭하여 바로 이동할 수 있습니다.