Socket нашла 162 вредоносных артефакта в кампании, которую связывают с северокорейским кластером Contagious Interview.
Атака PolinRider уже не выглядит как точечная история про вредоносные npm-пакеты. Исследователи Socket нашли 162 вредоносных релизных артефакта в 108 пакетах и расширениях, а следы кампании теперь ведут сразу в несколько экосистем открытого кода, включая npm, Packagist, Go modules и расширения Chrome. Активность связывают с северокорейским кластером Contagious Interview, также известным как Famous Chollima.
Главная цель кампании не изменилась. Злоумышленники бьют по разработчикам, потому что рабочая машина программиста часто хранит доступы к репозиториям, пакетным реестрам, облакам, CI/CD и внутренним сервисам. Один зараженный пакет может открыть дорогу не только к ноутбуку жертвы, но и к цепочке поставки, через которую код попадет к другим пользователям.
По данным Socket, PolinRider вышла за пределы npm и затронула 80 Go-модулей, 10 пакетов Packagist и одно расширение Chrome. Исследователи считают кампанию активной и ожидают появления новых зараженных пакетов, поскольку атакующие продолжают взламывать аккаунты мейнтейнеров, менять легитимные репозитории и публиковать зараженные версии там, где получают доступ к реестрам.
Техника атаки строится вокруг одного приема. Взломщики добавляют в нормальные проекты запутанный JavaScript-загрузчик, а затем прячут вредоносный код так, чтобы беглый просмотр репозитория ничего не показал. В старых вариантах PolinRider код часто маскировали в конфигурационных файлах, включая config.js, vite.config.js и похожие файлы. В новых случаях загрузчик прячут в поддельных .woff2 файлах, которые выглядят как обычные шрифты.
Запуск вредоносного кода тоже маскируют под нормальную работу инструментов разработчика. В одном из вариантов файл .vscode/tasks.json содержит скрытую задачу, которая стартует при открытии папки в VS Code и запускает поддельный файл шрифта через Node.js. Разработчик может открыть проект для проверки или доработки и сам запустить вредоносную цепочку, не устанавливая отдельную программу.
Socket также описывает случаи, где атакующие переписывали историю Git. Force push и датированные задним числом коммиты помогали сделать вредоносные изменения похожими на старые и безобидные правки. Обычная страница GitHub в такой ситуации может выглядеть чисто, а признаки взлома остаются в журнале активности, метаданных релизов и подозрительных изменениях конфигурации.
Один из заметных примеров связан с аккаунтом Xpos587. Несколько репозиториев под этим аккаунтом изменили в узком временном окне 23 июня в 10:00 UTC. Socket считает такой синхронный всплеск нетипичным для обычной работы мейнтейнера и связывает картину с компрометацией аккаунта. После изменения репозиториев вредоносные версии затронутых Go-модулей попали в пакетную экосистему.
Еще одна ветка кампании затронула Packagist и namespace sevenspan, связанный с GitHub-организацией 7span. Мейнтейнеры нашли часть заражения и удалили фальшивые .woff2 файлы, но зачистка не закрыла все следы. В некоторых репозиториях остался запутанный JavaScript, спрятанный в конфигурационных файлах. Такой случай показывает риск частичной реакции, когда команда убирает один способ маскировки, но пропускает другой.
После распаковки загрузчик PolinRider обращается к блокчейн-инфраструктуре и публичным RPC-сервисам, включая TRON, Aptos и BNB Smart Chain, получает зашифрованный второй этап, расшифровывает данные встроенными XOR-ключами и запускает результат через eval(). Среди уже замеченных полезных нагрузок Socket называет DEV#POPPER и OmniStealer. Такие инструменты могут красть учетные данные, данные браузера, криптокошельки и выполнять команды, но сама схема с загрузчиком позволяет заменить полезную нагрузку в будущих атаках.
Командам, которые ставили затронутые версии пакетов или расширений, Socket советует считать рабочую среду потенциально скомпрометированной до проверки. Разработчикам нужно искать подозрительные задачи VS Code с запуском при открытии папки, команды, которые исполняют файлы с нетипичными расширениями, неожиданные правки .vscode/tasks.json, vite.config.js, eslint.config.js, конфигурационных файлов и каталогов со статическими ресурсами. Секреты npm, GitHub, PyPI, RubyGems, облаков, CI/CD, SSH, Kubernetes, Docker, Vault и других сервисов безопаснее менять с чистой машины, а не с хоста, где мог запускаться зараженный пакет.
PolinRider опасна не только числом найденных артефактов. Кампания показывает, насколько хрупкой стала доверенная цепочка вокруг открытого кода. Разработчик видит знакомый репозиторий, нормальную историю коммитов и привычные конфиги, но за такой витриной может скрываться загрузчик, который включается в момент открытия проекта.