Уязвимость GitHub Copilot CLI может привести к передаче секретов из локальных файлов на сервер атакующего, если разработчик поручит агенту открыть подготовленную веб-страницу и включит режим autopilot. В тестах Adversa AI полная цепочка атаки срабатывала в 50% попыток на модели Microsoft mai-code-1.1-flash; для команд, подключающих ИИ-агентов к репозиториям и окружениям с ключами, это ещё один аргумент не считать командную строку безопасной зоной.
О находке сообщает The Register. Исследователи Adversa AI назвали технику Cryptographic Context Injection, или CCI: вредоносные инструкции не лежат на странице открытым текстом, а зашифрованы. Агенту предлагают самостоятельно расшифровать их в своей среде выполнения — вместе с ключом и командами для запуска кода. Обычные фильтры, ищущие опасные фразы во входящем тексте, в такой конструкции видят набор шифротекста, а не просьбу прочитать файл .env и отправить его наружу.
Сценарий выглядит неприятно именно своей бытовой правдоподобностью. Разработчик просит Copilot CLI забрать данные с URL: например, изучить документацию, проверить пример интеграции или извлечь параметры из страницы. На странице находятся инструкции по расшифровке и два варианта ключа. Первый намеренно неверный: агент должен собрать его, прочитав указанные файлы на диске, в том числе .env, и подставить найденные значения в строку ключа.
Расшифровка с поддельным ключом ожидаемо завершается ошибкой. После этого агент использует второй ключ, получает новый набор инструкций и переходит по следующему URL. В этот запрос уже попадают собранные из локальных файлов секреты — токены, пароли или переменные окружения. Для атакующего это удобнее, чем прямое требование «отправь .env»: модель сама проходит через последовательность технически похожих на отладку действий.
Шифрование как маскировка для prompt injection
Косвенные prompt injection — не новая проблема для агентных инструментов. Модель получает текст не от пользователя, а из письма, issue, документации, веб-страницы или файла и принимает его за инструкцию к действию. Ранее Copilot CLI уже критиковали за восприимчивость к таким атакам. CCI добавляет в схему маскировку: вместо легко читаемого вредоносного текста странице достаточно убедить агента выполнить расшифровку в доступной ему среде.
Исследователь Adversa AI Рони Утевски объяснил, что статические защитные механизмы анализируют текст, но не исполняют его. В этом и состоит разница между зашифрованным полезным грузом и простыми кодировками вроде base64: последние модели нередко умеют распознавать и декодировать без внешних действий, а криптографическая схема подталкивает агента к запуску Python и работе с данными на машине пользователя.
Но у атаки есть важное ограничение: её успех зависит от выбранной модели. По данным Adversa AI, GitHub Copilot CLI может работать либо с mai-code-1.1-flash от Microsoft, либо с одной из двух моделей OpenAI GPT-5.6. Обе протестированные модели OpenAI отказались выполнять вредоносную нагрузку. Mai-code-1.1-flash, напротив, прошла всю цепочку в половине попыток.
Проблема в том, что разработчик не всегда контролирует этот выбор. На платном аккаунте, который тестировали исследователи, уязвимую модель пришлось выбирать вручную. Однако при автоматическом выборе маршрутизатор в отдельных сессиях назначал её сам, а в других выбирал безопасную модель. Пользователь при этом не видел, какая именно модель обработала запрос. Получается своеобразная лотерея: один и тот же запрос к одному и тому же инструменту может быть безопасным утром и опасным после обеда.
Почему GitHub не считает это багом
Adversa AI сообщила о находке через bug bounty GitHub 17 сентября 2026 года. Команда триажа подтвердила воспроизводимость, но не признала сценарий уязвимостью продукта. В комментарии The Register представитель GitHub указал, что пользователь должен намеренно отправить Copilot CLI на контролируемый атакующим или недоверенный ресурс и подтвердить выполнение действия. С точки зрения компании, это означает согласие пользователя на последствия, хотя GitHub и заявляет о готовности улучшать продукт.
У исследователей противоположная позиция: цепочка продолжает работать, а подтверждение действия не равно осознанному согласию на чтение секретов и их отправку. Этот спор важнее формального статуса в bug bounty. Агентные IDE и CLI всё чаще умеют читать файлы, запускать команды, обращаться к сети и менять код. Каждое отдельное разрешение может выглядеть ожидаемым, но их комбинация превращает страницу с «инструкцией для помощника» в способ управлять рабочей средой.
Для российских команд практический вывод довольно приземлённый. Режим autopilot не стоит включать в каталогах, где доступны production-токены, ключи облачных провайдеров, SSH-материалы или реальные .env-файлы. Лучше работать с отдельным тестовым окружением и минимальным набором переменных, а сетевые действия агента подтверждать вручную. Не менее важно закрепить конкретную модель там, где сервис это позволяет: автоматический роутинг делает оценку риска непредсказуемой.
Уязвимость GitHub Copilot CLI показывает, что защита агентных инструментов нельзя сводить к предупреждению «не открывайте подозрительные ссылки». В реальной разработке агенту регулярно дают читать внешние страницы и запускать код. Следующий этап для поставщиков таких систем — научиться отделять полезную автоматизацию от инструкций, которые пытаются незаметно расширить доступ к локальным данным; пока же ответственность за этот разрыв в основном остаётся на пользователе.