Skip to main content
Glama

Sentinel

Непрерывный внешний (out-of-band) уровень доверия и надёжности для экосистемы Model Context Protocol.

У npm есть lockfile и команда аудита. У MCP нет ни того, ни другого. Sentinel — и то, и другое.


Проблема

MCP — это то, как AI-агенты получают свои инструменты. Агент узнаёт, что делает инструмент, вызывая tools/list и читая description и inputSchema, возвращаемые сервером, — текст, который попадает напрямую в промпт модели.

Протокол явно допускает изменение этого ответа между любыми двумя вызовами, без обязательного повторного одобрения и без проверки целостности.

Сервер, который вы одобрили в понедельник, во вторник может давать вашей модели другие инструкции. Это rug pull, и он уже был продемонстрирован на продакшн-серверах MCP и реально применялся в инциденте postmark-mcp.

Между тем в экосистеме насчитывается ~9 650 каталогизированных публичных серверов, за один 60-дневный период в начале 2026 года подано более 30 CVE, а 88% организаций сообщают об инцидентах с AI-агентами за последний год — против 23%, у которых вообще есть какая-либо стратегия идентификации агентов.

Отравленный сервер по-прежнему возвращает HTTP 200. Именно поэтому мониторинг аптайма этого не видит.


Related MCP server: Sentinel Gateway

Что делает Sentinel

  registry sync  →  read-only probe  →  canonicalise  →  fingerprint
                                                             ↓
   alert  ←  classify severity  ←  structural diff  ←  compare to approved baseline
     ↓                ↓
  CI gate      hash-chained evidence ledger
  • Обнаруживает серверы из официального реестра MCP с помощью инкрементальной синхронизации через updated_since

  • Зондирует их read-only методами протокола в обеих актуальных редакциях спецификации (2026-07-28 без состояния и 2025-11-25 с рукопожатием initialize)

  • Снимает отпечатки каждого определения инструмента — RFC 8785 канонизация → SHA-256 → корень Меркла для каждой поверхности

  • Классифицирует каждое изменение по степени серьёзности — SAFE / COMPATIBILITY / SECURITY / IDENTITY — с опубликованными идентификаторами правил

  • Записывает всё в добавляемый только в конец (append-only), хэш-связанный, независимо проверяемый реестр доказательств

  • Оценивает каждый сервер по пяти разложимым компонентам, так что низкая оценка всегда объяснима

  • Контролирует ваш CI — sentinel verify завершается с ненулевым кодом и выдаёт SARIF

  • Сам является MCP-сервером, поэтому агент может спросить «этот сервер безопасен?» до того, как привяжется


Почему таксономия серьёзности — это и есть весь продукт

Наивный детектор «изменился ли хэш» генерирует примерно 53 оповещения за рабочий день по всему каталогу. Никто это не триажирует, поэтому в течение двух недель он замолкает, и контроль ничего не стоит.

Классификация по серьёзности и эскалация только при уровне «критично для безопасности или хуже» снижает это до ~5 в день — реальный ящик реального человека.

Alert volume at four escalation thresholds


Чего он намеренно не делает

Это ограничения, а не отсутствующие функции. Прочтите их, прежде чем оценивать заявления.

Почему

Никогда не вызывает tools/call

Sentinel зондирует тысячи серверов, которые ему не принадлежат. Их инструменты включают send_email, delete_file, transfer_funds. Монитор, способный вызывать произвольные инструменты по всей экосистеме, и есть уязвимость. ADR-0004

Не может поймать вредоносный сервер с первого дня

Базовый уровень и есть отрава. Отпечаткам не с чем сравнивать

Фиксирует определения, а не поведение

Инструмент может изменить то, что он делает, не меняя свою схему. Sentinel этого не увидит

В цепочке обнаружения нет LLM

Входные данные — это текст, контролируемый атакующим и созданный для манипулирования языковыми моделями. Передача его языковой модели для оценки помещает детектор внутрь модели угроз самой атаки. ADR-0007

Не находится на пути запроса

Out-of-band по дизайну. Внедрение — это изменение конфигурации, а не архитектуры


Попробуйте

Требуется uv. Всё выполняется на записанных фикстурах — никакой сети, никаких сторонних серверов, никогда.

uv sync --extra dev

Поймайте rug pull от начала до конца:

