Защита ИИ-агентов по протоколу MCP от инъекций: локальные модели, Claude Code, Cursor

Кибербезопасность · разбор нормы и её закрытия

Защита ИИ-агентов от инъекций и деструктивных вызовов

Автономный агент действует выданным ему токеном в пределах выданных прав — периметр и антивирус его не видят. Скрытая инструкция в документе или на странице по ссылке может заставить агента удалить базу, выкачать ключи или отправить данные наружу. Ниже — что требует приказ ФСТЭК № 117 и как недопустимый вызов инструмента останавливается детерминированным шлюзом, а не второй нейросетью.


Что требует Приказ ФСТЭК России № 117

для государственных информационных систем и систем госорганов, ГУП и госучреждений; в силе с 01.03.2026 взамен приказа № 17, изменения — приказ № 137 от 08.05.2026 · Проверено: 16.10.2026 — по тексту Требований в ред. от 08.05.2026 и тексту проекта изменений 170500; кратко — приказ № 117 по тексту.

  • п. 34 «т»: защита информации при использовании искусственного интеллекта — одно из 21 обязательного мероприятия;
  • п. 60: исключить несанкционированный доступ и воздействие на систему через наборы данных, модели ИИ и их параметры; не передавать разработчику модели информацию ограниченного доступа, в том числе для улучшения модели;
  • п. 61: шаблоны или допустимые тематики запросов и ответов с контролем соответствия, статистические критерии недостоверных ответов, исключение нерегламентированного влияния ИИ на модель и работу системы;
  • проект изменений от 24.08.2026 (regulation.gov.ru, № 170500), с 01.03.2027: отдельный сегмент для моделей ИИ, минимальные права, меры для агентов ИИ, в том числе автономных, против несанкционированного воздействия на ресурсы системы — разбор проекта.

Где болит

Разработчики и аналитики внедрили агентов на локальных моделях, но у службы ИБ нет ни одного инструмента для контроля допустимости их действий. Зарубежные средства требуют облаков за пределами РФ или компонентов, неприменимых в изолированном контуре; вторая модель-надзиратель сама подвержена обходу и добавляет задержку.


Чем закрывается

MITR Sentinel. Вызов инструмента перехватывается до исполнения и проверяется детерминированно, по заданным правилам, а не второй моделью: разрушающая операция с базой без условия, выход за рабочую директорию, вывод секретного ключа, опасная команда оболочки — не доходят до исполнителя, если совпали с образцом запрета. При блокировке агент получает причину отказа — сработавшее правило. Открытый код — ниже.

Открытый код · Apache-2.0 · mcp-sentinel 1.1.2

Установочный пакет (.whl) ↓

mcp_sentinel-1.1.2-py3-none-any.whl · sha256: 681a4db59a1a44e89a2b1386ec4b4f2e1fc23c1025c295b9ebf00fd5d20901ea

Исходники (.tar.gz) ↓

mcp_sentinel-1.1.2.tar.gz · sha256: abb88978db7b34a2f1f56e0eff42bcd1365b9cc0eb17e4a4380f7815e4f1b79e

Исходный код: https://git.isslab.ru/isslab/mcp-sentinel

Замер: проверка контрактов в памяти: медиана 0,015 мс; полный цикл с записью решения в журнал на диск: медиана 22,5 мс (N=100).

Противоречие: агент должен действовать свободно, чтобы решать задачи, — и каждое его действие должно быть гарантированно безопасным. Разрешение по ТРИЗ: мысль модели остаётся свободной, а дискретный вызов инструмента проверяется отдельно от неё: открытый пакет сверяет вызов и ответ инструмента с заданными правилами и возвращает агенту причину отказа, чтобы тот не повторял недопустимое.

ISS Ledger 117. Каждое решение шлюза пишется в журнал с хеш-цепочкой по ГОСТ «Стрибог»: выборочная правка записи задним числом рвёт цепочку, и проверяющий видит разрыв.

Открытый код · Apache-2.0 · iss-ledger-117 1.1.1

Установочный пакет (.whl) ↓

iss_ledger_117-1.1.1-py3-none-any.whl · sha256: 8d4ffe60f41ebd377c476f369655aaef5e0ac91858a3d294be37fd1e3100bc87

Исходники (.tar.gz) ↓

iss_ledger_117-1.1.1.tar.gz · sha256: 6eccef523e24fa60fed29c78866ff12afbab092bd17d51642e00d34dfcea9fa5

Проверщик одним файлом ↓

iss_verifier.py · sha256: 1ff894574407307d33ec99115652bcaec4e53d06189178696d0db1c767a8608f

Исходный код: https://git.isslab.ru/isslab/iss-ledger-117

Замер: контрольные векторы ГОСТ по RFC 6986 (M1, M2) проходят; автономный однофайловый проверщик для изолированных контуров.

Противоречие: журнал аудита должен иметь доказательную силу для регулятора — и не должен зависеть от закрытых серверов доверия и внешних поставщиков. Разрешение по ТРИЗ: цепочка квитанций по ГОСТ Р 34.11-2012 на чистом Python без зависимостей, целостность пересчитывается однофайловым скриптом в изолированном контуре, без доверия к разработчику.

