Защита ИИ-агентов от инъекций и деструктивных вызовов
Автономный агент действует выданным ему токеном в пределах выданных прав — периметр и антивирус его не видят. Скрытая инструкция в документе или на странице по ссылке может заставить агента удалить базу, выкачать ключи или отправить данные наружу. Ниже — что требует приказ ФСТЭК № 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
mcp_sentinel-1.1.2-py3-none-any.whl · sha256: 681a4db59a1a44e89a2b1386ec4b4f2e1fc23c1025c295b9ebf00fd5d20901ea
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
iss_ledger_117-1.1.1-py3-none-any.whl · sha256: 8d4ffe60f41ebd377c476f369655aaef5e0ac91858a3d294be37fd1e3100bc87
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 и проверяет вызов инструмента, а не поставщика среды: он не знает и не спрашивает, чем именно пользуется разработчик — корпоративным агентом на локальной модели, отечественной средой разработки или зарубежным помощником. Какие среды допущены в конкретной организации — её политика и предмет отдельных требований; работе шлюза ни одна из них не условие. Ограничения на передачу сведений ограниченного доступа разработчикам моделей, в том числе через облачные вызовы, при этом никуда не деваются — шлюз их не заменяет и не снимает.
Быстрый старт: обернуть свой 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
iss_agent_kit-0.1.1-py3-none-any.whl · sha256: 7ed0ae9073f512a5cfd71b62904094ca36d0ae2fdb1b4bfff5900d3e368781c3
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 отличается от привычного стека — разбор на десять минут.
Продуктовая линия целиком — кибербезопасность института. У каждого числа стоит дата замера и поверхность независимой проверки.