Исследователи Socket сообщили о расширении кампании PolinRider: злоумышленники заражают легитимные репозитории и пакеты с открытым кодом, которыми пользуются разработчики. На момент публикации найдено 162 вредоносных релизных артефакта в 108 уникальных пакетах и расширениях. Среди них — следы компрометации в 80 Go-модулях, 10 пакетах Packagist и одном расширении Chrome. Кампания также затрагивает npm-экосистему.

SecurityWeek связывает PolinRider с более широкой активностью Contagious Interview / Famous Chollima. Эта группа уже несколько лет охотится на разработчиков через фальшивые собеседования, поддельные проекты и вредоносные репозитории. В новом витке атаки фокус сместился на цепочку поставки ПО: злоумышленники получают доступ к аккаунтам сопровождающих проектов, меняют код в настоящих репозиториях и публикуют заражённые версии пакетов.
Разработчик ставит пакет, открывает папку проекта в редакторе, запускает сборку или просто доверяет истории коммитов. Внутри уже может лежать замаскированный JavaScript-загрузчик. Его задача — сходить за следующей стадией вредоносного кода и запустить её на машине жертвы.
Атака использует доверие к нормальным проектам. Речь идёт о захваченных аккаунтах и легитимных репозиториях. В одном из эпизодов исследователи выделили GitHub-аккаунт Xpos587: несколько поддерживаемых им репозиториев были изменены в узком временном окне 23 июня, что похоже на массовое изменение на уровне аккаунта, а не на обычную работу мейнтейнера.

Атакующие позаботились о маскировке. В ряде случаев они переписывали историю Git через force push и делали вредоносные изменения «старыми» на вид. Главная страница репозитория могла выглядеть спокойно: будто файл давно лежит в проекте, а последние изменения были обычным обслуживанием. Следы всплывали уже в журнале активности GitHub, где видно переписывание истории.

Вторая уловка — прятать код в местах, куда редко смотрят. Socket описывает два основных варианта: вредоносный JavaScript внутри конфигурационных файлов вроде vite.config.js, eslint.config.js или других *config.js, а также загрузчик, спрятанный в поддельных файлах шрифтов .woff2. В последнем случае выполнение запускалось через задачи VS Code: файл .vscode/tasks.json мог автоматически выполнить «шрифт» через Node.js при открытии папки проекта.
В результате, файл выглядит как статический ресурс, но редактор кода получает инструкцию запустить его как программу. Разработчик открывает проект, среда разработки сама поднимает задачу, а вредоносный код уже работает на машине, где часто лежат токены GitHub, ключи npm, доступы к облакам, SSH-ключи, переменные окружения, доступы к CI/CD и секреты для Kubernetes.
После расшифровки загрузчик обращался к блокчейн- и публичной RPC-инфраструктуре TRON, Aptos и BNB Smart Chain, получал зашифрованную следующую стадию, расшифровывал её через XOR-ключи и выполнял через eval().
Наблюдаемые полезные нагрузки — DEV#POPPER и OmniStealer. DEV#POPPER — троян удалённого доступа: он помогает злоумышленнику выполнять команды и удерживать контроль над заражённой системой. OmniStealer — похититель данных: такой класс вредоносов вытаскивает токены, пароли, данные браузеров, кошельки и другую информацию, которую затем можно использовать для дальнейшего взлома.
eSentire ещё в марте разбирала похожую цепочку с DEV#POPPER и OmniStealer. В том случае начальная точка выглядела как GitHub-репозиторий ShoeVista, замаскированный под проект интернет-магазина. Запуск фронтенда активировал скрытый Node.js-бэкдор в tailwind.config.js, дальше шли несколько стадий, а код DEV#POPPER доставался через данные блокчейн-транзакций. Компания отмечала, что цель таких атак — не только криптокошельки, но и доступы к исходному коду, API-ключи, пароли и токены облачной инфраструктуры.
У вредоноса есть защита от анализа. В разборе eSentire описаны проверки окружения, попытки сломать отладку, зацикливание при «красивом» форматировании кода, проверка процессов и признаки запуска в облаках, контейнерах, CI/CD и песочницах. Среди окружений, которые вредонос пытался распознавать, перечислены AWS, Azure, GCP, Vercel, GitHub Actions, CircleCI, Jenkins, Docker, Kubernetes, BuildKit, Codespaces и devcontainers.
MITRE ATT&CK отслеживает Contagious Interview как северокорейскую группу активности G1052, действующую с 2023 года. В карточке указаны атаки на Windows, Linux и macOS, фокус на разработчиках и криптовалютной сфере, кража пользовательских учетных данных и криптоактивов, а также использование GitHub, фальшивых вакансий, соцсетей и вредоносных пакетов.
Socket рекомендует проводить восстановление с чистой машины, а не с потенциально заражённого устройства. Командам, которые ставили затронутые версии пакетов или расширений, советуют сохранить артефакты для расследования, найти все рабочие станции разработчиков с установкой таких пакетов, откатиться к заведомо чистым lock-файлам и перевыпустить секреты GitHub, npm, PyPI, RubyGems, Docker, Kubernetes, SSH, Vault, облаков, Slack, Twilio и CI/CD.
Отдельно стоит проверить задачи VS Code с параметром "runOn": "folderOpen", команды, которые запускают файлы с нетипичными расширениями через Node.js, изменения в .vscode/tasks.json, vite.config.js, eslint.config.js, config.js, а также странные файлы в каталогах со шрифтами и статическими ресурсами. Видимая история коммитов уже не считается достаточной проверкой: при PolinRider атакующие переписывали историю так, чтобы вредоносные вставки выглядели старше и спокойнее.
Есть новость? Станьте автором.
Мы сотрудничаем с независимыми исследователями и специалистами по кибербезопасности. Отправьте нам новость или предложите статью на рассмотрение редакции.