Куда встаёт шлюз допустимостиОбёртка-прокси между агентом и настоящим MCP-сервером: допущенный вызов проходит к исполнителю, недопустимый возвращается агенту причиной отказа, каждое решение пишется в журнал с хеш-цепочкой по ГОСТ, который пересчитывает внешний проверщик.Агент / IDEClaude Code · Cursor · MCP-клиентstdio · вызов инструментаmcp-sentinelобёртка-прокси в разрыве stdio4 контракта: FS-Jail · SQL-Guard ·Secret-Filter · Shell-Barrierдетерминированно, без второй моделиPERMIT · допущеноНастоящий MCP-сервердочерний процессИсполнениеФС · СУБД · оболочка · сетьОтказ — агентупричина отказа: нарушенное правило;вызов не исполняетсяBLOCKЖурнал ГОСТ «Стрибог»каждое решение, в хеш-цепочкерешение → записьпроверкаВнешний проверщикпересчитывает без ПО института
Ответ на вопрос «куда встаёт шлюз»: не вторая нейросеть и не сетевой экран, а прозрачная обёртка-прокси в разрыве stdio между агентом и настоящим MCP-сервером. Допущенный вызов проходит к исполнителю, недопустимый возвращается агенту причиной отказа и не исполняется, а каждое решение ложится в журнал с хеш-цепочкой по ГОСТ, целостность которой посторонний пересчитывает сам.

Граница. Что здесь утверждается, а что нет. Шлюз стоит в разрыве протокола MCP и проверяет вызов инструмента, а не поставщика среды: он не знает и не спрашивает, чем именно пользуется разработчик — корпоративным агентом на локальной модели, отечественной средой разработки или зарубежным помощником. Какие среды допущены в конкретной организации — её политика и предмет отдельных требований; работе шлюза ни одна из них не условие. Ограничения на передачу сведений ограниченного доступа разработчикам моделей, в том числе через облачные вызовы, при этом никуда не деваются — шлюз их не заменяет и не снимает.


Быстрый старт: обернуть свой MCP-сервер

Уязвимый MCP-сервер не запускается напрямую — он оборачивается в mcp-sentinel wrap, и каждый вызов инструмента проверяется до исполнения, а ответ сервера — до передачи агенту. Пакет написан на чистом Python без сторонних зависимостей и ставится без доступа в сеть.

Установка

# изолированный контур: файлы .whl скачаны заранее, сеть не нужна
pip install --no-index --find-links ./wheels mcp-sentinel
# с доступом в сеть
pip install --find-links https://isslab.ru/wp-content/uploads/iss-utils/index.html mcp-sentinel

Конфигурация Claude Code / Cursor — claude_desktop_config.json или ~/.cursor/mcp.json

{
  "mcpServers": {
    "postgres-secure": {
      "command": "mcp-sentinel",
      "args": ["wrap", "--ledger", "/var/log/fstec117_audit.jsonl", "--agent", "claude-code", "--",
               "npx", "-y", "@modelcontextprotocol/server-postgres", "postgresql://user:pass@localhost/prod"]
    }
  }
}

Проверка одного вызова из консоли

mcp-sentinel check --tool sql_query \
  --args '{"query": "DROP TABLE users;"}'
# BLOCK — разрушающая операция DROP TABLE остановлена, код выхода 2

Агент на Python: подключение одним импортом — пакет iss-agent-kit

from iss_agent_kit import AgentGuard
guard = AgentGuard(ledger_path="/var/log/agent_gost.jsonl")
result = guard.run(execute_sql, "sql_query", {"query": "SELECT id FROM users WHERE id = 1;"})

Открытый код · Apache-2.0 · iss-agent-kit 0.1.1

Установочный пакет (.whl) ↓

iss_agent_kit-0.1.1-py3-none-any.whl · sha256: 7ed0ae9073f512a5cfd71b62904094ca36d0ae2fdb1b4bfff5900d3e368781c3

Исходники (.tar.gz) ↓

iss_agent_kit-0.1.1.tar.gz · sha256: 0314047404888c29a231fc8710874f15bc2bd75e2b89ba7c4c882da3c792116a

Исходный код: https://git.isslab.ru/isslab/iss-agent-kit

Команды этого раздела исполняются при приёмке каждой версии в чистом окружении без сети — теми же строками, что напечатаны здесь. Журнал по пути —ledger ведётся цепочкой по ГОСТ Р 34.11-2012 и пересчитывается внешним проверщиком без установки чужого программного обеспечения.


Вопросы

Почему не вторая модель-надзиратель?

Управляющий контур обязан обладать разнообразием не меньшим, чем управляемый (закон необходимого разнообразия Эшби). Надзорная модель слабее поднадзорной и обходится синонимами и стеганографией; детерминированная проверка вызова воспроизводима и промптом не обходится.

Какая задержка у перехвата?

Проверка контрактов в памяти — медиана 0,015 мс; сквозной цикл с записью решения в ГОСТ-журнал на диск — медиана 22,5 мс (N=100, замер 21.09.2026). Без вторичной модели, чистая математика и грамматика.


Зачем это всё и чем ИБ 3.0 отличается от привычного стека — разбор на десять минут.

Продуктовая линия целиком — кибербезопасность института. У каждого числа стоит дата замера и поверхность независимой проверки.