Безопасный вайб-кодинг: автономные ИИ-агенты в CI/CD контуре предприятия

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

Автономные агенты в конвейере сборки: где ставить барьер

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


Что требует Приказ ФСТЭК России № 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

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

mcp_sentinel-1.1.1-py3-none-any.whl · sha256: b03ce6eeb86325c062903a06b4f10f0935b3fae5354ca99b4e72baf9b13c7f05

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

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

Установочный пакет (.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-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 / Cursorclaude_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

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


Вопросы

Как барьер встаёт в конвейер сборки?

Обёрткой: агент вызывает инструменты не напрямую, а через mcp-sentinel wrap, который проверяет каждый вызов до передачи в оболочку, репозиторий или базу. Установка из открытого пакета, без внешних зависимостей; конфигурация Claude Code и Cursor приведена ниже.

Какие именно действия блокируются?

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

Работает ли это в изолированном (air-gapped) контуре?

Да. Реализация на чистом Python без внешних зависимостей; журнал проверяется автономным однофайловым скриптом, переносимым на изолированную машину. Целевые ОС — Astra Linux, РЕД ОС, Альт Линукс.


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