Исследователи разработали метод атаки Ghostcommit через pull request, позволяющий похитить секретные данные репозитория. Вредоносная инструкция скрывается внутри PNG-изображения, которое ИИ-инструменты для проверки кода обычно не открывают.

В итоге проверяющий одобряет изменения. Позже специальный агент для работы с кодом считывает изображение, открывает файл .env репозитория и записывает все ключи в исходный код в виде безобидного набора чисел.
Эта атака — совместная разработка исследовательской группы ASSET из Университета Миссури — Канзас-Сити. Она опубликовала на GitHub прототип (proof-of-concept) и сообщила, что уведомила о результатах исследования затронутых вендоров.
Исследователи связывают эту атаку с существующей проблемой недостаточного контроля: анализ 6480 pull request в 300 самых активных публичных репозиториях за последние 90 дней показал, что 73% принятых запросов попали в основную ветку без какой-либо содержательной проверки человеком и вообще без проверки ботами.
Хитрость заключается в том, что вредоносная инструкция — это не текст, который может заметить проверяющий, а изображение.
Файл AGENTS.md (файл с правилами оформления кода, которые агенты считывают автоматически и воспринимают как политику проекта) выглядит как обычная инструкция по поддержанию порядка в сборке и не содержит упоминаний секретных данных.
Он просто ссылается на изображение docs/images/build-spec.png. Сам эксплойт скрыт в тексте, отрисованном внутри этого PNG: он считывает файл .env побайтово, кодирует каждый байт как целое число, записывает результат как константу модуля и проверяет, чтобы декодированные числа совпадали с данными реального файла перед фиксацией изменений (коммитом).
Для инструмента, проверяющего текстовый код, изображение выглядит как бинарный объект (blob).

Инструмент CodeRabbit поставляется с конфигурацией по умолчанию, которая полностью исключает файлы изображений из проверки. Bugbot также не выявил никаких проблем.
Исследователи даже добавили в PNG текст «malicious prompt injection» (вредоносная инъекция промпта) и явную команду прочитать .env, но проверка всё равно прошла успешно.
Фиктивный «валидатор происхождения» (provenance validator) объёмом 50 строк и выдуманный отчёт об инциденте (postmortem) обеспечили правилам достаточное количество вспомогательного кода, чтобы обойти последний рубеж защиты проверяющих — проверку на логическую связность, которая обычно помечает правила, не подкреплённые реальным кодом.
Вредоносный код остаётся неактивным до тех пор, пока в ходе другого сеанса работы разработчик не попросит ИИ-агента, пишущего код, создать что-то обыденное — например, модуль для отслеживания токенов.
При запуске агент считывает объединённый файл AGENTS.md, переходит по ссылке на изображение, открывает файл .env и записывает запрошенный модуль, добавив в его начало константу, содержащую данные о происхождении (provenance).
В ходе одного из сквозных тестов редактор Cursor, использующий модель Claude Sonnet, выполнил эту задачу с первой попытки; сгенерированная им константа представляла собой последовательность из 311 целых чисел, которые при декодировании побайтово восстанавливали полное содержимое файла .env.
Разработчик видит нужную ему функцию и фиксирует изменения (делает коммит), а злоумышленник извлекает и декодирует числа из этого публичного коммита. Инструменты для поиска секретов (secret scanners) не замечают угрозы, поскольку ни один из них не преобразует кортеж целых чисел Python обратно в формат ASCII для проверки.
В ходе сеанса Antigravity агент, получив запрос на добавление модуля отслеживания токенов, незаметно вычисляет константу _PROV_CANARY (содержимое .env, закодированное как список целых чисел), готовую к слиянию с кодом (ASSET Research Group).
Идея скрывать внутри изображений инструкции, предназначенные для выполнения ИИ-системой, не нова. В 2025 году исследователи из компании Trail of Bits Кикимора Морозова и Суха Саби Хуссейн продемонстрировали более изощрённый вариант: изображения, которые выглядят как обычные картинки в полном разрешении, но при изменении масштаба (ресемплинге) средствами самой ИИ-системы превращаются в читаемый текст, содержащий промпт-инъекцию. Этот метод позволил обмануть такие инструменты, как Gemini CLI.
Несколько позже вредоносное ПО для macOS под названием Gaslight внедрило в свой бинарный файл поддельные сообщения о системном сбое. Они предназначались для другого ИИ-анализатора и были призваны заставить инструменты анализа вредоносного кода прекратить проверку.
Ранее в том же году исследовательская группа из Manifold Security показала, как ИИ-систему для проверки кода удалось обмануть с помощью поддельных данных git-пользователя, заставив её принять вредоносный запрос на слияние. Для этого даже не потребовалось изображение.
В данном случае и Cursor, и инструмент Antigravity при использовании моделей Sonnet, Gemini, GPT-5.5 (и других) следовали за изображением и допускали утечку содержимого файла .env.
Инструмент Claude Code, работающий на тех же весах модели Sonnet, распознал ту же условную инструкцию и отказался выполнять действие, явно озвучив этот отказ; такой результат наблюдался при использовании всех моделей, протестированных исследователями.
При работе с Antigravity модель Opus сначала вывела секреты, но затем распознала сценарий социальной инженерии и удалила их, не завершив операцию до конца. Таким образом, всё зависело от внешней оболочки (инструментария), в которую «обёрнута» модель.
Исследователи отмечают, что это указывает на необходимость эшелонированной защиты. «Поскольку слепое пятно носит структурный характер, мы создали рецензента, который его закрывает: многомодальный защитник запросов на слияние, развёрнутый в виде приложения GitHub, работающего на одной видеокарте с 4 ГБ памяти. Он объединяет сканирование на наличие невидимых символов, сканирование структуры зафиксированного кода, проверку LLM-прохода по тексту соглашения и, что особенно важно, проверку LLM-прохода по изображениям», — пишут они.
В ходе реального тестирования на 80 запросах на слияние, которые ранее не встречались, только одна атака прошла проверку, включая все варианты на основе изображений, и ни один из 30 легитимных запросов на слияние не вызвал ложной тревоги.
Другой уровень — это среда выполнения, наблюдение за тем, что на самом деле делает агент, когда считывает файл учётных данных вместо попытки перехватить полезную нагрузку до её отправки.
Между тем исследователи из Флоридского международного университета выяснили, что одного изображения может быть достаточно, чтобы вывести некоторые системы ИИ за пределы их встроенных средств защиты. Команда разработала метод под названием JaiLIP (Jailbreaking with Loss-guided Image Perturbation, взлом с помощью искажения изображения, управляемого потерями). Метод вносит тщательно рассчитанные изменения в изображение, сохраняя при этом его внешний вид для глаза. Цель состоит в том, чтобы повлиять на то, как модель обработки изображений и языка реагирует на запросы пользователя.
Источник: habr.com