Два взломанных аккаунта — сотни заражённых проектов: GhostAction вернулся на GitHub и роется в истории кода

9606
Два взломанных аккаунта — сотни заражённых проектов: GhostAction вернулся на GitHub и роется в истории кода

Вредоносный сценарий загружает полную историю Git и ищет забытые токены во всех ветках и тегах.

image

Операторы GhostAction взломали аккаунты двух разработчиков GitHub и за несколько часов внедрили вредоносные сценарии как минимум в 345 репозиториев. Сценарии крали токены и ключи из GitHub Actions, а новая версия заодно прочесывала всю историю проекта, поэтому под угрозу попали даже учетные данные, которые разработчики давно удалили из текущего кода.

Атака прошла двумя быстрыми волнами 8 октября. Сначала преступники использовали аккаунт разработчика Takashi Kitao и добавили вредоносный файл в 27 репозиториев. Примерно через восемь часов аккаунт Henry Wu отправил тот же сценарий еще в 318 проектов. Вся вторая серия заняла около 16 минут.

Злоумышленникам не приходилось создавать запросы на слияние и ждать проверки кода. Они работали через настоящие аккаунты разработчиков и отправляли изменения прямо в основные ветки. Например, сохраненные права Henry Wu позволили добавить вредоносный файл в uber/athenadriver от имени законного участника проекта.

Вредоносный сценарий получил безобидное имя security-audit.yml и выдавал себя за проверку безопасности. После запуска он забирал секреты GitHub Actions, то есть токены, ключи и другие учетные данные, которыми автоматические задачи пользуются для доступа к внешним сервисам. Затем программа загружала полную историю Git и искала дополнительные ключи в старых изменениях, ветках и тегах.

Такой поиск сильно расширяет возможный ущерб. Если разработчик когда-то случайно добавил API-ключ в репозиторий, а следующим изменением удалил его, строка все равно могла сохраниться в истории Git. GhostAction специально ищет подобные следы. В список целей вошли ключи AWS, токены GitHub и GitLab, учетные данные Google и Firebase, токены Slack и SendGrid, а также API-ключи Anthropic, OpenAI и OpenRouter.

Найденные сведения сценарий отправлял обычным HTTP-запросом на IP-адрес 193.32.204.199. Журнал запуска uber/athenadriver подтверждает, что сервер злоумышленников принял отправку через четыре секунды после начала выполнения. Сам факт передачи еще не показывает, сколько пригодных ключей находилось в конкретном репозитории, но подтверждает, что вредоносный код успешно отработал.

В проекте pyxel сценарий запускался пять раз. Три запуска вызвали изменения, которые преступник отправил через захваченный аккаунт, еще два злоумышленник запустил вручную. Среди целей находились учетные данные для публикации пакетов в PyPI и crates.io и персональный токен GitHub. На момент анализа исследователи не нашли вредоносных выпусков пакетов, опубликованных с помощью похищенных ключей.

К 9 октября поиск по GitHub находил вредоносный сценарий в основных ветках 378 репозиториев. Число не показывает полный масштаб кампании: поиск не учитывает часть форков, а владельцы зараженных проектов постепенно удаляют вредоносные файлы. Поэтому исследователи продолжают уточнять количество пострадавших.

GhostAction работает не первый год и относится к атакам на цепочку поставок, где доступ к разработчику помогает добраться до кода, сборочной инфраструктуры и учетных данных проекта. В сентябре 2025 года преступники добрались до 817 репозиториев и похитили как минимум 3325 секретов. Новая активность не ограничилась октябрьской волной: с 31 августа по 30 сентября 2026 года исследователи нашли 772 репозитория, куда злоумышленники добавили предыдущую версию вредоносного сценария.

Как преступники первоначально получают контроль над аккаунтами разработчиков, пока точно не установлено. Исследователи допускают использование ранее украденных токенов доступа или учетных данных из баз, собранных похитителями паролей, но прямых доказательств конкретного способа взлома для нынешней волны нет.

Владельцам затронутых проектов советуют удалить вредоносные сценарии из всех веток, проверить историю запусков GitHub Actions и отозвать учетные данные, которые позволили преступникам войти в аккаунт. Одной замены текущих секретов теперь недостаточно: если ключ когда-либо попадал в историю репозитория, его тоже следует считать скомпрометированным и заменить.