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 Security Best Practices

proxy_fetch_data

Проброс токена / запутанный посредник

MCP Security Best Practices

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 теперь ссылается на демонстрацию (или ближайшую реальную) со страницы guidelines в дашборде — включая MCP09 (Shadow MCP Servers), которая является скорее пробелом в управлении, чем ошибкой одного вызова инструмента, поэтому она иллюстрируется самой лабораторией, а не отдельным эксплойт-скриптом.

Актуальность

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 — серверы импортируют FastMCP из mcp.server.fastmcp (в некоторых руководствах показан импорт напрямую из mcp.server или упоминается класс MCPServer из модуля mcp.server.mcpserver, которого нет в этой линейке SDK; 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 уязвимостей в виде карточек, позволяет просмотреть diff кода между уязвимой и исправленной версиями для каждой и запустить настоящий эксплойт-скрипт против любого из серверов по кнопке — вывод транслируется в живой терминал в браузере и завершается вердиктом VULNERABLE/SAFE.

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

Затем откройте http://127.0.0.1:8000. Задайте OPENAI_API_KEY / GEMINI_API_KEY в терминале, из которого вы запускаете uvicorn, если хотите запустить карточку отравления инструмента, — сам дашборд никогда не запрашивает ключ, он просто считывает те из этих переменных окружения, которые уже заданы на машине, где он работает.

Пообщайтесь с ним сами

agent.py — это универсальный MCP-клиент с агентским циклом. Направьте его на любой сервер и любого провайдера и общайтесь с ним интерактивно:

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

Попробуйте попросить его поискать в документации, проверить корзину или запустить диагностику на хосте и следите за строками [llm -> tool] / [tool -> llm], чтобы видеть, что именно он решил вызвать и что вернулось.

Что здесь НЕ полностью охвачено

Две темы из текущего документа MCP по безопасности реальны, но их сложнее продемонстрировать в небольшой локальной лаборатории; о них стоит прочитать, даже если вы не будете их воспроизводить:

  • SSRF через OAuth discovery — вредоносный сервер направляет запрос метаданных клиента на 169.254.169.254 (метаданные облачного инстанса). Для этого нужны реальный OAuth-поток и сеть, которую можно атаковать.

  • Mix-up / подмена redirect URI на localhost — для осмысленной демонстрации нужна реальная настройка с несколькими серверами авторизации. Спецификация 2026-07-28 добавила конкретную меру защиты: клиенты теперь должны проверять параметр iss (RFC 9207) перед обменом кода авторизации. См. раздел «2026 Updates» на странице guidelines.

Обе темы подробно описаны по адресу https://modelcontextprotocol.io/docs/2026-07-28/tutorials/security/security_best_practices.

Расширение проекта

  • Добавьте ещё один уязвимый инструмент и эксплойт-скрипт по той же схеме: пометьте изъян комментарием, напишите эксплойт, напишите исправление.

  • Попробуйте запустить тот же эксплойт против реального стороннего MCP-сервера, который вы установите (с разрешения, на собственной инфраструктуре), — паттерны перехвата состояния и отсутствия аутентификации постоянно встречаются в быстро создаваемых серверах.

  • Подключите AUDIT_LOG в fixed_server.py к реальному приёмнику логов и создайте небольшое правило обнаружения для событий .denied — это, по сути, конкретное воплощение MCP08 (аудит/телеметрия).

Related MCP Connectors

Related MCP Servers