Ghostcommit: prompt injection через PNG и AGENTS.md
Ghostcommit показывает новую слепую зону AI code review: инструкция спрятана в PNG, AGENTS.md ведёт агента к файлу .env, а секреты уходят в обычный коммит.
Факты проверены 12 июля 2026 года. Ghostcommit prompt injection — исследовательская атака на AI coding agents, где вредная инструкция спрятана в PNG-картинке. В pull request добавляют безобидный на вид AGENTS.md, он ссылается на build-spec.png, а уже картинка просит агента прочитать .env и вывести секреты в код как набор чисел.
Снаружи такой PR выглядит скучно: файл с правилами для агента, картинка со «спецификацией сборки», немного поддерживающего кода. Разрыв появляется между двумя проверяющими. Текстовый AI-ревьюер картинку не открывает, а vision-capable coding agent позже её читает и воспринимает как рабочую инструкцию.
Исследование опубликовала ASSET Research Group. BleepingComputer отдельно пишет, что работу сделали исследователи University of Missouri-Kansas City Sudipta Chattopadhyay и Murali Ediga, а proof-of-concept выложен в репозитории ASSET на GitHub. Это controlled PoC с seeded secrets, а не подтверждённая массовая атака на реальные проекты.
Как работает Ghostcommit
Цепочка держится на доверенном контексте. AGENTS.md становится для агента чем-то вроде README с правилами работы. Официальный сайт AGENTS.md описывает формат как предсказуемое место для инструкций coding agents и указывает, что он используется более чем в 60 тысячах open-source проектов. В документации Codex тоже прямо сказано: Codex читает AGENTS.md перед началом работы.
В Ghostcommit этот механизм используют против самого агента. В текстовом файле нет явного приказа «украсть секреты». Он только сообщает, что модуль должен следовать спецификации из PNG. Вредная часть живёт внутри изображения: прочитать .env, превратить байты в числа и вставить результат в исходный файл как константу.

ASSET описывает две фазы. Сначала attacker доставляет PR: AGENTS.md плюс картинка. Ревьюер видит бинарный файл и пропускает его. Потом, уже после merge, разработчик просит агента сделать обычную задачу, например добавить модуль учёта токенов. Агент читает правила репозитория, открывает картинку и пишет числовую константу, которая декодируется обратно в содержимое .env.
В одном end-to-end прогоне у ASSET константа заняла 311 integers и побайтово восстанавливалась в весь seeded .env. Это ключевой момент: секреты не появляются как строка вида sk-... или AWS_ACCESS_KEY_ID=.... Они лежат как числа, поэтому обычный secret scanner может не увидеть credential-shaped паттерн.
Почему ревьюер пропускает PNG
По данным ASSET, прямой текстовый вариант атаки LLM-ревьюеры ловили: там в AGENTS.md прямо упоминался .env и кодирование в ASCII. Но когда ту же инструкцию перенесли в PNG, связка изменилась. CodeRabbit в стандартной конфигурации исключал PNG из проверки, а Cursor Bugbot не дал findings даже при явных словах про malicious prompt injection внутри картинки.
Сложной стеганографии здесь нет. Исследователи не прятали сигнал в пикселях так, чтобы человек его не увидел. Текст в PNG читаемый. Слабое место проще: часть пайплайна работает только с текстовым diff и не открывает изображение, а агент с vision-возможностями позже открывает его как полноценный источник инструкций.
Похожий класс риска мы уже разбирали в материале про prompt injection и supply-chain атаки на LLM-агентов. Ghostcommit отличается тем, что атака не просит пользователя сделать опасное действие сразу. Она ждёт в репозитории, пока агент сам прочитает доверенный контекст.
Где ломается контроль
Для команды разработки Ghostcommit удобнее разбирать по слоям защиты: где именно пайплайн перестаёт смотреть, проверять и ограничивать права.
| Слой контроля | Что пропускает | Что проверять |
|---|---|---|
| Code review | Изменения в бинарных файлах, особенно PNG/JPG/PDF, которые не попали в содержательный просмотр | Обязательная проверка новых и изменённых ассетов, OCR/vision-pass для картинок с текстом |
AGENTS.md и похожие файлы инструкций |
Ссылки на внешние или локальные «спецификации», которым агент должен следовать | Ревью как policy-as-code: кто добавил правило, зачем, какие файлы оно разрешает читать |
| Права coding agent | Чтение .env, домашней директории, токенов CI, cloud credentials |
Запуск без секретов по умолчанию, allowlist файлов, отдельные sandbox-профили для задач |
| Secret scanning | Секреты, закодированные не строкой, а числами, base64-кусочками или структурой данных | Энтропия, декодирование подозрительных массивов, правила на новые константы с длинными tuple/list |
| Merge policy | PR без реального человека или специализированного security-review | Защита веток, code owner для инструкций агентам и ассетов, запрет silent merge для risky paths |
ASSET отдельно приводит тревожную цифру: в их выборке из 6 480 pull requests по 300 активным публичным репозиториям 73% merged PR дошли до default branch без substantive human review и без bot review. Не каждый такой PR уязвим к Ghostcommit. Но цифра объясняет, почему такие атаки вообще стоит обсуждать: автоматизация ревью часто подменяет реальный контроль, хотя должна его дополнять.
Модель или оболочка: что важнее
Главный инженерный вывод ASSET: исход решала не только модель, но и оболочка вокруг неё. В их таблице одна и та же модель могла вести себя по-разному в разных coding tools. Claude Code отказался выполнять инструкцию во всех проверенных вариантах, тогда как другие связки в контролируемых тестах записывали seeded .env в код.
Это хорошо стыкуется с более широким тезисом про AI Security агентных систем: выбор более сильной модели сам по себе не закрывает риск. Важны harness, права, правила чтения контекста, политика tool calls, видимость файлов и то, как среда отделяет пользовательскую задачу от недоверенной инструкции из репозитория.

