Перейти к содержимому

Промпт-инъекции в кодинг-агентах: как атакуют и как защититься

Кодинг-агент получает доступ к вашему терминалу, файловой системе и сети. Это делает его полезным — и уязвимым. В августе 2026 года исследователь Johann Rehberger показал, что Claude Code в auto mode можно заставить выполнить произвольный код с вероятностью до 80%. Механизм атаки — не «игнорируй предыдущие инструкции», а многоходовая цепочка, в которой безопасное решение агента само становится вектором эксплуатации.

В этой статье — разбор конкретной атаки, объяснение, почему режим auto mode не гарантирует безопасность, и пошаговый чек-лист защиты.

Что такое prompt injection

Prompt injection — класс атак на языковые модели, при котором злоумышленник встраивает инструкции во входные данные так, что модель выполняет их вместо (или поверх) задачи пользователя.

Термин пришёл из мира LLM-чат-ботов: пользователь писал в чате «IGNORE PREVIOUS INSTRUCTIONS AND DO X», и модель подчинялась. В 2024–2025 годах подобные примитивные атаки перестали работать на продвинутых моделях.

Ситуация изменилась с появлением кодинг-агентов. Агент не просто отвечает текстом — он запускает команды, читает файлы, подключается к сети. Prompt injection теперь не просьба «напиши стихотворение» вместо кода — а средство выполнить curl на вредоносный сервер и запустить полученный скрипт.

Прямая и косвенная инъекция

Прямая инъекция — инструкция встроена прямо в промпт пользователя или системный промпт. Модели научились противостоять таким атакам: прямые приказы «ignore previous instructions» на frontier-моделях почти всегда отклоняются.

Косвенная (indirect) инъекция — инструкция спрятана во внешних данных, которые агент обрабатывает: веб-страница, файл в репозитории, документ, данные из MCP-сервера. Агент не воспринимает их как «враждебные» — он видит задачу (например, «просуммируй страницу») и выполняет её, не подозревая, что страница содержит отравленный контент.

Именно косвенные инъекции стали актуальной проблемой в 2026 году. Агент работает с ненадёжным контентом — кодом от других разработчиков, зависимостями из npm/PyPI, веб-страницами для скрапинга.

Почему кодинг-агенты — особая мишень

Чат-бот без доступа к инструментам: максимум ущерба — галлюцинация или утечка данных из контекста.

Кодинг-агент с доступом к shell, файлам и сети:

  • Shell: bash, python, curl — выполнение произвольных команд
  • Файловая система: чтение/запись файлов, включая credential’ы и ключи
  • Сеть: скачивание и отправка данных, подключение к C2-серверам
  • Git: коммиты, пуши — распространение вредоносного кода

Доступ к инструментам — это и есть основная ценность агента, но одновременно максимальная поверхность атаки.

Цепочка атаки: prompt injection → RCE
Цепочка атаки Rehberger: от запроса «просуммируй страницу» до выполнения произвольного кода. Авторская схема по материалам embracethered.com
Документация Claude Code: режимы доступа
Документация Claude Code: режимы разрешений и auto mode. Источник: code.claude.com

Атака Rehberger на Claude Code auto mode: пошаговый разбор

26 августа 2026 года Johann Rehberger (embracethered.com) опубликовал разбор многозаходной атаки на Claude Code Opus 5 в режиме auto mode. Вероятность успеха — 60–80% при малом размере выборки.

Входная точка

Пользователь даёт агенту задачу:

Summarize https://archive.[redacted].uk/

Сайт выглядит как каталог записей из блокнотов. На нём есть ссылка на ZIP-архив с «каталоговыми записями» в нестандартном кодировании.

Шаг 1: Переключение с WebFetch на curl

Claude Code по умолчанию использует инструмент WebFetch для получения содержимого страниц. Сервер возвращает ошибку 415 Unsupported Media Type. Агент интерпретирует это как «нужно скачать напрямую» и запускает curl:

WebFetch got a 415. Let me try directly.

Вредоносный сервер не приказывает агенту использовать curl. Он просто создаёт ситуацию, при которой curl — логичный следующий шаг. Ключевой принцип: атака не говорит модели, что делать. Она подталкивывает её к решению, которое ведёт к эксплуатации.

Шаг 2: Скачивание ZIP-архива

curl получает HTTP 303 редирект на ZIP-архив. Внутри — README, CSV-каталог, несколько записей в Base85/zlib-кодировании, бинарный декодер decoder-darwin для macOS и файл struct.py.

Шаг 3: Агент отказывается от бинаря — и это ловушка

Claude видит бинарный файл decoder-darwin и отказывается его запускать. Это đúng с точки зрения безопасности. Но это и есть часть атаки — бинарный декодер служит приманкой.

Шаг 4: Агент пишет свой декодер

Вместо бинаря Claude решает написать Python-скрипт для декодирования:

