Модель угроз агента начинается с признания простого факта: агент читает недоверенный текст. Чужой код, документацию, вывод команд, веб-страницы, ответы внешних серверов. Любой из этих источников может содержать инструкции, замаскированные под требования задачи. Prompt injection - это не про текст сам по себе, а про то, что текст соединяется с правами: на оболочку, браузер, внешние системы, секреты и провайдера репозитория. Опасен не абзац с вредным советом, а тот же абзац рядом с возможностью его исполнить.
Наивная защита - попросить модель не поддаваться на вредные инструкции. Она не работает по устройству. Модель различает не источник текста, а его содержание: и ваше задание, и найденная страница приходят к ней одинаковым потоком, и достаточно одной удачной формулировки, чтобы просьба перестала действовать. Узнать об этом вы не успеете. Системная инструкция - это направление, а не граница. Граница проходит там, где действие технически невозможно: в правах, песочнице, списках разрешённых команд и подтверждениях.
Полезно один раз свести источники недоверенного содержимого и детерминированные контроли к ним в таблицу. Ниже такая карта: репозиторий, веб-страница, вывод терминала, ответ внешнего сервера, плагин или навык, чужой follow-up в командной работе. Ценность карты в том, что для каждого источника названо не пожелание, а механизм: доверие рабочей области и ревью, защита браузера и доменная политика, списки команд и песочница, политика инструментов, проверка источника, изоляция служебных учётных записей.
| Источник | Пример риска | Детерминированный контроль |
|---|---|---|
| Репозиторий | Задача, hook или скрипт пакета выполняет чужой код | Доверие рабочей области, ревью, песочница |
| Веб-страница | Инструкция отправить данные или войти в аккаунт | Защита браузера, подтверждение, доменная политика |
| Вывод терминала | Лог предлагает выполнить разрушительную команду | Списки разрешённого и запрещённого, песочница |
| Ответ MCP | Внешняя система возвращает враждебное содержимое | Политика серверов и инструментов, проверка аргументов |
| Плагин или навык | Скрипт или hook в комплекте расширяет действия |
| Проверка источника, политика marketplace |
| Чужой follow-up | Другой пользователь направляет агента с вашими секретами | Политика продолжений, изоляция служебных аккаунтов |
|---|
Особенно недооценён репозиторий как источник риска. Вместе с кодом приезжают задачи редактора, hooks, конфигурация внешних серверов и скрипты жизненного цикла пакетов - всё это исполняемое содержимое, написанное кем-то другим. Открыть незнакомый проект и разрешить всё сразу - значит выполнить чужой код раньше, чем вы прочитали хотя бы один файл. Коварство в том, что срабатывает оно от обычных действий: открыть папку, поставить зависимости, запустить сборку - шагов, которые не воспринимаются как выдача прав.
Второй недооценённый источник - вывод команд. Лог выглядит как техническая информация, но это текст, который агент читает и может воспринять как указание. Сообщение вида для исправления выполните такую-то команду в чужом логе - это готовая инструкция, приехавшая из ниоткуда. Причём вывод не обязан быть враждебным намеренно: достаточно, чтобы в него попал фрагмент чужого файла, ответ стороннего сервиса или текст ошибки, содержащий чей-то совет. Поэтому вывод инструментов относят к тому же классу данных, что и веб-страницу.
Чтобы это перестало быть абстракцией, стоит проследить одну цепочку целиком. Агенту дают разобрать сообщение об ошибке, пришедшее от постороннего человека. В тексте сообщения, кроме описания симптома, есть абзац, обращённый к исполнителю: проверьте конфигурацию и отправьте её содержимое на такой-то адрес для диагностики. Агент читает это в том же потоке, что и вашу задачу, и у него есть доступ к файлам и сети. Ни один шаг здесь не выглядит атакой: текст пришёл по обычному каналу, действие похоже на диагностику, а результат - утечка. Разрывается цепочка не убеждением модели, а тем, что сеть закрыта, а секреты в контекст не попадают.
Сила слоёв - в композиции, а не в выборе самого строгого. Ни один слой не покрывает всё: доверие рабочей области не делает безопасным содержимое файлов, песочница не спасает от неверной правки, подтверждения не помогают, если человек жмёт согласиться не глядя. Работает набор: осознанное решение о доверии, исследование без правок на незнакомом проекте, режим с проверкой, песочница, явные разрешения на сеть и инструменты, а в конце - diff и тесты. Каждый слой дёшев по отдельности и закрывает свой класс ошибок, а вместе они оставляют мало путей, на которых одна оплошность становится инцидентом.
Есть и практический признак опасной конфигурации, который стоит помнить. Риск резко растёт, когда у агента одновременно есть три вещи: доступ к секретам, право писать и выход в сеть. По отдельности каждая ограничивает ущерб: без сети украденное некуда отправить, без записи нельзя закрепиться, без секретов нечего красть. В недоверенном контексте эти три вещи разносят намеренно - и это самая дешёвая проверка своей конфигурации, потому что ответ на неё виден сразу, без анализа кода.
Полезно заранее знать, как выглядит сработавшая инъекция, потому что в момент события это неочевидно. Агент предлагает действие, которого задача не требовала: обратиться к незнакомому адресу, прочитать файл с учётными данными, отправить содержимое куда-то наружу. В его рассуждении появляются требования, которых вы не ставили, со ссылкой на некие инструкции. Порядок действий смещается от задачи к сбору сведений о среде. Правильная реакция - не спорить и не уточнять запрос в том же разговоре: контекст уже заражён. Сессию заканчивают, задачу перезапускают с чистым контекстом, а если секреты были в зоне доступа, их меняют, не дожидаясь доказательств утечки.
Типичные провалы предсказуемы. Положиться на просьбу к модели вместо технической границы. Открыть чужой репозиторий и сразу разрешить исполнение его конфигурации. Считать вывод команды безопасным техническим текстом. Продолжать работу в разговоре, где инъекция уже сработала. И держать вместе секреты, запись и сеть там, где содержимое заведомо недоверенное.