uv run sentinel demo
▸ T+0m — Baseline. Reviewed by a human and approved.
  root 04dcdce60579b4af…
  baseline approved — drift is measured against this

▸ T+5m — The rug pull. Description only — the schema is untouched.
  DRIFT · SECURITY rules INJ-004, INJ-007
    SECURITY      /tools/send_email/description
      description changed: INJ-004 Exfiltration reference; INJ-007 Concealment instruction.
      evidence: ~/.ssh | Do not mention this to the user

Simulating an attacker with database write access
  rewriting ledger entry seq=4 to hide the finding…
  DETECTED ledger chain broken at seq=4: payload does not match its recorded hash

Поймайте расширение возможностей, когда вообще ничего не меняется в тексте:

uv run sentinel demo --scenario tests/scenarios/schema_widening.yaml

Запустите гейт классификатора, синхронизируйте каталог, зондируйте легаси-сервер 2025-11-25:

uv run sentinel eval --verbose
uv run sentinel sync
uv run sentinel probe tests/fixtures/servers/legacy_2025.json

Статус

M1–M3 реализованы и зелёные. M4–M6 спроектированы, но не построены.

Веха

Статус

M0 — Дизайн-документы, ADR, модель угроз

✅

M1 — Синхронизация реестра + клиент зондирования двух ревизий + конформность

✅

M2 — Канонизация, снятие отпечатков, Merkle, реестр доказательств

✅

M3 — Анализатор схем + классификатор серьёзности + корпус + CI-гейт

✅ ⭐

M4 — Планировщик + оценка доверия + оповещение

⬜ спроектирован

M5 — REST API + Sentinel-as-MCP-сервер + политический гейт

⬜ спроектирован

M6 — Дашборд + развёртывание

⬜ спроектирован

Текущие гейты, все проходят на main:

Гейт

Результат

pytest

117 прошло

mypy --strict

чисто, 31 исходный файл

ruff

чисто

bandit

чисто

lint-imports

2 контракта соблюдены — core/ доказуемо не импортирует ничего с I/O

sentinel eval

ЗЕЛЁНЫЙ — 66 случаев в корпусе, 1.000 точность/полнота, 1.000 атрибуция правил

Честно насчёт этой 1.000. Корпус создавался вместе с правилами, поэтому эти цифры измеряют внутреннюю согласованность и защиту от регрессий, а не обобщение на атаки, о которых ещё никто не подумал. Что гейт действительно даёт — так это то, что изменение правила, ломающее существующий случай, валит сборку. И он уже окупился во время M3, поймав четыре реальных дефекта: баг с границей слова, из-за которого INJ-004 не срабатывал в середине предложения, и сравнение схем, которое путало отсутствие с пустотой и инвертировало отношение при каждом удалении enum. Для измерения реальной полноты нужен дрифт, собранный с живой экосистемы — это задача M4.


Документация

Начните с 02 — PDD для понимания «что» и «почему», затем 06 — Дизайн обнаружения дрейфа для основного алгоритма.

Документ

01 — Исследование и анализ

Ландшафт угроз, исследование протокола, конкурентный анализ, диаграммы

02 — Документ определения проекта

Проблема, цели, не-цели, пользователи, объём, риски

03 — Требования

Функциональные требования, нефункциональные требования, пользовательские истории, критерии приёмки, трассируемость

04 — Проектирование верхнего уровня

C4 контекст/контейнер/компонент, потоки данных, развёртывание

05 — Проектирование нижнего уровня

Модули, конечные автоматы, ERD, DDL, API-поверхности

06 — Дизайн обнаружения дрейфа

Основной алгоритм. Канонизация, снятие отпечатков, таксономия серьёзности, субтипирование схем

07 — Модель оценки доверия

Формулы, веса, EWMA, анализ чувствительности

08 — Дорожная карта

Вехи, разбивка задач, оценки, критический путь

09 — План тестирования и оценки

Корпус, гейты точности/полноты, тестовая обвязка для инъекций дрейфа

10 — Модель угроз

STRIDE, сценарии злоупотреблений, покрытие OWASP MCP Top 10

11 — Питч для интервью

Питч, сценарий демо, Q&A

ADRs

Восемь записей архитектурных решений


Технологический стек (планируется)

Python 3.12 · httpx · Pydantic v2 · FastAPI · Typer · SQLAlchemy 2.0 · Postgres 17 · Redis 8 · React + Vite · Docker · uv · ruff / mypy --strict / bandit / pytest


