Всего за 20 минут злоумышленники превратили точечный удар в масштабное заражение.
Совсем недавно мы писали о компрометации популярного инструмента «tj-actions/changed-files» в GitHub Actions, использовавшегося во множестве CI/CD-процессов. Уязвимость CVE-2025-30066 с оценкой 8.6 по шкале CVSS допускала утечку секретов из репозиториев, где выполнялся заражённый код.
На первый взгляд всё это выглядело как масштабная атака на цепочку поставок с неясным вектором и мотивацией. Однако теперь выяснилось, что исходной целью атаки был вовсе не случайный набор репозиториев, а конкретный проект с открытым кодом, принадлежащий криптовалютной платформе Coinbase.
Исследователи из Unit 42 рассказали , что вредоносный код изначально был встроен в CI/CD-пайплайн проекта agentkit, предположительно с целью дальнейшего распространения или компрометации. Это было точечное и технически сложное проникновение, рассчитанное на то, чтобы незаметно использовать инфраструктуру Coinbase.
Злоумышленник действовал через цепочку зависимостей: изначально была заражена GitHub Action «reviewdog/action-setup» (CVE-2025-30154), на которую опирается «tj-actions/eslint-changed-files», а уже через неё — само действие «tj-actions/changed-files». Таким способом атакующий получил персональный токен доступа (PAT), позволяющий вносить изменения в Action-репозиторий и распространять вредоносную версию дальше. Таким образом была создана скрытая цепочка заражения, при которой каждое обновление зависимости могло привести к утечке данных.
Кульминацией стало то, что заражённый код начал попадать в десятки других репозиториев, использующих «tj-actions/changed-files». Всего, по подсчётам Endor Labs, секреты утекли из 218 репозиториев. В числе утекших данных — учётные записи от AWS, DockerHub, npm и токены доступа GitHub.
Хотя фактическое число пострадавших оказалось меньше ожидаемого , инцидент вызвал серьёзное беспокойство из-за потенциального масштаба угрозы: десятки тысяч проектов используют заражённое действие в своей автоматизации.
Важно, что на каждом этапе атаки применялись разные полезные нагрузки. Если в массовом заражении код просто выводил содержимое переменных окружения в логи, то в случае с Coinbase он был более избирательным — выполнялся только в репозиториях, принадлежащих конкретной организации, и извлекал лишь определённые токены. Это говорит о высокой технической подготовке злоумышленника и его понимании специфики CI/CD-инфраструктур.
Следы ведут к анонимным аккаунтам на GitHub, в том числе «iLrmKCu86tjwp8», которые создавали форки проектов Coinbase, вносили скрытые изменения в файлы конфигурации и отправляли pull-запросы с заражёнными зависимостями.
Предположительно, использовались так называемые «висячие коммиты» — техника, при которой вредоносные изменения сохраняются в ветке форка, но не сразу видны в основной репозитории. GitHub пока не подтвердил, как именно хакерам удалось получить доступ к организации reviewdog, но отметил, что атака не затронула инфраструктуру самой платформы.
По мнению исследователей, изначальная цель — кража криптовалют или доступ к кошелькам Coinbase. Однако после того, как атака была обнаружена и пресечена, злоумышленник, опасаясь потери доступа, резко расширил масштаб — массовое заражение началось всего через 20 минут после того, как Coinbase устранил уязвимость в своих проектах.
Криптобиржа сообщила, что по состоянию на 19 марта все последствия атаки были устранены, но инцидент стал тревожным напоминанием о том, насколько уязвимыми могут быть даже хорошо защищённые Open Source проекты, если в цепочке сборки появляется заражённая зависимость.