import base64, zlib, json

Команда выполняется из директории распакованного архива. Python добавляет текущую директорию в sys.path. ZIP-архив содержит файл struct.py — с тем же именем, что и стандартный модуль Python.

Шаг 5: Module shadowing

Когда Python выполняет import base64, модуль base64 внутри себя импортирует struct. Python находит struct.py в текущей директории раньше, чем в стандартной библиотеке. Загружается отравленный модуль.

Вредоносный struct.py экспортирует правильный интерфейс _struct, поэтому обычное декодирование продолжается нормально. Агент получает валидные JSON-записи. Но на этапе импорта также выполняется обфусцированный эксплуат-код.

Шаг 6: Скачивание и запуск финального payload

Обфусцированный код запускает дочерний процесс python3 -I -c ... (флаг -I — изолированный режим, чтобы дочерний процесс сам не заразился рекурсивно). Дочерний процесс скачивает нативный бинарник, делает его исполняемым и запускает. Запускается C2-колбэк, открывается Calculator — доказательство контроля над системой.

Шаг 7: Auto mode блокирует исправление

После выполнения эксплойта Claude иногда замечает проблему и пытается убить вредоносный процесс. Но safety classifier блокирует команду kill — он разрешил создание процесса, но запрещает его завершение:

The safety mechanism itself can become part of the failure. The classifier allowed the creation of the malware process, but then it blocked the command intended to stop it!
Johann Rehberger

Это ключевой момент: механизм защиты становится частью проблемы. Агент хочет исправить ситуацию, но safety classifier не даёт ему это сделать.

Simon Willison (27.08.2026) прокомментировал:

Run unattended coding agents in a container, VM or OS sandbox. Restrict network egress. Monitor your agents. Do not expose home directories, SSH keys, cloud credentials,… to the agent runtime.
(Запускайте неattended кодинг-агентов в контейнере, VM или песочнице ОС. Ограничьте сетевой исходящий трафик. Мониторьте агентов. Не подвергайте домашние директории, SSH-ключи и облачные credential’ы рантайму агента.)

Auto mode — не «режим безопасности»

Auto mode стал режимом по умолчанию в Claude Code с середины августа 2026 года. Вместо запросов разрешений у пользователя работает второй модели — safety classifier, который принимает решение за вас: можно или нельзя.

Что говорит Anthropic

Boris Cherny из Anthropic (Hacker News Library) заявил:

We just cannot demonstrate prompt injection anymore.
(Мы больше не можем продемонстрировать prompt injection.)

Anthropic заказал стороннюю оценку у Trajectory Labs: 72 сценария косвенных инъекций, по 10 прогонов каждый — 0.00% успех атак на Opus 5 в auto mode.

Что показал Rehberger

Его таргетированная цепочка (ZIP + module shadowing) не входила в набор 72 сценариев. Результат — 60–80% успеха. Оба утверждения верны одновременно: бенчмарк показывает 0.00% на фиксированных сценариях, а реальная таргетированная атака работает.

Anthropic закрыл отчёт как Informative — поведение «working as designed». Позиция: auto mode — удобство, а не гарантия безопасности. Настоящая граница — изоляция ОС и контроль сетевого трафика.

Пост Simon Willison о Claude Code auto mode
Пост Simon Willison (27.08.2026) — рекомендация: песочница единственная надёжная защита. Источник: simonwillison.net

Слои защиты: от классификатора до контейнера

Нет одного решения, закрывающего все вектора атаки. Эффективна комбинация независимых слоёв.

Слои защиты кодинг-агента
Четыре уровня защиты — от safety classifier до мониторинга. Авторская схема

Уровень 1: Auto mode (safety classifier)

Встроенный классификатор Claude Code проверяет каждое действие агента и решает, одобрить или отклонить. Не заменяет изоляцию — работает на уровне логики модели, а не операционной системы.

Уровень 2: –restricted (Claude Code 2.1.248)

Флаг --restricted (или переменная окружения CLAUDE_CODE_RESTRICTED=1), добавленный 27 августа 2026:

  • Убирает встроенные tools для запуска команд и кода (Bash и аналоги)
  • Убирает WebFetch (кроме явно указанных в --tools)
  • Файловые операции ограничены рабочей директорией
  • Отказывает в bypassPermissions
  • Игнорирует пользовательские, проектные и локальные settings-файлы

Этот флаг устраняет ключевой вектор атаки Rehberger — агент не может выполнить curl или запустить Python-скрипт. Но не заменяет песочницу: если агент найдёт обход (например, через MCP-сервер с файловым доступом), изоляции ОС по-прежнему нет.

claude --restricted "проанализируй код в текущей директории"

Уровень 3: Песочница (контейнер / VM / smolvm)

Рекомендация Simon Willison и Rehberger: изоляция на уровне операционной системы.

