Ghostcommit: вредоносные команды прячут в картинках, чтобы обмануть ИИ-агентов

Чем больше кода пишут и проверяют ИИ-агенты, тем интереснее их атаковать. Новая техника Ghostcommit бьёт именно по этому стыку: она прячет вредоносные инструкции внутри картинки, чтобы обойти ИИ-ревьюеров и заставить кодового агента слить секреты — например, содержимое файла .env. Атаку продемонстрировала исследовательская группа ASSET.

В чём хитрость

Ghostcommit эксплуатирует «слепое пятно» мультимодальных моделей, разнося нагрузку по двум каналам.

  • Текстовый слой. Безобидный на вид файл-соглашение AGENTS.md просит агента взять некую «сборочную константу» из указанной картинки.
  • Слой картинки. Сам эксплойт — команда читать .env побайтово и кодировать в ASCII-числа — зашит текстом прямо внутри PNG.

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

Как разворачивается атака

  1. Pull request. Атакующий присылает запрос с AGENTS.md и вредоносным PNG, спрятанным в docs/images/build-spec.png.
  2. Обход ревью. ИИ-ревьюеры вроде Cursor Bugbot помечают явную текстовую нагрузку как критичную, но инструкции внутри картинки не видят. PR проходит «чистым».
  3. Срабатывание. Позже разработчик в отдельной сессии просит агента о совершенно другой доработке. Агент читает уже влитый AGENTS.md, идёт по ссылке на картинку и выполняет спрятанную команду.
  4. Утечка. Агент читает .env и выводит его как константу уровня модуля — сотни чисел, кодирующих секреты. В одном из тестов это был кортеж из 311 чисел с API-ключами, адресами баз данных и облачными кредами.
  5. Расшифровка. Атакующему остаётся прочитать публичный коммит и перевести числа обратно в текст.

Кто уязвим, а кто устоял

Результат сильно зависел не столько от самой модели, сколько от «обвязки» вокруг неё. Поддались Cursor (с Claude Sonnet, Composer-2, GPT-5.5) и Antigravity (с Sonnet, Gemini 3.1 Pro, Gemini 3 Flash). Устоял Claude Code — отказался выполнять команду на всех проверенных моделях (Sonnet 4.6, Haiku 4.5, Opus 4.7). Любопытен пограничный случай: Opus под Antigravity сначала вычислил и записал секрет, но затем распознал схему социальной инженерии и удалил его до завершения.

Как защищаться

Исследователи собрали прототип мультимодального ревью-приложения для GitHub на базе Gemma 4, работающего на одной видеокарте с 4 ГБ памяти. Он совмещает поиск невидимых символов, анализ «формы» кода и проходы модели и по тексту соглашений, и по встроенным изображениям.

Результаты обнадёживают: на стресс-тесте из пятнадцати классов атак прототип поймал все вредоносные PR без единого ложного срабатывания, а на восьмидесяти незнакомых реальных запросах распознал 49 атак из 50. Код доказательства концепции выложен в открытый доступ — чтобы защитники могли им пользоваться.