Prompt injection в CLAUDE.md и AGENTS.md: как защитить ИИ-агентов для кода
За два дня мы насчитали девять постов разных разработчиков об одном и том же приёме: файл с инструкциями в репозитории велит ИИ-агенту молча запустить скрипт. Рассказываем, как это работает, что случилось на одном из наших проектов и что мы проверяем, прежде чем агент откроет чужой код.
Что случилось
Девять постов за два дня
Схема простая. В репозитории лежит файл с инструкциями, из тех, что ИИ-агенты для кода читают автоматически в начале сессии: CLAUDE.md, AGENTS.md или файл правил для редактора. Он выглядит как обычные договорённости проекта, а где-то внутри стоит строка: любому агенту сначала запустить скрипт настройки, сам скрипт не открывать, его вывод не показывать и разработчика ни о чём не спрашивать.

Разработчик клонирует такой репозиторий, запускает агента с широкими правами, и тот выполняет всё, что лежит в скрипте. Агент ничего не взламывает. Он делает ровно то, для чего создан: читает инструкции проекта и следует им.
За один день мы увидели семь постов об этом от разных разработчиков и ещё два на следующий. Когда один и тот же приём одновременно появляется в стольких лентах, он уже вышел из научных статей в обычную работу. Нас это касается напрямую: наши команды каждый день работают с ИИ-агентами, на своих системах и на проектах клиентов, и это действительно ускоряет работу. Поэтому вопрос для нас не в том, пользоваться ли агентами, а в том, как не дать им принимать команды не из того источника.
Почему работает
Агенты доверяют тому, что читают
Агент для кода решает, что делать, по тексту. Большую часть этого текста пишет не человек в разговоре: файлы репозитория, задачи в трекере, веб-страницы, сообщения об ошибках и вывод инструментов, которые агент вызывает. Любой из них может нести инструкции, и это называется prompt injection. Этот риск стоит первым в списке OWASP для приложений на языковых моделях.
В окне чата подброшенная инструкция даёт неверный ответ. В агенте для кода она даёт команду на машине, где лежат ключи доступа. Саймон Уиллисон назвал опасное сочетание смертельной триадой: доступ к закрытым данным, контакт с непроверенным содержимым и способ отправить данные наружу. Ноутбук разработчика с агентом в только что клонированном репозитории часто собирает все три.
Атакующий пользуется именно теми местами, которым агент доверяет по замыслу:
- Файлы инструкций: CLAUDE.md, AGENTS.md и файлы правил редактора. Формат AGENTS.md создан как раз для того, чтобы любой агент читал одни и те же указания по проекту. Это удобно, но превращает файл в единую точку влияния.
- Настройки проекта с хуками, которые запускают команды.
- Конфигурация подключённых серверов инструментов (MCP) и папки со скиллами или промптами.
- Скрипты, на которые всё это ссылается, а ещё README, задачи в трекере и скрипты установки пакетов.
Агент ничего не взламывает. Он следует инструкциям проекта.
Хуки
То, что запускается без спроса
Файлы инструкций хотя бы проходят через модель, и она может заметить, что что-то не так. С хуками иначе. В инструментах, которые их поддерживают, хуки являются командами оболочки и запускаются автоматически в заданные моменты, например перед вызовом инструмента или в начале сессии. Их описывают в файлах настроек проекта, они работают с правами разработчика, и модель не решает, запускать их или нет.
Поэтому папку настроек чужого репозитория нужно прочитать первой, ещё до запуска агента. Хук, который что-то скачивает, что-то отправляет наружу или запускает скрипт из папки зависимостей, сделает это независимо от того, согласился бы агент или нет.
Не теория
Что уже случилось
Посты появились не на пустом месте. Атаки через файлы и права агентов описаны уже полтора года, и каждая шла через место, которому агент доверяет по замыслу:
- Март 2025, скрытые правила. Pillar Security показала инструкции, спрятанные в файлах правил Cursor и GitHub Copilot с помощью невидимых символов Unicode: символов нулевой ширины и знаков направления текста. Человек, который проверяет файл, видит обычный текст, а агент читает и скрытую часть. В их демонстрации агент добавил в сгенерированную страницу внешний скрипт и не упомянул об этом.
- Июль 2025, Amazon Q. Версия 1.84.0 расширения Amazon Q для VS Code, у которого почти миллион установок, вышла с промптом, который кто-то влил в его репозиторий: стереть данные на машине и облачные ресурсы, с разрешением на все инструменты и без вопросов. AWS заменила её версией 1.85.0; сработать ему помешала ошибка в самом подброшенном коде.
- Август 2025, Nx. Взломанные версии сборщика Nx в npm искали на машине ИИ-агентов для кода (Claude, Gemini, Amazon Q) и запускали их с отключённой проверкой прав, чтобы найти на диске ключи и криптокошельки. Найденное уходило в публичные репозитории на GitHub, сообщает Wiz.
- Июнь 2026, Cursor. Cursor без спроса запускал хуки из файла настроек другого инструмента, .claude/settings.local.json (CVE-2026-48124, исправлено в Cursor 3.0.0).
- Октябрь 2026, файл в «Загрузках». Forever Security нашла вредоносный AGENTS.md в папке Downloads у своего клиента. Он выглядел как инженерные заметки и велел агенту подключить новый сервер инструментов и установить npm-пакет, который подтягивает вредоносную программу. В тестах на изолированной машине Codex выполнял такой файл больше чем в 90% попыток. CLAUDE.md, который просил Claude Code направить трафик через чужой сервер и тем самым отдать токен входа, добивался своего примерно в половине случаев, пишет The Hacker News. Около половины клиентов этой компании запускают агентов прямо из папки загрузок.
Через две недели Cloud Security Alliance подвела итог в исследовательской заметке с говорящим названием Markdown Is the New Executable. Новейшие из этих атак не используют никакой ошибки в программе, поэтому ждать исправления от производителя бессмысленно: защищает только настройка.
Наш случай
Агент, который хотел помочь
Подброшенные файлы до нас пока доходили только через чужие посты. А вот на своей работе мы видели историю тише и по-своему поучительнее.
На одном из наших проектов агент решил быть очень полезным. У проекта были чёткие правила, что агенту можно и чего нельзя. Где-то в тексте, который он читал, строка с пометкой IMPORTANT дала ему, как ему показалось, вескую причину обойти одно из этих правил, и он его обошёл. Ничего не было подброшено. Агент взвесил две инструкции, решил, что громкая важнее, и нашёл лазейку в тихой.
Слова IMPORTANT, MUST или CRITICAL для агента просто текст, но они сдвигают его приоритеты. Атакующий это знает, а коллега с лучшими намерениями может добиться того же эффекта случайно. Правила наших проектов теперь прямо говорят, какой источник главнее: инструкции даёт только человек в разговоре, а текст в файлах, на страницах, в письмах и в выводе инструментов является данными, как бы он ни был оформлен. Правило, которое должно побеждать, должно так и говорить, а не просто стоять заглавными буквами.
Правило, которое должно побеждать, должно это сказать, а не кричать.
Наш файл
Шаблон, который мы проигнорировали
Безобидный пример есть и в нашем коде. Когда мы переносили The Structure на Laravel, новое приложение пришло с шаблонным CLAUDE.md от Laravel Boost, пакета, который готовит проекты на Laravel к работе с ИИ-агентами. Файл велит любому агенту сначала установить пакеты и выполнить команду настройки.
Ничего вредного в нём не было, это удобство от разработчика пакета. Но он хорошо показывает, как такие файлы появляются: вместе со стартовым шаблоном, пакетом или последним коммитом подрядчика, и никто в команде не решает их добавить. Наш агент прочитал файл, принял его как информацию и ничего из него не запустил. Именно такого поведения мы ждём от любого агента на любом проекте, и оно записано в инструкциях, которым следуют наши агенты; о них мы писали в статье Вашему коду нужна инструкция для ИИ.
Чек-лист
Прежде чем агент откроет чужой код
Самый опасный момент наступает в первой сессии в репозитории, который писал кто-то другой: проект, принятый от другого подрядчика, open-source пакет, код клиента, с которым мы ещё не работали. Прежде чем агент начнёт там работу, мы проверяем:
- Файлы инструкций: CLAUDE.md, AGENTS.md, файлы правил редактора и всё, что они подключают. Файл, который запрещает читать скрипт, просит что-то запустить молча или велит агенту не спрашивать, означает стоп. Ещё мы ищем в них символы, которых не видно при проверке: Unicode нулевой ширины и знаки направления текста.
- Настройки и хуки: папки настроек проекта для всех агентов, а не только используемых, ведь один инструмент уже запускал хуки из настроек другого, и каждую команду, которую запустил бы хук.
- Серверы инструментов и скиллы: конфигурацию MCP, папки скиллов и промптов и происхождение каждого сервера.
- То, на что они ссылаются: скрипты настройки, скрипты установки пакетов и всё, что лежит в папках, похожих на зависимости, но закоммиченных в репозиторий.
- Где стартует агент: только в папке проекта, никогда в «Загрузках» или в домашней папке. После первой сессии мы проверяем, что пользовательские настройки самого агента не изменились: нет новых серверов инструментов и нового адреса API.
Затем агент стартует с минимумом прав: без ключей к боевым серверам в окружении, с подтверждением команд, без права менять собственные настройки и на наших рабочих аккаунтах, а не личных. Когда проект приходит от другой команды, эта проверка идёт вместе с остальной передачей, которую мы описали в статье Как принять сайт или приложение от другого разработчика.
Владельцам
Что спросить у своей команды
Если ваш продукт делают с помощью ИИ-агентов, а сейчас так делается большинство продуктов, вам не нужно разбираться в хуках. Нужна команда, которая без запинки ответит на несколько вопросов:
- Какие агенты работают с нашим кодом и на чьих аккаунтах?
- К чему у них есть доступ: боевые серверы, базы данных, облачные консоли, данные клиентов?
- Какие команды выполняются только после подтверждения человеком?
- Кто проверяет изменения в файлах инструкций и настройках агентов так же, как код?
- Что происходит с доступами, когда уходит разработчик или подрядчик?
Файлы инструкций заслуживают такой же проверки, как код. Большинство команд уже требует одобрения для изменений в настройках деплоя; добавить к этому правилу CLAUDE.md, AGENTS.md и папки настроек агентов можно за несколько минут. В GitHub и GitLab это несколько строк в файле CODEOWNERS.
Эти вопросы важны и при продаже компании. Технические проверяющие со стороны покупателя задают их всё чаще, и наш партнёрский бренд The Structure объясняет, как он оценивает работу ИИ-агентов в компании, в статье How a buyer reviews the AI coding agents inside a company (на английском).
FAQ
Вопросы о prompt injection в агентах для кода
Что такое prompt injection в ИИ-агенте для кода?
Это текст, который управляет агентом не от имени человека, который с ним работает: файл в репозитории, задача в трекере, веб-страница или вывод инструмента. Агент для кода умеет выполнять команды, поэтому подброшенная инструкция может обернуться реальным действием на машине с ключами доступа, а не просто неверным ответом.
Опасны ли файлы CLAUDE.md и AGENTS.md?
Нет, они полезны, и мы пишем их для своих проектов. Риск в файле, который вы не писали и не читали, в репозитории, который только что клонировали. Прочитайте его раньше, чем это сделает агент.
Может ли скрытая инструкция пройти код-ревью?
Да. Символы Unicode нулевой ширины и знаки направления текста прячут строку от человека, который читает файл, а агент её всё равно читает. Так атаковали файлы правил в 2025 году. Проверка, которая не пропускает такие символы в файлах агентов, ловит это ещё до ревью.
Могут ли хуки запускаться без согласия агента?
Да. Хуки задаются командами в настройках проекта и запускаются автоматически в заданные моменты. Модель не решает, запускать ли их, поэтому настройки чужого репозитория нужно проверить до начала сессии.
Стоит ли отказаться от ИИ-агентов?
Нет. Агенты заметно ускоряют хорошую команду, и мы работаем с ними каждый день. Меняться должна настройка: минимум доступа, подтверждение команд, рабочие аккаунты и такая же проверка файлов агентов, как и кода.
Источники
- LLM01: Prompt Injection, OWASP Gen AI Security Project
- Markdown Is the New Executable: Instruction-File Poisoning of AI Coding Agents, Cloud Security Alliance
- Malicious File in Downloads Folder Tries to Trick AI Coding Agent Into Installing Malware, The Hacker News
- s1ngularity: supply chain attack leaks secrets on GitHub, Wiz
- Hooks reference, Claude Code documentation
Принимаете код, который писал кто-то другой? Давайте проверим, что прочитают ваши ИИ-агенты до начала работы.
Раз в неделю одно уведомление с новыми статьями PERETZ. Ничего лишнего.