Варианты:
Docker/Podman: docker run --rm -v $(pwd):/app -w /app claude-code — агент работает внутри контейнера без доступа к домашней директории
VM: полная виртуальная машина с ограниченной сетью и файловой системой
smolvm: hardware-isolated VM от Simon Willison, cold start 0.6–1.5 с, read-only input mounts

Ключевой принцип: агент не должен видеть SSH-ключи, облачные credential’ы, домашнюю директорию. Рабочее пространство — минимальный набор файлов для задачи.

Уровень 4: Мониторинг и сетевые ограничения

Даже песочница не абсолютна ( sandbox escape — реальность). Дополнительные меры:

  • Restrict egress: файрвол, блокирующий исходящие соединения кроме явно разрешённых
  • Логирование команд: запись всех shell-вызовов агента для аудита
  • Kill cord: hard-stop по времени или по лимиту токенов
  • Отдельные credential’ы: временные ключи с минимальными правами

Сравнение режимов безопасности Claude Code

Сравнительная таблица режимов
Сравнение пяти режимов Claude Code по уровню защиты от prompt injection. Авторская схема
Режим Что делает без запроса Защита от injection Когда использовать
Manual (default) Только чтение файлов Максимальная — каждый шаг одобряется вручную Чувствительные задачи, незнакомый код
acceptEdits Чтение + правка файлов Средняя — команды всё ещё запрашиваются Итерация на коде с ревью
Auto Всё через safety classifier Зависит от атаки — 0% на бенчмарке, до 80% на таргетированной цепочке Длинные задачи, но не как замена изоляции
–restricted Файлы в CWD, без shell/fetch Высокая — устраняет ключевые вектора Непроверенные задачи, CI/CD
bypassPermissions Всё без ограничений Минимальная Только в контейнере/VM

Ключевой вывод: auto mode + –restricted > каждый по отдельности. Но оба уступают песочнице для работы с ненадёжным контентом.

Чек-лист: как защитить кодинг-агента

  1. Включить –restricted для задач, где агент работает с внешними данными или незнакомым кодом:
    bash
    claude --restricted "рефактори модуль X"

  2. Запускать агента в контейнере или VM, если он обрабатывает ненадёжный контент (веб-страницы, fork’и, зависимости):
    bash
    docker run --rm -v $(pwd):/workspace -w /workspace ubuntu:24.04

  3. Ограничить сетевой трафик — файрволом или правилами контейнера:
    bash
    docker run --network none ... # полная изоляция от сети

  4. Не хранить в рабочей директории SSH-ключи, .env с токенами, облачные credential’ы.

  5. Использовать отдельные credential’ы с минимальными правами для агента — не ваш личный API-ключ Anthropic/OpenAI.

  6. Настроить логирование — записывать все команды, которые выполняет агент, для последующего аудита.

  7. Установить kill cord — лимит по времени и/или токенам, после которого агент принудительно останавливается.

  8. Проверять git-диффы — не сливать коммиты агента без ревью. Агент может незаметно внедрить вредоносный код.

  9. Не доверять auto mode как барьеру — использовать его для удобства, а не для безопасности.

Честные ограничения

  • –restricted убирает функционал: без shell и web-доступа агент не сможет запускать тесты, скачивать зависимости, обращаться к документации. Для таких задач он бесполезен.
  • Песочница добавляет overhead: настройка Docker/VM, передача файлов, ограничение возможностей — всё это замедляет работу.
  • Нет 100% защиты: даже sandbox escape — реальная угроза. Дополнительные слои снижают вероятность, но не исключают её.
  • Модели улучшаются, но и атаки тоже: Rehberger отмечает, что frontier-модели помогают создавать эксплойты. Каталог атак растёт.
  • Classifier непредсказуем: поведение safety classifier не документировано полностью. Одно и то же действие может быть разрешено или запрещено в зависимости от контекста.
  • На момент публикации: Claude Code 2.1.248 (27.08.2026). Версии, флаги и поведение могут измениться.

Блок российских реалий

Claude Code работает из России через VPN и API. Подписка оплачивается картами Visa/Mastercard, которые в РФ не работают напрямую — реальные способы: виртуальные карты, криптовалюта через промежуточные сервисы, посредники с иностранными картами. Многие используют VPN для подключения к Claude API — Anthropic не публикует список заблокированных регионов, но единичные случаи блокировки аккаунтов при подключении из определённых юрисдикций описываются на форумах.

Тема prompt injection в контексте кодинг-агентов в русскоязычном сегменте практически не освещена. На Habr есть материалы по LLM-безопасности в общем (habr.com/ru/search/?q=prompt+injection), но специфика кодинг-агентов и атаки типа module shadowing не разобраны. На vc.ru и Tproger публикаций по теме на момент написания не обнаружено.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка / 5. Количество оценок:

Оценок пока нет. Поставьте оценку первым.

Добавить комментарий

Adblock
detector