Политика зондирования

Sentinel зондирует стороннюю инфраструктуру, которая ему не принадлежит. Делает он это вежливо:

  • глобальный лимит частоты запросов, конкурентность 1 на хост, минимальный интервал между запросами к хосту

  • ±10% джиттера на каждом плановом зондировании, чтобы флот не срабатывал синхронно ровно в час

  • экспоненциальная отсрочка (backoff); Retry-After всегда соблюдается

  • идентифицирующий User-Agent, указывающий на опубликованную политику с возможностью отказа (opt-out)

  • только read-only методы — никогда tools/call, resources/read или prompts/get

См. PROBING.md (будет опубликовано вместе с M1).


Что сломалось и как я это исправил

1. Граница слова, которая никогда не могла сработать. INJ-004 — правило, которое ловит появление в описании инструмента ссылки на ~/.ssh или .env, — имело паттерн \b(\.env|credentials?)\b. Оно никогда не срабатывало в середине предложения. Граница слова \b не может существовать между пробелом и точкой, потому что ни то, ни другое не является символом слова, поэтому \b\.env срабатывает только тогда, когда .env приклеен к предшествующему слову. Случай в корпусе, который это поймал, был недавно добавленный инструмент с описанием «прочитать содержимое .env» — точная форма реальной атаки, молча классифицированная как SAFE. Исправлено с помощью просмотра назад (lookbehind): (?<![\w.])\.env\b.

2. Смешение «отсутствует» и «пусто». Я добавил сокращение, чтобы схема, появляющаяся там, где её раньше не было, трактовалась как расширение, а не комбинировалась в INCOMPARABLE. Я записал это как if not before and after: — что срабатывает и когда before равно {}. В JSON Schema {} — это допустимая схема, которая принимает что угодно, что противоположно отсутствию схемы. В результате отношение инвертировалось во всех случаях удаления enum: удаление enum сообщало NARROWED вместо WIDENED, а SEC-021 — правило, от которого зависит лучшая демонстрация всего проекта, — перестало срабатывать. Это поймали шесть модульных тестов. Исправлено явной проверкой is None с комментарием о причине, потому что вариант с ложным значением выглядит более идиоматично, но неверен.

3. Добавление свойств в открытый объект. Анализатор верно вычислил, что добавление объявленного свойства в объект с неустановленным additionalProperties не меняет множество принимаемых документов — ключ уже был разрешён. Строго говоря, это верно, но из-за этого SEC-025, SEC-026 и SEC-027 никогда не видели добавления параметра webhook_url или access_token, поскольку изменение не фиксировалось. Исправление стало осознанным отходом от чисто языковой семантики: Sentinel отслеживает объявленную поверхность, потому что именно список свойств попадает в промпт модели и сообщает ей, что можно отправлять. Теперь это фиксируется как расширение, а обоснование — комментарий в schema_compat.py, а не фольклор.

4. Bandit пометил мой собственный детектор. Детектор скрытого содержимого INJ-006 содержит буквальные нулевой ширины и двунаправленные управляющие символы, потому что именно их он ищет. Проверка B613 в Bandit существует именно для обнаружения таких символов в исходном коде. Она была права, но срабатывание было ложным. Пропущено с указанием причины в pyproject.toml, а не молча.

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


Автор: Nathan Alvares · Лицензия: TBD (планируется Apache-2.0)

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    MCP zero-trust gateway that sits in front of every internal MCP server, detects tool-poisoning/metadata drift in real time, and maintains a cryptographic provenance ledger of every agent tool call.
    20
    0
    ISC
  • A
    license
    Not graded
    quality
    B
    maintenance
    A transparent MCP proxy that independently re-verifies tool-call claims instead of trusting them, paired with devmcp — the git/CI server it's proven against.
    30 PyPI
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    An MCP server that exposes governance, trust-scoring, compliance, guardrail, cost, drift, and supply-chain scanning tools and resources to any MCP client over stdio, Streamable HTTP, or legacy HTTP+SSE. It lets agents route every tool call through a deterministic five-way decision (allow, redact, require approval, deny, or quarantine) with hash-chained evidence, human approval workflows, and in-agent trust gates for LangChain, LangGraph, and Google ADK.
    30
    76 PyPI
    2
    MIT