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 (аудит/телеметрия).

F
license - not found
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

View all related MCP servers

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.

View all MCP Connectors

Latest Blog Posts

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