본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 15. 15:04

MCP 서버를 위한 레드팀 스캐너를 구축했습니다. 그리고 실제 서버들을 대상으로 테스트해 보았습니다.

요약

Model Context Protocol(MCP) 서버의 보안 취약점을 탐색하는 레드팀 스캐너 'ghostprobe'를 소개합니다. 도구 포이즈닝, 치명적인 삼중주(lethal trifecta) 등 MCP 환경에서 발생할 수 있는 공격 표면을 분석하고 실제 서버 테스트 결과를 공유합니다.

핵심 포인트

  • MCP 도구 목록은 에이전트의 컨텍스트에 직접 주입되는 공격 표면임
  • 도구 포이즈닝을 통해 모델에 악성 지시사항을 주입할 수 있음
  • 데이터 접근, 외부 전송, 신뢰할 수 없는 콘텐츠 노출이 결합된 '치명적인 삼중주' 위험성
  • ghostprobe 스캐너를 통한 OWASP MCP Top 10 기반 보안 진단 가능

MCP 서버를 위한 레드팀 스캐너를 구축했습니다. 그리고 실제 서버들을 대상으로 테스트해 보았습니다.

Model Context Protocol (MCP)은 AI 에이전트가 파일 시스템, GitHub, Slack, 데이터베이스와 같은 외부 도구에 연결할 수 있게 해줍니다. 에이전트가 연결되는 각 서버는 도구 목록을 광고하며, 여기서 대부분의 사람들이 놓치는 부분이 있습니다. 바로 그 도구 목록이 공격 표면 (attack surface)이라는 점입니다.

도구의 설명과 파라미터 문서는 단순히 인간에게 도구를 설명하는 것에 그치지 않습니다. 이들은 에이전트의 컨텍스트 (context)에 직접 주입되며, 모델은 이를 사용자의 지시사항과 동일한 권위로 취급합니다. 따라서 서버는 사용자가 무해한 설명으로 훑어보고 지나갈 텍스트 안에 모델을 향한 지시사항을 숨길 수 있습니다. 이것이 도구 포이즈닝 (tool poisoning)이며, CVE-2025-54136의 배후에 있는 패턴입니다.

저는 실제 서버들이 얼마나 노출되어 있는지 확인하고 싶었고, 그래서 ghostprobe를 구축했습니다. ghostprobe는 MCP 서버에 연결하여 도구 목록을 가져오고, 공격자가 관심을 가질 만한 사항들을 OWASP MCP Top 10에 매핑하여 보고하는 스캐너입니다. 이 포스트는 제가 이 스캐너를 실제 서버들에 적용했을 때 어떤 일이 일어났는지에 관한 것입니다. 왜냐하면 바로 그 지점에서 흥미로운 결과가 나왔기 때문입니다.

도구 목록이 드러내는 것들

ghostprobe는 몇 가지 사항을 탐색합니다:

  • 도구 포이즈닝 (Tool poisoning): "이전 지시사항을 무시하십시오" 또는 "사용자에게 말하지 마십시오"와 같은 지시사항 주입 (instruction-injection) 문구, 그리고 인간의 검토를 피해 모델에게는 전달되도록 하는 보이지 않는 유니코드 (Unicode).
  • 치명적인 삼중주 (The lethal trifecta): 도구들이 결합되어 개인 데이터 접근 권한, 데이터를 외부로 전송할 수 있는 방법, 그리고 신뢰할 수 없는 콘텐츠에 대한 노출을 동시에 제공하는 서버. 이 중 하나만 있어도 괜찮지만, 세 가지가 모두 갖춰지면 단 한 번의 프롬프트 인젝션 (prompt injection)으로 당신의 비밀을 읽고 유출할 수 있습니다. 이 용어는 Simon Willison이 만든 것입니다.
  • 러그 풀 (Rug pulls): 사용자가 신뢰한 이후에 도구의 설명을 조용히 변경하는 서버.
  • 셸 실행 (shell execution)과 같은 위험한 기능.

치명적인 삼중주 (lethal trifecta)가 가장 중요한 이유는, 이것이 단일 악성 도구에 관한 것이 아니기 때문입니다. 세 가지 요소가 모두 한꺼번에 보이기 전까지는 합리적으로 보이는 조합에 관한 문제입니다.

공식 서버들을 대상으로 테스트했더니, 스캐너 자체에서 버그를 발견했습니다

