Злоумышленник выпустил вредоносную версию npm-пакета через GitHub Actions
9 сентября 2026 года злоумышленник примерно на 105 минут получил несанкционированный доступ к аккаунту разработчика легитимного пакета npm @dforge-core/dforge-mcp. За это время он изменил основную ветку, добавил загрузчик удалённого кода, изменил триггер выпуска, переписал рабочий процесс GitHub Actions для автоматической публикации без участия человека и выпустил версию 0.2.21. Вредоносный релиз оставался доступным 35 минут 38 секунд. Затем разработчик откатил изменения и опубликовал версию 0.2.22.
Происхождение сборки не подтвердило добросовестность изменений
Первоначальный способ получения доступа к аккаунту разработчика не установлен. Предположительно, компрометация произошла через вредоносное расширение для разработчиков или пакет.
Скомпрометированный релиз содержал действительные данные о происхождении npm, созданные через GitHub Actions и доверенную публикацию с использованием OIDC. Аттестация Sigstore точно идентифицировала коммит, контролируемый злоумышленником. Этот случай показывает, что данные о происхождении подтверждают источник сборки, но не целостность или доверенность исходных изменений.
Реестр npm доверял идентификатору репозитория в системе непрерывной интеграции, поэтому злоумышленнику не потребовались отдельные учётные данные для публикации пакета в npm.
Четырёхэтапная цепочка выполнения
Инъектированный полезный код занимал одну строку вблизи конца файла размером 99 КБ и запускал цепочку выполнения из четырёх этапов. Финальный имплант удалял себя с диска сразу после выполнения. Тестирование показало, что все этапы оставались работоспособными в течение пяти дней после отзыва вредоносного релиза.
Связь с кампанией PolinRider
Отдельный полезный груз, обнаруженный в другом репозитории, связывает эту активность с кампанией PolinRider. Кампания ассоциируется с операциями, связанными с КНДР, и с марта 2026 года затрагивала многочисленные репозитории. В отчёте образец идентифицирован как соответствующий PolinRider, однако более широкая атрибуция к Северной Корее основана на предыдущих исследованиях и не получила независимого подтверждения.
Полезный груз добавили к легитимному файлу конфигурации проекта. Он не содержал традиционной инфраструктуры управления, а извлекал данные конфигурации, закодированные в двадцатибайтовом поле получателя транзакции Ethereum, используя опубликованный кошелёк кампании. Канал на основе блокчейна не имеет традиционного домена, хоста или учётной записи, которые можно было бы отключить.
Отчет получен из сервиса CTT Report Hub. Права на отчет принадлежат его владельцу.
Ознакомиться подробнее с отчетом можно по ссылке.



