
Техническое досье на атаку на цепочку поставок PolinRider, связанную с КНДР, с описанием внедрения обфусцированного JS-пейлоада, манипуляций с историей git, инфраструктуры C2 и рекомендаций по устранению последствий для 1 951 скомпрометированного репозитория.

Команда OpenSourceMalware обнаружила масштабную угрозу, которая внедряет вредоносное ПО в репозитории пользователей и организаций GitHub. Злоумышленник PolinRider внедрил вредоносные обфусцированные JavaScript-нагрузки в сотни публичных репозиториев GitHub, принадлежащих сотням уникальных владельцев. Используйте тег #polinrider, чтобы увидеть все отчеты об угрозах, связанные с этой кампанией, и перейдите в конец этой статьи для списка скомпрометированных репозиториев, включая те, которые мы рекомендуем приоритетно обработать. Имейте в виду, что тег — лучший способ получить актуальные данные.
JavaScript-нагрузка добавляется в конец реальных конфигурационных файлов проектов — незаметно, после легитимного содержимого файла — что легко пропустить при обычном обзоре кода. Основным вектором заражения, по-видимому, является скомпрометированный npm-пакет, который выполняется во время установки или сборки и внедряется в конфигурационные файлы в корне проекта. Что еще хуже, этот злоумышленник использовал ту же технику для создания вредоносных NPM-пакетов.
Эта атака оказалась чрезвычайно успешной: один скомпрометированный проект с открытым исходным кодом, Neutralinojs, распространил вредоносное ПО на сотни своих пользователей и участников. Neutralinojs — очень популярный проект с 8400 звездами, 495 форками и десятками активных участников. В этом и заключается сила такого типа атак: угроза не ограничивается только первоначальными репозиториями GitHub, но распространяется на все остальные проекты, использующие этот открытый исходный код.
Команда OpenSourceMalware приписала эту кампанию КНДР, а злоумышленник PolinRider — известный участник группировки Lazarus, связанный с кампаниями "Contagious Interview" и "TasksJacker".
Эта кампания значительно выросла с момента первой публикации. По состоянию на 2026-04-11 команда OSM подтвердила 1,951 публичный репозиторий GitHub, принадлежащий 1,047 уникальным владельцам, скомпрометированным. Это увеличение в 2,9 раза за пять недель с даты первой публикации (8 марта: 675 репозиториев / 352 владельца).
| Метрика | 8 марта (начально) | 11 апреля (последнее) | Δ |
|---|---|---|---|
| Уникальных зараженных репозиториев | 675 | 1,951 | +1,276 |
| Уникальных затронутых владельцев | 352 | 1,047 | +695 |
| — Отдельные пользователи | 305 | ~930 | +625 |
| — Организации | 47 | ~117 | +70 |
| Наблюдаемые различные варианты обфускатора | 1 (rmcej%otb%) | 2 (rmcej%otb% + Cot%3t=shtP) | +1 |
| Подтвержденные различные векторы внедрения | 1 (конфигурационный файл) | 4 (конфигурационный файл, .vscode/tasks.json, фальшивый шрифт .woff2, вредоносная зависимость npm) | +3 |
| Задокументированные различные поддомены C2 | 1 (260120.vercel.app) | 6+ (см. C2 Infrastructure) | +5 |
| Известные вооруженные шаблоны для тестовых заданий | 0 | 2+ (ShoeVista, StakingGame) | +2 |

В ходе повторного поиска, начатого 2026-04-10 и продолженного 2026-04-11, команда OSM сделала несколько важных находок:
Кампания более чем удвоилась за 5 недель. Междвижковое перечисление через GitHub Code Search и Sourcegraph (с уточнением за пределами ограничения API в 1000 результатов — см. методологию ниже) обнаружило 1,556 уникальных скомпрометированных репозиториев в нашем v3-мастере в первый день. Второй раунд поиска на второй день добавил еще 215 новых репозиториев через повороты по именам npm-пакетов, повороты по VS Code tasks.json/облачным провайдерам и вновь обнаруженный поддомен C2 default-configuration.vercel.app. После дедупликации с существующим корпусом affected_repos.csv истинный известный масштаб теперь составляет 1,951 уникальный репозиторий жертв / 1,047 уникальных владельцев.
Обнаружен новый вариант. PolinRider изменил все уникальные отпечатки своего обфускатора, сохранив архитектуру. Новый вариант использует сигнатурный маркер Cot%3t=shtP (был rmcej%otb%), начальное значение перемешивания 1111436 (было 2857687), вторичное начальное значение 3896884 (было 2667686) и имя функции декодера MDy (было _$_1e42). Эта смена, по-видимому, является ответной реакцией уклонения на опубликованное правило YARA rmcej_otb_payload. Оба варианта в настоящее время активны в дикой природе. См. New Variant: Cot%3t=shtP ниже.
Злоумышленник повторно заражает предыдущие жертвы. По крайней мере один репозиторий-жертва (HassanHabibTahir/testclient) содержит маркеры ОБОИХ вариантов в разных файлах, что указывает на то, что инструментарий злоумышленника перезапускает атаку на ранее скомпрометированные хосты и внедряет новый обфускатор.
PolinRider и TasksJacker операционно слились. Теперь у нас есть прямые доказательства того, что один и тот же злоумышленник использует как внедрение в конфигурационные файлы, так и вектор заражения через .vscode/tasks.json curl | bash против той же популяции жертв. У 22 из 101 жертвы скрипта распространения temp_auto_push.bat также есть вредоносные файлы .vscode/tasks.json, и были идентифицированы несколько вооруженных шаблонных проектов для тестовых заданий/поддельных собеседований — см. Weaponized Take-Home Templates ниже. OSM объединяет два кластера под обозначением #polinrider в будущем.
Идентифицированы два вооруженных проекта тестовых заданий: ShoeVista (поддельная оценка Tailwind e-commerce, поставляемая с вредоносным tailwindcss-style-animate ^1.1.6 в client/package.json) и StakingGame (поддельный проект блокчейна/автоматизации VS Code, идентифицированный по UUID e9b53a7c-2342-4b15-b02d-bd8b8f6a03f9 в tasks.json). По меньшей мере 46 + 42 разработчика попытались выполнить эти тесты и были скомпрометированы. Часть сценария приманки Contagious Interview.
Обнаружено пять новых поддоменов C2, используемых в нагрузках .vscode/tasks.json вида curl | bash, все размещены на Vercel:
default-configuration.vercel.app (наиболее используемый, ~106 ссылок на жертв)vscode-settings-bootstrap.vercel.appvscode-settings-config.vercel.appvscode-bootstrapper.vercel.appvscode-load-config.vercel.appВсе следуют шаблону https://<sub>.vercel.app/settings/(mac|linux|win)?flag=<N>. Добавлены в раздел C2 Infrastructure.
OSM отправил 821 новый отчет об угрозе за эти два дня поисков, доведя общее количество записей PolinRider в OSM до ~1,700. Разбивка по вариантам для 821 отправки: 591 исходный вариант (rmcej%otb%), 113 только распространение (temp_auto_push.bat), 45 malicious_npm (кластер ShoeVista/devhire), 27 tasksjacker, 1 новый вариант (Cot%3t=shtP), 44 прочие.