공식 레퍼런스 서버들(filesystem, memory, GitHub 등)은 잘 구축되어 있었기에, 저는 깨끗한 결과가 나올 것으로 기대했습니다. 하지만 ghostprobe가 가장 먼저 찾아낸 것은 제 분석기(analyzer) 자체의 오탐(false positive)이었습니다. 이는 일어날 수 있는 일 중 가장 유용한 일이었습니다.

filesystem 서버에서 ghostprobe는 read_text_file을 코드 실행(code execution)으로 표시했습니다. 틀렸습니다. 제 실행 탐지기(exec detector)가

해결책은 공유된 원격 협업 서비스에 쓰는 행위 자체가 로컬 파일에 쓰는 것과는 별개의 데이터 유출 채널 (exfiltration channel)임을 인식하는 것이었습니다. 이슈(issue)를 생성하거나, 댓글을 게시하거나, 리포지토리(repo)에 푸시(push)하는 행위는 모두 신뢰 경계 (trust boundary) 외부로 데이터를 전송합니다. 로컬 파일에 쓰는 것은 그렇지 않습니다. 이러한 변경 이후, ghostprobe는 GitHub 서버를 정확하게 식별해냈습니다:

[CRIT] MCP04 Lethal Trifecta
  data:      get_file_contents, get_pull_request_files, push_files
  sink:      add_issue_comment, create_issue, create_or_update_file
...

비공개 리포지토리 (private repo)를 읽고, 인터넷상의 누구나 작성할 수 있는 이슈 텍스트를 가져온 뒤, 이를 공개 이슈에 게시하는 시나리오입니다. 공격자가 지침이 포함된 이슈를 제출하면, 이슈 분류 (triage)를 위해 설정된 에이전트 (agent)가 이를 읽고, 결과적으로 귀하의 비공개 코드가 공개 댓글에 노출되게 됩니다.

이 현상에 대해 정확히 말씀드리고 싶습니다. 이것은 제가 새로 발견한 취약점 (vulnerability)이 아닙니다. 이 정확한 GitHub-MCP 유출 경로는 2025년에 Invariant Labs에 의해 공개되었습니다. 핵심은 ghostprobe가 서버에 대한 사전 지식 없이 도구 목록 (tool list)만으로도 이러한 클래스를 자동으로 탐지한다는 점입니다. 한 번도 본 적 없는 서버를 대상으로 지정하더라도, 해당 '트리펙타 (trifecta)'가 존재하는지 여부를 알려줍니다.

실제로 배운 점

실제 서버만이 유일한 진짜 테스트입니다. ghostprobe의 모든 유의미한 개선은 제가 만든 피스처 (fixtures)가 아니라, 실제 서버를 대상으로 실행하면서 이루어졌습니다. 이틀 동안 몇 차례의 릴리스가 있었으며, 각 릴리스는 실제 결과에 기반한 정밀한 수정이었습니다. 두 개의 오탐 (false positive)을 제거했고, 하나의 미탐 (false negative)을 해결했습니다.

도구 목록 (tool list)은 공격 표면 (attack surface)으로서 과소평가되어 있습니다. 사람들은 MCP 서버 코드를 감사 (audit)합니다. 하지만 서버가 에이전트에게 무엇을 광고하는지 살펴보는 사람은 훨씬 적습니다. 바로 그 지점이 포이즈닝 (poisoning)과 트리펙타가 존재하는 곳이며, 공격자가 귀하의 코드에 전혀 손을 대지 않고도 영향을 미칠 수 있는 지점입니다.

그리고 스캐너의 신뢰성은 기능의 개수가 아니라 오탐률 (false-positive rate)에 달려 있습니다. 가장 가치 있는 작업은 검사 항목을 추가하는 것이 아니었습니다. 기존의 검사 항목들이 거짓을 말하지 않도록 만드는 것이었습니다.

직접 시도해 보세요

ghostprobe는 MIT 라이선스 하에 오픈 소스로 제공됩니다. 분석기(analyzer)는 의존성(dependencies)이 없으며, 라이브 서버를 조사(probe)하기 위해서는 MCP SDK만 있으면 됩니다.

pip install "git+https://github.com/joemunene-by/ghostprobe.git" mcp
ghostprobe stdio -- npx -y @modelcontextprotocol/server-github

또는 저장된 도구 목록(tools/list) 덤프를 완전히 오프라인 상태에서 스캔할 수 있습니다:

ghostprobe scan-file tools.json

GitHub: https://github.com/joemunene-by/ghostprobe

작성자: Joe Munene, 나이로비에서 활동하며 보안 시스템(secure systems) 및 응용 머신러닝(applied machine learning)에 집중하고 있는 소프트웨어 엔지니어.
Portfolio · GitHub · More writing · joemunene984@gmail.com

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0