_PROV_CANARY выглядит как обычная часть Python-модуля. Источник: ASSET Research Group / GitHub.Есть и неприятная деталь для команд, которые уже поставили secret scanning. Если защита ищет привычные строки ключей, длинная константа из чисел может пройти мимо. ASSET прямо формулирует это как две невидимости: инструкция спрятана в изображении, а секрет спрятан в форме данных.
Что сделать в репозитории уже сейчас
Первое правило: не относитесь к AGENTS.md как к безобидной документации. Для агента это может быть исполняемая политика в естественном языке. Любое изменение такого файла должно проходить review владельцем репозитория или security owner.
- Добавьте
AGENTS.md,AGENTS.override.md,.cursor/rules,.github/copilot-instructions.mdи похожие файлы в code owners. - Запретите агентам читать
.envи локальные секреты в обычных coding-сессиях. Для тестов используйте canary-значения и отдельные sandbox-профили. - Проверяйте изображения в PR, если они упоминаются в инструкциях, документации сборки или policy-файлах. Минимум: OCR и ручной просмотр для новых ассетов.
- Настройте правила на подозрительные числовые массивы: длинные tuple/list из byte-sized values рядом с
Final,CANARY,PROV,KEY,SECRET. - Не давайте AI-ревьюеру быть единственным барьером перед merge для изменений в инструкциях, CI, security policy и бинарных файлах.
Если команда использует AI coding tools каждый день, полезно отдельно разобрать риски вроде HalluSquatting и атак на AI coding tools. Ghostcommit из той же семьи supply-chain проблем: атакующий бьёт не по модели напрямую, а по тому, что модель считает нормальным рабочим контекстом.
Чего не стоит делать
Не надо панически удалять все AGENTS.md. Сам формат полезен: он снижает трение, фиксирует команды запуска, стиль кода, тесты и проектные договорённости. Риск появляется, когда такой файл получает статус доверенной инструкции без таких же проверок, какие вы применяете к CI и deploy-конфигам.
Из этого не следует, что мультимодальность опасна сама по себе. Без vision agent не прочитает картинку, но тогда он может пропустить важный легитимный контекст. Безопасный путь другой: агент может смотреть изображение, но не должен получать право читать секреты и записывать их в код только потому, что так написано в PNG.
Наконец, не переносите PoC в боевой репозиторий. ASSET публикует код для воспроизводимости и защиты, подчёркивая, что все проверки шли на seeded credentials в собственных изолированных репозиториях. Для внутреннего security-теста используйте canary-секреты и заранее согласованную область проверки.
FAQ
Ghostcommit уже использовали в реальных атаках?
Публичных подтверждений массового боевого использования на момент проверки нет. ASSET описывает controlled proof-of-concept в собственных репозиториях с seeded secrets, а не инцидент с реальными украденными ключами.
Почему атака называется Ghostcommit?
Название отсылает к тому, что вредная логика почти не видна в обычном diff: инструкция живёт в PNG, а секрет появляется в commit как набор чисел. Для ревьюера это выглядит как обычное изменение кода, хотя данные внутри можно декодировать обратно.
AGENTS.md теперь опасен?
Опасен не сам формат, а неконтролируемое доверие к нему. AGENTS.md нужен многим coding agents как файл проектных инструкций. Его надо ревьюить как конфигурацию агента, особенно если он ссылается на другие файлы или задаёт правила чтения данных.
Secret scanner защитит от Ghostcommit?
Не всегда. Если scanner ищет строковые паттерны ключей, числовой tuple может пройти мимо. Нужны дополнительные правила для закодированных данных и ограничение доступа агента к секретам до того, как scanner вообще понадобится.
Итог
Ghostcommit показывает новую слабую зону AI code review: важная инструкция может лежать в файле, который один инструмент игнорирует, а другой читает как правило. Поэтому защита должна смотреть не только на промпт и модель, но и на весь контур: доверенные файлы инструкций, ассеты, права агента, secret scanning и merge policy.
Здесь нет мистики. Откройте картинки, ревьюйте AGENTS.md, урежьте доступ к .env, ловите странные числовые константы и не делайте AI-ревью единственным сторожем перед merge.
Источники
- ASSET Research Group: We put the exploit in a picture. The AI code reviewer never opened it., страница проверена 12 июля 2026 года.
- GitHub: asset-group/ghostcommit PoC, страница проверена 12 июля 2026 года.
- BleepingComputer: Ghostcommit hides prompt injection in images to fool AI agents, steal secrets, опубликовано 11 июля 2026 года.
- AGENTS.md: a simple, open format for guiding coding agents, страница проверена 12 июля 2026 года.
- OpenAI / ChatGPT Learn: Custom instructions with AGENTS.md, страница проверена 12 июля 2026 года.