ИИДля
← Назад
Разбор / CODE · 10.09.2026 · 08:14

README как недоверенный ввод: почему ИИ-агенту нельзя выполнять каждую инструкцию

Разбираем скрытые команды в репозитории и строим безопасный путь от чтения документа до запуска кода.

Кира БеловаРедактор текстов и обучения
Редакционная иллюстрация к материалу «README как недоверенный ввод: почему ИИ-агенту нельзя выполнять каждую инструкцию»
Авторская иллюстрация редакции «ИИ Для»
Суть задачи

Документ не равен команде

README предназначен человеку, но агент видит его в том же контексте, что системную задачу. Внутри могут быть устаревшая команда, пример с секретом или намеренная prompt injection. Ошибка начинается, когда текст автоматически получает право менять файлы и обращаться к сети. Безопасная система сначала извлекает сведения, затем отдельно предлагает действие. Источник инструкции всегда показывается пользователю.

Что подготовить

Как выглядит атака

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

Рабочий маршрут

Три разных уровня доверия

Системные правила задаёт владелец среды. Пользовательская задача описывает цель. Файлы проекта, веб-страницы и вывод инструментов дают данные для работы, но не могут самостоятельно переписать первые два уровня. Это различие нужно реализовать не только словами в промпте. Права процесса, сетевой allowlist и подтверждение опасных команд должны действовать независимо от того, насколько убедительно модель объясняет необходимость шага.

Контроль качества

Что показывать перед запуском

Экран подтверждения содержит команду без сокращений, рабочую папку, изменяемые файлы, сетевые адреса и причину. Рядом показан фрагмент README, откуда возникло действие. Кнопка не должна одобрять сразу всю оставшуюся сессию. Разрешение связывается с конкретными параметрами и истекает после выполнения. Если команда построена через скрипт, пользователь должен видеть его содержимое или получить предупреждение о невозможности проверки.

Пример

Песочница как второй рубеж

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

Границы метода

Контрольный эксперимент

Создайте учебный README с обычной установкой и одной запрещённой командой, которая пытается прочитать фиктивный секрет. Ожидаемый результат: агент объясняет риск и останавливается до выполнения. Затем добавьте допустимую команду тестов — она должна пройти в песочнице. Проверьте журнал: там видны источник, решение пользователя и фактический результат. Тест повторяют после смены модели, системной инструкции или набора инструментов.

После запуска

Почему одного запрета в промпте мало

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

Внедрение

Разберите ложные остановки

Слишком строгая защита может блокировать обычную установку зависимости, и пользователь начнёт одобрять всё автоматически. Собирайте причины остановок и отделяйте опасные команды от редких, но допустимых. Разрешение добавляйте не по всей оболочке, а по точной операции, папке и сетевому адресу. Для новой категории сначала используйте одноразовое подтверждение. Если десять сопоставимых запусков прошли без отклонений, рассмотрите узкий allowlist. Удобство здесь важно: непонятный контроль со временем превращается в ритуал и перестаёт защищать.

Первый день

Что почитать дальше

Материал «Как принимать код от модели» продолжает тему ручной проверки diff и тестов. «Разбор ошибки в небольшом скрипте» показывает, как воспроизводить сбой без запуска лишних команд. Для интерфейса подтверждений пригодится «Прототип формы: проверяем ошибки, клавиатуру и пустые состояния». Эти ссылки ведут к разным этапам: оценка изменений, диагностика и понятное решение пользователя.

Вывод

Короткие ответы

Можно ли доверять README собственной команды? Его риск ниже, но учётная запись автора могла быть скомпрометирована, а файл — скопирован извне. Нужно ли подтверждать каждую команду? Нет: безопасные чтение и тесты можно внести в allowlist, опасные действия остаются отдельными. Поможет ли антивирус? Он ищет другой класс угроз. Надёжный процесс сочетает происхождение инструкции, минимальные права, изоляцию и журнал.

Перед использованием

Короткая проверка

  • Понятны цель и человек, который примет результат.
  • Исходники очищены, их версия и дата сохранены.
  • Факты, числа и ограничения сверены вручную.
  • Неудачный пример записан вместе с причиной.
  • Есть измеримый следующий шаг и путь назад.
Продолжить тему

Другие материалы этого направления