
Что произошло
В июне 2025 года Омер Майраз (Omer Mayraz) из Legit Security сообщил о проблеме через программу HackerOne. В доказательстве концепции ему удалось извлечь ключи AWS, токены и описание неопубликованной уязвимости из приватного репозитория. 14 августа 2025 года GitHub закрыл канал утечки, отключив рендеринг изображений в Copilot Chat. Публичное описание под названием CamoLeak вышло 8 октября 2025 года. Сообщений о реальных жертвах нет, речь идёт о продемонстрированной уязвимости.
Где нарушилась защита
Copilot Chat читает содержимое pull request, включая разметку, которая не отображается в веб-интерфейсе GitHub, и работает с правами пользователя, задавшего вопрос. Скрытый в комментарии текст попадал в контекст модели как инструкция, и ассистент выполнял поиск по приватным репозиториям жертвы. Для вывода данных использовался собственный прокси изображений GitHub (Camo): трафик выглядел как обычная загрузка картинок через доверенную инфраструктуру и не блокировался политикой безопасности контента. Граница доверия нарушалась там, где контент от постороннего автора получал полномочия владельца репозитория.
Последствия
- В доказательстве концепции извлечены секреты (ключи AWS, токены), фрагменты приватного кода и описание неопубликованной уязвимости
- Атакующему достаточно было открыть pull request в репозиторий, с которым работает жертва
- Оценка исследователей по CVSS 9.6; подтверждённых случаев эксплуатации нет
Реакция
GitHub 14 августа 2025 года отключил отображение изображений в Copilot Chat и заблокировал использование Camo для утечки содержимого; публичное раскрытие состоялось 8 октября 2025 года.
Уроки для бизнеса
- Ассистент программиста действует с правами разработчика, поэтому любой текст из чужого pull request или issue становится вектором атаки на приватный код
- Доверенная инфраструктура самой платформы может стать каналом утечки, который не видят стандартные фильтры
- Секреты в репозиториях остаются главным призом для таких атак, даже если репозиторий приватный
Меры, которые предотвратили бы инцидент
- Не хранить секреты в коде и репозиториях, использовать хранилища секретов и автоматическое сканирование
- Ограничить доступ AI-ассистента только к репозиториям, нужным для текущей задачи
- Отключать или фильтровать внешние изображения и ссылки в ответах ассистентов
- Внимательно проверять pull request от внешних участников, включая скрытую разметку