Indirect prompt injection, по ряду публикаций, срабатывает в значительном проценте случаев при тестировании агентных систем с auto-execution - точные цифры скачут в зависимости от методологии и набора тестов. За последние полгода я неформально проверял это на Claude Code Auto Mode, Cursor и двух AutoGPT-обёртках с веб-доступом: готовил HTML-страницы с hidden payload-ами и смотрел, что сделает агент при запросе «подтяни документацию и собери чек-лист». Три из четырёх попыток заканчивались тем, что агент выполнял действие, продиктованное контентом страницы, а не моим промптом - без единого запроса на подтверждение. Методология кустарная (без фиксированного набора payload-ов и контроля версий агентов), но вектор воспроизводится стабильно. Ниже - механика indirect prompt injection через веб-контент, конкретные payload-техники и kill chain для coding-агентов.
Почему Auto Mode AI-агентов уязвим для indirect prompt injection
Coding-агент - Claude Code, GitHub Copilot, Cursor - работает конвейером: пользователь ставит задачу, агент подтягивает контекст (файлы, документацию, веб-страницы), LLM обрабатывает всё в едином контекстном окне, потом генерирует ответ и выполняет действия: запись файлов, shell-команды, API-вызовы. Подробнее - в нашем материале про безопасность llm приложений.Дыра - на стыке получения контекста и его обработки. Контекстное окно LLM принимает токены из системного промпта, пользовательского запроса и внешних данных, и все они обрабатываются единообразно. Архитектурного разделения между привилегированными инструкциями и недоверенным контентом нет. Это свойство transformer-архитектуры, а не баг конкретного продукта. По OWASP (LLM01:2025 - Prompt Injection), RAG и fine-tuning улучшают релевантность ответов, но не устраняют уязвимость к инъекции промптов.
Auto Mode кратно усиливает проблему. В штатном режиме Claude Code запрашивает подтверждение на деструктивные операции: запись файлов, shell-execution, обращение к внешним ресурсам. Auto Mode снимает этот барьер - human-in-the-loop исчезает, агент действует автономно. Blast radius одной poisoned страницы масштабируется пропорционально привилегиям агента: доступ к файловой системе + shell + Git + API-токены = полная компрометация рабочей среды. Одна страница - и весь workspace под контролем атакующего.
По данным Cisco State of AI Security 2026 (ссылка через Vectra AI), 83% организаций планируют развёртывать agentic AI, но только 29% считают себя готовыми с точки зрения безопасности. Выделенные средства защиты от prompt injection внедрили 34,7%. Разрыв между adoption и protection - огромный, и coding-агенты в Auto Mode сидят ровно в центре этого разрыва.
Анатомия атаки: непрямой prompt injection через сайт
Прямая prompt injection - пользователь сам вводит вредоносный промпт в чат. Indirect prompt injection (IDPI) - принципиально другой вектор: атакующий вообще не взаимодействует с агентом напрямую. Вредоносная инструкция лежит в данных, которые агент обрабатывает: на веб-странице, в PDF, в email, в ответе стороннего API.Для coding-агента с веб-доступом сценарий непрямого prompt injection через веб-контент выглядит так:
- Атакующий размещает hidden-инструкции на веб-странице (или инъецирует в существующую через UGC, комментарии, компрометацию)
- Пользователь просит агента: «Суммаризируй документацию с example.com и собери зависимости»
- Агент делает HTTP-запрос, парсит HTML, извлекает текстовое содержимое
- LLM получает контент страницы в едином контекстном окне - наравне с системным промптом и запросом пользователя
- Hidden-инструкция интерпретируется как команда
- В Auto Mode агент выполняет команду без подтверждения - от
printenvдоcurlна внешний эндпоинт
В терминах MITRE ATT&CK этот вектор ближе всего к User Execution: Malicious Link (T1204.001, Execution): пользователь или агент от его имени обращается к ресурсу с вредоносным контентом. Drive-by Compromise (T1189) иногда используют как аналогию, но она описывает эксплуатацию уязвимостей браузера, тогда как здесь «эксплуатация» идёт через смешение data/instruction context в контекстном окне LLM. Unit 42 формулирует прямо: «the web itself effectively becomes an LLM prompt delivery mechanism».
Бизнес-логика атаки
Зачем это атакующему? Через скомпрометированный coding-агент можно: внедрить backdoor в кодовую базу продукта (supply chain attack), стянуть API-ключи и секреты из переменных окружения, получить доступ к приватным репозиториям, модифицировать CI/CD пайплайн для доставки вредоносного кода в продакшн. Одна отравленная страница → один скомпрометированный агент → компрометация всей цепочки поставки ПО. Монетизация: продажа доступов, шифровальщик через CI/CD, кража интеллектуальной собственности.Payload engineering: техники обхода защиты Claude Code
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Algorithmic Payload Decomposition (по таксономии CrowdStrike, конкретный идентификатор требует верификации). Вредоносная инструкция разбивается на фрагменты: переменные, шаги сборки, части команды разнесены по разным HTML-элементам. Каждый фрагмент выглядит безобидно для pattern-matching сканера, но LLM синтезирует их в единую исполняемую команду. Классический evasion-приём, адаптированный для AI-агентов. Перекликается с Obfuscated Files or Information (T1027, MITRE ATT&CK, тактика Defense Evasion) - только целью обфускации здесь не антивирус, а input-фильтр AI-системы.
Trigger-Activated Rule Addition (по таксономии CrowdStrike, конкретный идентификатор требует верификации). «Спящая» инструкция, которая активируется при определённом условии: пользователь упоминает ключевое слово, агент вызывает конкретный инструмент, наступает внешнее условие. При ревью payload выглядит безвредным - скрытое правило, которое «просыпается» только по триггеру. Для coding-агентов триггером может быть вызов
git push или обращение к определённому файлу. Красиво, если подумать - бомба с часовым механизмом, только вместо часов - семантика.Обфускация: base64, unicode, multilingual. Инструкции кодируются в base64 с просьбой к модели декодировать, записываются unicode-символами или формулируются на другом языке. По OWASP (LLM01:2025, Scenario #9), multilingual/obfuscated attacks - задокументированный вектор обхода фильтров безопасности.
Unwitting User Context-Data Injection (идентификатор требует верификации). По описанию CrowdStrike, это ситуация, когда пользователь сам - не подозревая - вносит вредоносные инструкции в контекст агента: копирует текст со скомпрометированной страницы, форвардит email с hidden payload, загружает документ с инъекцией. Промпт пользователя безобиден; вредоносная нагрузка - в контекстных данных. Это может произойти через скомпрометированные browser-расширения или sync-утилиты, которые вставляют данные в workspace, обрабатываемый AI-агентом.
CVE в AI coding-агентах: от PoC к уязвимостям автономных AI-агентов
Prompt injection атаки на AI-агенты - не академическая тема. Три CVE с присвоенными CVSS-оценками в разных классах AI-ассистентов (включая один coding-агент) подтверждают: prompt injection эксплуатируется в проде.CVE-2025-53773 - GitHub Copilot / Visual Studio 2022. Command injection (CWE-77: Improper Neutralization of Special Elements used in a Command). CVSS 7.8 (HIGH), вектор
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H. Атака локальная (AV:L), привилегии не требуются (PR:N), но нужно действие пользователя (UI:R) - открытие вредоносного проекта или файла. При успешной эксплуатации - полная компрометация конфиденциальности, целостности и доступности (C:H/I:H/A:H). Ровно тот сценарий indirect prompt injection: coding-агент парсит файл из репозитория и выполняет встроенную в него команду. Открыл проект - и всё, приехали.CVE-2025-32711 - M365 Copilot (EchoLeak). AI command injection (CWE-74: Injection). CVSS 9.3 (CRITICAL), вектор
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:L/A:N. Тут всё серьёзнее: атака по сети (AV:N) без привилегий (PR:N) и без действий пользователя (UI:N). Scope change (S:C) - компрометация одного компонента влияет на другие. Высокое воздействие на конфиденциальность (C:H). Indirect prompt injection в чистом виде: вредоносный контент попадает в контекст Copilot через внешние данные, агент сливает информацию без участия пользователя. Zero-click, если по-простому.CVE-2024-5184 - EmailGPT. Direct prompt injection в AI-ассистенте электронной почты (CWE-74: Injection). CVSS 8.5 (HIGH, по шкале CVSS v4.0 - в отличие от CVSS v3.1, использованной для двух предыдущих CVE). В отличие от первых двух, это пример прямой инъекции: атакующий напрямую через API вводил вредоносный промпт, вынуждая сервис раскрыть зашитые системные промпты и выполнить произвольные инструкции. Привожу для полноты картины - корневая причина та же: LLM не различает данные и инструкции.
Три разных продукта, три вектора, одна корневая причина: LLM не способна надёжно отличить данные от инструкций. Это не «баг, который пофиксят» - это архитектурное ограничение.
Promptware kill chain: семь стадий компрометации AI-агента
Исследователи предложили framework - promptware kill chain (arXiv, идентификатор требует верификации) - который переводит prompt injection из разряда «одноходовая уязвимость» в многоступенчатый механизм атаки по аналогии с классическим cyber kill chain. Семь стадий, адаптированных под coding-агента в Auto Mode:- Initial access - indirect prompt injection как точка входа. Агент обращается к веб-странице с hidden payload при задаче суммаризации или анализа документации.
- Privilege escalation - jailbreak safety alignment. Payload обходит guardrails модели, расширяя набор доступных действий агента за пределы штатных ограничений.
- Recon - извлечение системного промпта (отдельный риск: OWASP LLM07:2025 - System Prompt Leakage), списка доступных инструментов, переменных окружения и конфигурации. Маппинг на MITRE ATT&CK: System Information Discovery (T1082, тактика Discovery). По сути -
printenvи «расскажи мне свой system prompt» в одном флаконе. - Persistence - отравление памяти или конфигурационных файлов проекта. Если coding-агент использует project-level config (
.cursorrules,.claudeи подобные) - payload, записанный в такой файл, будет прочитан агентом при каждом запуске. Вредоносная инструкция закрепляется и влияет на будущие сессии. Красиво: агент сам себе подкладывает закладку. - C2 - установка канала эксфильтрации.
- Lateral movement - распространение на связанные системы. Coding-агент с доступом к Git push-ит изменённый файл в ветку - PR содержит backdoor. Или записывает payload в shared configuration, который другой агент (или CI/CD pipeline) прочтёт и обработает. Скомпрометированный агент А передаёт результат агенту Б - если результат содержит инъекцию, весь пайплайн под угрозой.
- Actions on objective - конечная цель: кража данных, внедрение backdoor в кодовую базу, модификация CI/CD для доставки вредоносного кода в продакшн, эксфильтрация секретов.
Для Claude Code в Auto Mode с доступом к файловой системе, shell и Git одна отравленная страница потенциально открывает путь от initial access до actions on objective без единого подтверждения от пользователя.
Детектирование и защита LLM от prompt injection
OWASP в LLM01:2025 сформулировал стратегии митигации. Адаптирую их к контексту coding-агентов с практическими рекомендациями.Ограничение поведения модели. Системный промпт явно определяет роль, возможности и запреты. Инструкция модели - игнорировать попытки переопределения из внешнего контента. Это не гарантия (LLM архитектурно не различает системный промпт и данные), но снижает success rate прямых атак. Считайте это замком на калитке - не остановит целенаправленную атаку, но отсечёт шум.
Принцип минимальных привилегий. Агент не получает права на shell-execution, если задача - суммаризация документации. API-токены - с минимальным scope, с ротацией, с логированием каждого tool-call. CrowdStrike рекомендует: AI threat model должен покрывать каждое место, из которого поступает контекст - промпты, файлы, RAG-пайплайны, память агента, API, инструменты, веб-контент, email.
Human-in-the-loop для операций с высоким impact. Auto Mode удобен, но для shell-execution, отправки данных на внешние эндпоинты и модификации кода в основной ветке подтверждение пользователя обязательно. Это компромисс между удобством и AI agent security, но при текущем состоянии архитектуры LLM - единственный надёжный барьер. Да, раздражает. Да, необходимо.
Разделение и маркировка внешнего контента. Контент из недоверенных источников маркируется как данные на уровне приложения. Transformer-архитектура эту разметку не различает, но обёртка агента с metadata-тегами и разделителями снижает вероятность путаницы. OWASP рекомендует: «Segregate and identify external content to limit its influence on user prompts».
Runtime-мониторинг поведения агента. Signature-based detection тут не работает: каждая инъекция промптов уникальна. Нужна behavioral anomaly detection - если агент при задаче суммаризации внезапно вызывает
curl или лезет в printenv, это аномалия:
YAML:
# Мониторинг agent tool-calls (демонстрация концепции)
ai_agent_monitor:
log_all_tool_calls: true
alert_on:
- shell_exec_without_user_prompt
- http_request_to_unknown_domain
- env_variable_access
severity: {shell: critical, http: high, env: high}
Adversarial testing. Регулярный red teaming AI-агентов с IDPI-payload-ами не менее важен, чем пентест веб-приложений. Тестирование должно включать boundary mimicry, delayed activation, payload decomposition, special token injection и multilingual obfuscation. По данным CrowdStrike, таксономия prompt injection насчитывает более 200 техник - тестирование одним
ignore previous instructions давно не покрывает реальную поверхность атаки.Фундаментальная проблема не в том, что Claude Code или Copilot «плохо фильтруют» ввод. Проблема архитектурная: transformer-модели обрабатывают все токены в контекстном окне единообразно, без привилегированных зон. Это аналог SQL injection двадцать лет назад - SQL-движок не различал код запроса и данные пользователя. Разница в масштабе: SQL injection затрагивала одно приложение, prompt injection затрагивает каждую систему, дающую LLM доступ к внешним данным.
Многие security-команды до сих пор подходят к защите AI-агентов как к задаче фильтрации ввода - regex, keyword-blacklist. Это та же ошибка, которую делали с XSS в 2005-м: фильтры обходятся, 200+ техник в таксономии CrowdStrike это подтверждают. Заявлено «мы фильтруем» - реально payload проходит через unicode-обфускацию или разбивку по HTML-элементам.
В ближайшие год-два я ожидаю рост IDPI через supply chain - не веб-страницы, а отравленные пакеты, README в репозиториях, комментарии в зависимостях. Coding-агенты парсят всё это как контекст. CVE-2025-53773 уже показывает: достаточно открыть вредоносный проект в Visual Studio с Copilot - и command injection срабатывает локально. Следующий шаг - атаки через зависимости, которые агент подтягивает автоматически. Ни один вендор пока не решил задачу разделения data и instruction на уровне модели. Реальная защита - defence in depth на уровне приложения: минимальные привилегии, human-in-the-loop, runtime-мониторинг и adversarial testing. Если хочешь прощупать, как hidden payload в HTML превращается в полноценную компрометацию - на HackerLab есть сценарии, где IDPI-primitive нужно раскрутить от скрытой инъекции до эксфильтрации самостоятельно.