Защита агентов с доступом к терминалу: митигация prompt injection и jailbreak-атак — 5 июля 2026 г. в 17:01:46.527
Защита агентов с доступом к терминалу: митигация prompt injection и jailbreak-атак Когда вы даете локальной модели (например, через Ollama или vLLM) доступ к функциям Tool Use — вызов shell-команд, чтение файлов, отправка запросов — стандартная защита через system prompt перестает работать. Атака больше не требует прямого диалога с моделью; злоумышленник может внедрить вредоносный промпт в документ, URL или контекст RAG. Цель — заставить агента выполнить rm -rf или выгрузить секреты. Для продакшен-окружений нужен многослойный подход, а не надежда на "моральность" модели. Архитектурно защита строится на принципе Separation of Concerns: модель только планирует действия в безопасном формате (JSON/YAML), а отдельный верификатор и изолированная среда разрешают исполнение. Ключевая ошибка — позволять LLM генерировать произвольный текст для выполнения. Мы должны сузить пространство возможных выходов до детерминированных схем. Первый уровень защиты — семантический фаервол на входе. Перед тем как запрос попадет в основной агент, его обрабатывает легковесная модель-классификатор или рулевая система (например, NeMo Guardrails). Она ищет паттерны переопределения инструкций ("Ignore previous commands", "Act as..."). Второй уровень — constrained decoding. Используем библиотеки вроде Outlines, чтобы модель физически не могла сгенерировать валидный JSON без обязательных полей типа tool_name и arguments. Это исключает случайные или намеренные отклонения от структуры. Третий уровень — валидация аргументов до исполнения. Даже если модель выдала правильный JSON, внутри параметра command может быть инъекция. Здесь применяется статический анализ: белый список разрешенных утилит, запрет pipe (|) и перенаправления вывода, проверка длины строк. Финальный слой — изоляция. Агент должен работать в ограниченной среде (Docker с seccomp-профилями или Firejail), где системные вызовы блокируются на уровне ядра, даже если модель была скомпрометирована. Ниже приведены конкретные шаги для внедрения такой защиты в пайплайн на Python (LangChain/LlamaIndex) или нативном коде. - Использование Outlines для грамматики вывода: Вместо надежды на парсинг текста, принудительно ограничиваем токенизацию. Подключите outlines.models.transformers к вашей модели и передайте JSON-schema. Модель будет выдавать только валидные объекты, что ломает попытки инъекции через неструктурированный текст.from outlines import models, generate import json schema = { "type": "object", "properties": { "tool": {"enum": ["read_file", "run_command"]}, "args": {"type": "string"} }, "required": ["tool", "args"] } model = models.transformers("HuggingFaceH4/zephyr-7b-beta") generator = generate.json(model, schema) # Теперь модель не может выдать текст вне этой структуры result = generator("Проверь статус сервиса nginx") - Белый список утилит через верификатор: Не передавайте args напрямую в subprocess. Пропишите маппинг разрешенных команд. Если модель запросит curl или wget, блокируйте это, если агенту не нужна сеть. Используйте регулярные выражения для фильтрации спецсимволов (;, &, $()) внутри аргументов.import subprocess ALLOWED_CMDS = ["ls", "grep", "cat", "df"] def safe_exec(command, args): if command not in ALLOWED_CMDS: raise PermissionError(f"Tool {command} is blacklisted") # Блокируем инъекции через shell=True subprocess.run([command] + args, check=True, capture_output=True) #AI #LLM #OpenSource #AISecurity

