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)
Что рассмотрено
Инструмент | Уязвимость | Источник |
| Инъекция команд | OWASP MCP05 |
| Отравление описания инструмента | OWASP MCP03 |
| Угон дескриптора состояния | MCP Security Best Practices |
| Проброс токена / запутанный посредник | MCP Security Best Practices |
| Недостаточная аутентификация + отсутствие аудита | OWASP MCP07 / MCP08 |
| Повышение привилегий из-за расширения области действия | OWASP MCP02 |
| Инъекция при запуске клиента (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Проверено на
mcpSDK 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 (аудит/телеметрия).
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityFmaintenanceAn educational project that deliberately implements vulnerable MCP servers to demonstrate various security risks like prompt injection, tool poisoning, and code execution for training security researchers and AI safety professionals.1,334
- FlicenseNot gradedqualityCmaintenanceA deliberately insecure MCP server designed as a pentest lab to demonstrate common vulnerabilities in MCP deployments.
- FlicenseNot gradedqualityDmaintenanceA vulnerable MCP server designed for educational CTF challenges. It demonstrates various MCP security vulnerabilities in a controlled environment.8
Related MCP Connectors
Security scanner for MCP servers. Detect vulnerabilities, prompt injection, and tool poisoning.
MEOK MCP Hardening MCP — automated security red-team for any MCP server. Maps OWASP LLM Top 10
Scans MCP servers for tool poisoning, prompt injection and supply chain risks.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ibrahimsaleem/mcp-security-lab'
If you have feedback or need assistance with the MCP directory API, please join our Discord server