Кампания Gheist с 15 сентября 2026 года массово использует скомпрометированные токены GitHub. Инструмент добавляет в репозитории рабочий процесс, который печатает хранимые в GitHub секреты в собственный журнал, забирает журнал через API GitHub и удаляет запуск через несколько секунд. Название кампании дал пользовательский агент gheist в запросах к API. В публичных репозиториях запуски остановлены проверкой GitHub, в приватных и корпоративных средах код выполнялся.
Описание
Обнаружено более 13 500 веток, оставленных инструментом в более чем 850 скомпрометированных аккаунтах, от личных проектов до приватных репозиториев корпоративных организаций. По данным Wiz Research, к 24 октября около двух третей затронутых аккаунтов уже недоступны на GitHub, что, вероятно, стало следствием реакции на обращение компании в GitHub. Сама атака продолжается и меняется.
Для каждого репозитория инструмент создаёт ветку с префиксом ci-sync- и шестью случайными символами и добавляет файл рабочего процесса sync-check.yml с сообщением коммита ci: sync config. Коммит не подписан и оформлен от имени владельца токена, а отправка изменений запускает процесс. Маскировка секретов в журналах GitHub срабатывает только при точном совпадении значения, поэтому перекодированный в base32 секрет печатается полностью. Ограничение прав токена задания не закрывает доступ к контексту секретов; при наличии сред развёртывания инструмент перебирает их в матрице заданий и печатает производственные учётные данные. Выгрузка идёт через API самого GitHub, поэтому внешнего домена и исходящего соединения у атаки нет.
С 28 июля 2026 года GitHub придерживает подозрительные запуски в публичных репозиториях до одобрения участником. Все проверенные запуски Gheist в публичных репозиториях, включая вариант с заданием на собственной инфраструктуре, остались в состоянии, требующем одобрения, и полезная нагрузка там не выполнялась. На приватные репозитории и GitHub Enterprise Server этот заслон не распространяется. Журналы аудита GitHub показывают завершённые запуски на ветках с префиксом ci-sync-, удалённые через несколько секунд. CloudTrail фиксирует работу корпоративных рабочих процессов на этих ветках с получением ролей AWS; это подтверждает выполнение кода без одобрения.
У инструмента A суффикс ветки шестнадцатеричный, у инструмента B - по основанию 36; второй вариант через несколько часов после первого запуска 28 сентября добавил тайм-аут задания и матрицу сред. Девятнадцатого октября он добавил строку-разделитель между выгрузками и второе задание для машин на собственной инфраструктуре. Это задание записывает три вспомогательных файла и ищет 31 формат токенов, закрытые ключи, файлы с переменными окружения, состояние Terraform и историю команд. Кроме того, оно проверяет окружение процессов, доступ к сокету Docker, метаданные AWS, GCP и Azure, файлы учётных данных раннеров и токен сервисной учётной записи Kubernetes. Задание работает с ошибками: ищет не тот файл ключа раннера, регулярное выражение для учётных данных в URL сломано, токены GCP и Azure не собираются.
Те же аккаунты фигурируют в других кампаниях. 6 октября 391 аккаунт переименовал около 1 461 репозитория в приманки со взломанным ПО, из-за чего исчезли 610 веток ci-sync. 18 октября 25 аккаунтов за девять минут создали репозитории для запуска Windows RDP Runner ради бесплатных вычислительных ресурсов, а ещё 57 аккаунтов из первой фазы в мае пострадали от Megalodon. 19 и 20 октября три жертвы перезаписали коммиты Gheist, добавив загрузчик в конфигурацию сборки; это связывают с PolinRider, программой, которую приписывают КНДР. Источники учётных данных - журналы инфостилеров (похитителей учётных данных) и токены из утечек при атаках на цепочку поставок, например при компрометации Trivy в марте.
Не установлено, сколько секретов выгружено и использовались ли они; за пределами анализа осталось содержимое журналов и дальнейшая судьба учётных данных. Имена веток и строка gheist в пользовательском агенте воспроизводимы, поэтому совпадение по ним не доказывает работу конкретного инструмента и может давать ложные срабатывания. Gheist отличается от GhostAction: у того другие файлы рабочих процессов и выгрузка на отдельный сервер.