Кампания wfx-loot использовала скомпрометированные аккаунты GitHub, чтобы проверять доступ к репозиториям, а там, где у учетных записей были права на запись, внедрять код для кражи секретов из CI-среды — среды непрерывной интеграции, где запускаются сборки и тесты. По данным Aikido, злоумышленники задействовали 4 837 аккаунтов и открыли пробные pull request’ы в 61 764 репозиториях. Согласно опубликованной оценке компании, вредоносный код выполнился, а учетные данные были похищены как минимум из 1 835 репозиториев.
4
9
Когда началась кампания и сколько она продолжалась?
Активность началась примерно 10 ноября 2026 года в 12:45 UTC. В одном из отчетов период отправки пробных pull request’ов указан до 11 ноября, 15:00 UTC — около 26 часов 15 минут.
6
7 Это наблюдавшийся интервал проверки репозиториев, а не подтверждение того, что после этого прекратились все запуски вредоносной нагрузки или использование уже похищенных учетных данных.
Цифры описывают разные этапы атаки:
- 4 837 аккаунтов были указаны как скомпрометированные.
- 61 764 репозитория получили пробные pull request’ы. Это число проверенных целей, а не репозиториев, где вредоносный код точно запускался.
- Не менее 1 835 репозиториев вошли в опубликованный Aikido подсчет случаев выполнения кода и утечки учетных данных.
9
В некоторых публикациях фигурировала меньшая цифра — 1 806.
6
10 В доступных отчетах расхождение не объясняется, поэтому эти значения следует считать отдельными оценками, а не складывать или представлять как одну подтвержденную цифру. Представленные источники также не подтверждают более позднее утверждение примерно о 1 970 подтвержденных публичных случаях среди более чем 66 000 целей.
Как злоумышленники проверяли доступ
Злоумышленники открывали pull request’ы с заголовком docs: dependency audit notes из веток с названием wfx-docs. Такие запросы служили проверкой: они показывали, может ли скомпрометированный аккаунт вносить изменения в конкретный репозиторий.
3
4
9
Если права позволяли, атакующие внедряли в CI-среду вредоносную нагрузку для кражи секретов. Кампания опиралась на действительные украденные учетные данные, а не на уязвимость GitHub Actions.
4
9 По описанию OX Security, вредоносная программа представляла собой один shell-скрипт примерно на 1 500 строк.
31
В некоторых случаях вредоносные изменения и журналы выполнения удалялись, что затрудняло расследование.
1
6 Доступные данные подтверждают общую схему — проверка доступа, запуск полезной нагрузки и последующая очистка, — но не доказывают, что каждый упомянутый способ внедрения или текст коммита использовался при каждом заражении.
Какие данные пытались похитить
Задокументированная цель — собрать учетные данные, доступные CI-задачам, в том числе секреты GitHub Actions и облачные ключи. В сообщениях также упоминаются попытки получить токены ИИ-сервисов.
3
9 Анализ OX Security перечисляет среди целей учетные данные AWS, Azure и Google Cloud.
31 В отдельных публикациях говорится, что вредоносный код мог искать секреты в памяти процессов на раннере — машине, выполняющей CI-задачи, — однако представленные выдержки не показывают, насколько часто такой поиск был успешен.
17
29
В одном из обзоров также описаны попытки закрепиться в облачных средах с помощью изменений политик доверия AWS и федеративных учетных данных Azure.
5 Это следует считать сообщениями о возможном поведении вредоносной программы, а не доказательством того, что изменения внесли в каждом затронутом репозитории или облачном аккаунте. Данные подтверждают кражу учетных данных, но не доказывают кражу исходного кода или клиентских баз данных.
9
15
Что говорят отдельные признаки — и чего они не доказывают
По одному из сообщений, на момент проверки открытыми оставались 92% из 10 431 пробного pull request’а, отправленного через доступы участников или организаций.
10
19 Это может означать, что многие запросы к тому моменту еще не обработали, но не доказывает, что владельцы репозиториев или специалисты по безопасности их не заметили. Этот процент относится к указанной группе запросов, а не обязательно ко всем pull request’ам кампании.
В руководстве по расследованию также описаны 173 пробных pull request’а от 19 аккаунтов, отправленных с помощью токенов через GitHub App компании Fly.io. Само по себе это не означает, что инфраструктура Fly.io была взломана или что вредоносный код запускался в каждом репозитории, к которому получили доступ через эти токены.
37
Что проверить специалистам по безопасности
При расследовании важно разделять этапы проверка доступа, внедрение кода, выполнение нагрузки и кража учетных данных. Это разные выводы, и один не подтверждает автоматически остальные.
- Ищите признаки пробных запросов. Проверьте pull request’ы с заголовком
docs: dependency audit notes и ветки wfx-docs во всех репозиториях, куда могли вносить изменения ваши аккаунты.
9
- Изучите CI и журналы аудита. Проверьте запуски рабочих процессов, коммиты, активность веток и доступные облачные журналы. Пропуски в нумерации запусков могут быть зацепкой: в сообщениях говорится об удалении запусков и журналов. Но сами по себе такие пропуски не доказывают компрометацию.
1
24
- Отзовите подозрительный доступ. Отзовите возможные скомпрометированные токены GitHub и проверьте доступы аккаунтов, участников и GitHub Apps.
- Смените все потенциально раскрытые секреты. Если вредоносная нагрузка запускалась, считайте потенциально скомпрометированными все секреты и облачные роли, доступные этому CI-процессу, а не только учетные данные, упомянутые в сохранившихся журналах.
3
9
- Проверьте облачные настройки на закрепление. Ищите неожиданные изменения политик доверия AWS, приложений Azure и федеративных учетных данных, а также неизвестные ключи и другие изменения доступа.
5
- Сохраните свидетельства. До очистки сохраните оставшиеся журналы и записи аудита, а затем зафиксируйте, какие именно этапы атаки подтверждаются данными.