Skip to main content
Glama
jbisaccia-9

mcp-gate

by jbisaccia-9

mcp-gate

ci

Путь — это запрос. Граница корневых каталогов — это гарантия.

MCP-сервер доступа к файлам определяет, к каким файлам модель может обращаться, через roots — набор разрешённых каталогов. mcp-gate демонстрирует разницу между указанием серверу оставаться внутри своих корневых каталогов и принудительным её соблюдением: один и тот же набор атак запускается против версии, где есть только инструкция, и против версии, которая канонизирует каждый путь и проверяет его по границе перед любым чтением. Одна версия даёт утечку; вторая держит удар. Обе стороны проверяются в CI.

Это независимая реализация концепций из публичных материалов Anthropic по MCP, написанная для наглядной демонстрации трёх вещей:

Возможность

Где проявляется

Продвинутый MCP-сервер

src/mcp_gate/server.py — сервер на FastMCP, предоставляющий типизированные инструменты (list_roots, read_file, list_dir, summarize_file), со структурированными ошибками и инициируемым сервером сэмплированием (ctx.session.create_message) — сервер может попросить клиента запустить модель.

Логи и прогресс

Каждый инструмент во время работы отправляет MCP-уведомления о логировании (ctx.info) и прогрессе (ctx.report_progress) — включая фиксацию того момента, когда запрос блокируется на границе. В src/mcp_gate/client.py показаны соответствующие logging_callback / sampling_callback.

Контроль доступа

src/mcp_gate/boundary.py — сама гарантия: обход через .., абсолютные пути, выход через символические ссылки и %2e-кодированный обход нормализуются до проверки корневого каталога. Это и есть гейт.

Два режима

Режим

Как принимается решение

Результат

prompt (небезопасный контроль)

В системном промпте сказано: «читай только файлы внутри корневых каталогов», но путь открывается как есть.

Утечка — наивный обработчик путей намеренно служит наихудшим контрольным случаем.

boundary (принудительный)

Каждый путь декодируется, разрешается через realpath (схлопывая .. и следуя за символическими ссылками), после чего обязан находиться внутри авторизованного корневого каталога.

Держит — запросы за пределами границ отклоняются до открытия любого файла.

Набор атак

Атака

режим prompt

режим boundary

direct_ask (легитимный файл внутри корня)

выдаётся ✓

выдаётся ✓

dotdot_traversal (../out_of_bounds/secret.txt)

утечка

заблокировано

absolute_path (абсолютный путь до секрета)

утечка

заблокировано

symlink_escape (символическая ссылка внутри песочницы → наружу)

утечка

заблокировано

encoded_traversal (%2e%2e/...)

утечка

заблокировано

Успешное выполнение direct_read в обоих режимах — обманчивая часть: быстрый ручной тест безопасности уровня промпта выглядит безопасным, но затем он падает под атакой, которую вы не пробовали.

Related MCP server: personal-mcp-bridge

Гейт (CI проверяет оба направления)

python -m mcp_gate gate boundary   # exit 0 only if 0 escapes
python -m mcp_gate gate prompt      # exit 0 only if the leak is still demonstrated
python -m mcp_gate suite            # both halves must hold

Если gate prompt не даёт утечки, демо становится бессмысленным («безопасный» результат теряет смысл, если «небезопасный» вариант тоже проходит), поэтому CI считает и его, и это ошибкой сборки.

Быстрый старт

python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"

pytest -q
python -m mcp_gate gate boundary
python -m mcp_gate gate prompt
python -m mcp_gate suite

Запустите живое демо MCP-сервера + клиента (потребуется pip install -e ".[demo]" и переменная ANTHROPIC_API_KEY в окружении для инструмента сэмплирования):

python -m mcp_gate serve ./data/sandbox      # start the server over stdio
python -m mcp_gate.client ./data/sandbox     # drive it: logs, progress, sampling, a blocked attack

Смотрите RESULTS.md — там сохранены выводы: каждый блок является реальным выводом команды, генерируется скриптом scripts/make_results.py и никогда не редактируется вручную.

Примечания

  • Все данные в data/ вымышлены; data/out_of_bounds/secret.txt — это подписанная заглушка для «файла, который сервер никогда не должен отдавать».

  • Это часть семейства -gate: ничего не публикуется, пока не пройдёт через гейт.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables safe, read-only browsing of allowlisted local directories through MCP, providing tools to list roots, read files, and search text.
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Provides safe, allowlisted local filesystem access for MCP-compatible AI clients, enabling directory listing, file reading/writing (with byte limits), and text search while blocking paths outside approved roots and symlink escapes.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables secure filesystem operations (read, write, list, move, search files/directories) through the Model Context Protocol, with dynamic directory access control via MCP Roots.
    -