Автономные агенты в конвейере сборки: где ставить барьер
Помощник в среде разработки и агент в конвейере сборки действуют выданным токеном: у них доступ к репозиторию, секретам сборки, оболочке и внешней сети. Скрытая инструкция в зависимости, в тексте задачи или в комментарии кода заставляет агента слить ключи, внести закладку в артефакт или разрушить рабочую базу — и токен при этом легитимен. Ниже — что требует норма и где ставится детерминированный барьер, чтобы автономность не открывала конвейер наружу.
Что требует Приказ ФСТЭК России № 117
в силе с 01.03.2026, взамен приказа № 17 · Проверено: 21.09.2026 — по отраслевому разбору методики к приказу № 117 (habr.com/ru/companies/swordfish_security); дословный текст приказа на fstec.ru построчно не сверялся.
- для систем с применением искусственного интеллекта — контроль применяемых моделей и обучающих данных (требования req-60 / req-61)
- запрет передачи сведений ограниченного доступа разработчикам моделей, в том числе через облачные интерфейсы
- исключение недекларированных деструктивных воздействий и протоколирование вызовов внешних функций
Где болит
В конвейере сборки автономному агенту выдан доступ к репозиторию, хранилищу секретов, оболочке и пакетным менеджерам. Обычные средства защиты его не видят: токен легитимен, запросы правильные, а опасность — в комбинации параметров вызова. Скрытая инструкция в подтянутой зависимости, в тексте задачи или в комментарии кода заставляет агента выкачать ключ доступа, внести закладку в артефакт сборки или выполнить разрушающую операцию с базой — всё в пределах выданных прав.
Чем закрывается
MITR Sentinel. Вызов инструмента перехватывается до исполнения и проверяется детерминированно, по заданным правилам: вывод секретного ключа наружу, выход за рабочую директорию, разрушающая операция с базой без условия, опасная команда оболочки — не доходят до исполнителя. Проверка воспроизводима и не обходится переформулировкой запроса; при блокировке агент получает причину отказа и не зацикливается. Открытый код — ниже.
Открытый код · Apache-2.0 · mcp-sentinel 1.1.1
mcp_sentinel-1.1.1-py3-none-any.whl · sha256: b03ce6eeb86325c062903a06b4f10f0935b3fae5354ca99b4e72baf9b13c7f05
mcp_sentinel-1.1.1.tar.gz · sha256: bf7537b82c4f69302d4d31d80c567e3ef929a0095350f49eabc1ed14f37e68e4
Исходный код: 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-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
Команды этого раздела исполняются при приёмке каждой версии в чистом окружении без сети — теми же строками, что напечатаны здесь. Журнал по пути —ledger ведётся цепочкой по ГОСТ Р 34.11-2012 и пересчитывается внешним проверщиком без установки чужого программного обеспечения.
Вопросы
Как барьер встаёт в конвейер сборки?
Обёрткой: агент вызывает инструменты не напрямую, а через mcp-sentinel wrap, который проверяет каждый вызов до передачи в оболочку, репозиторий или базу. Установка из открытого пакета, без внешних зависимостей; конфигурация Claude Code и Cursor приведена ниже.
Какие именно действия блокируются?
Четыре контракта среды разработки: выход за доверенную директорию и доступ к чувствительным файлам, разрушающие операции с базой без ограничивающего условия, вывод секретов и ключей наружу, опасные команды оболочки. Перечень контрактов открыт и проверяется в коде.
Работает ли это в изолированном (air-gapped) контуре?
Да. Реализация на чистом Python без внешних зависимостей; журнал проверяется автономным однофайловым скриптом, переносимым на изолированную машину. Целевые ОС — Astra Linux, РЕД ОС, Альт Линукс.
Продуктовая линия целиком — кибербезопасность института. У каждого числа стоит дата замера и поверхность независимой проверки.