В течение 48 часов в реестре npm опубликовано более 700 вредоносных пакетов. Они маскируются под библиотеки для разработки мобильных приложений, однако при установке загружают на компьютер жертвы программу удалённого доступа и модуль для кражи учётных данных. Атака нацелена на разработчиков, которые используют менеджер пакетов npm в повседневной работе, а также на компании, чьи проекты зависят от открытых зависимостей.
Описание
Названия пакетов сгенерированы автоматически и имитируют имена популярных библиотек с опечатками. Такой приём позволяет обмануть разработчика, который по ошибке указывает в коде похожее имя. Для примера аналитики разобрали пакет, представляющийся мобильным SDK для сервисов оплаты частями. Публичный интерфейс библиотеки содержит методы инициализации, проверки версии и настройки, но ни один из них не выполняет заявленных функций. Вместо этого при импорте пакета активируется скрытый вспомогательный модуль, который сразу запускает вредоносную цепочку.
Внутреннее устройство пакетов, как показал анализ OpenSourceMalware, почти одинаковое для всей кампании. Отличия сводятся к адресам серверов, с которых загружается основная вредоносная нагрузка. Сам процесс заражения начинается в момент вызова команды подключения библиотеки, поэтому установочные скрипты пакету не требуются. Это важный нюанс: многие системы безопасности проверяют только автоматические скрипты, запускаемые при установке, и пропускают угрозу, которая активируется позже - при сборке или запуске приложения.
После активации код определяет операционную систему и архитектуру процессора жертвы. Для каждой платформы предусмотрена своя версия вредоносной нагрузки: отдельные исполняемые файлы для Linux, macOS и Windows. Первичная доставка идёт через несколько промежуточных серверов, размещённых на платформе Cloudflare Workers. Запросы принудительно отправляются по четвёртой версии интернет-протокола и ожидают ответа не дольше пятнадцати секунд. При этом подлинность полученного файла никак не проверяется: нет ни цифровой подписи, ни сверки с эталонной суммой. Любой ответ размером больше тысячи байт считается исполняемым файлом и запускается.
Особый интерес представляет резервный канал доставки. Если все основные серверы недоступны, пакет переключается на домены, принадлежащие злоумышленникам, и выполняет серию DNS-запросов. Вредоносная программа делит исполняемый файл на фрагменты и сохраняет их в текстовых записях DNS. Затем эти записи запрашиваются по порядку, склеиваются и превращаются в бинарный файл. Такой подход позволяет обойти блокировку по спискам доменов и IP-адресов: для защиты достаточно закрыть очевидные HTTPS-хосты, но DNS-канал останется рабочим. Кроме того, подобный трафик выглядит как обычные запросы к системе доменных имён, и стандартные системы мониторинга не всегда обращают на него внимание.
Сохранение и запуск нагрузки тоже продуманы. На Linux и macOS файл записывается в системный временный каталог под именем, начинающимся с точки, что делает его незаметным при обычном просмотре. На Windows используется похожая маскировка: исполняемый файл получает имя, напоминающее служебную диагностическую утилиту. Процесс запускается в фоновом режиме, без привязки к терминалу. Дополнительно создаётся маркерный файл, который предотвращает повторное скачивание в течение шести часов. Это ограничение снижает заметность активности и уменьшает нагрузку на инфраструктуру злоумышленников.
Первая стадия атаки, реализованная на JavaScript, сама по себе не собирает данные и не отправляет их на серверы. Её задача - доставить и запустить второй этап. Финальные вредоносные программы уже выполняют разведку, похищают пароли из браузеров и других приложений, закрепляются в системе и поддерживают связь с командными серверами. Аналитики изучили оба бинарных образца, которые раздавала инфраструктура кампании: один предназначен для Linux, второй - универсальный для macOS, работающий на процессорах Intel и Apple Silicon.
Версия для macOS содержит ещё один уровень загрузки. Она проверяет, не запущена ли система в виртуальной машине, не подключены ли отладчики и инструменты анализа трафика. При обнаружении подозрительных условий исполняемый файл может прекращать работу или скрывать сетевую активность. Затем программа обращается к дополнительным прокси-серверам и скачивает третий компонент, который сохраняется в каталог данных приложения. Для закрепления в системе создаётся элемент автозагрузки, маскирующийся под системный процесс Apple. Этот агент запускается при каждом входе пользователя и автоматически перезапускается, если его работа завершится с ошибкой. Интервалы между попытками перезапуска ограничены одной минутой, чтобы не перегружать систему и не привлекать внимание.
Версия для Linux упакована специальным инструментом сжатия, поэтому её внутренние функции и адреса серверов скрыты. Тем не менее, поскольку она распространяется через ту же вредоносную цепочку, эксперты считают её полностью опасной. Изучение поведения Linux-версии требует распаковки и запуска в изолированной среде, но уже сейчас ясно, что она несёт те же риски: удалённое управление, кража данных и скрытая активность.
Защита от подобных атак требует комплексного подхода. Компаниям стоит регулярно обновлять все зависимости в проектах и проверять новые пакеты на соответствие официальным источникам. Полезно внедрить автоматические сканеры, которые анализируют открытые библиотеки на наличие известных вредоносных сигнатур. Разработчикам следует обращать внимание на странные имена пакетов, содержащие опечатки или случайные символы, а также на библиотеки с избыточными правами доступа. Немаловажно ограничить возможность запуска исполняемых файлов из временных каталогов и настроить контроль целостности системных папок. Наконец, мониторинг DNS-запросов поможет выявить аномальные обращения к текстовым записям, особенно если они связаны с одновременной загрузкой данных с нескольких подозрительных доменов. Обнаружение подобной активности на ранней стадии позволяет предотвратить компрометацию корпоративной сети и утечку конфиденциальной информации.
Индикаторы компрометации
Malicious npm Package
- checkout-mobile-bnpl@35.6.9
Domain
- alertmanager.cloudpayments.ru
- dl.wel1.ru
- ext.dl.wel1.ru
- net.dl.wel1.ru
- nexus.tcsbank.ru
- oob-worker.cf102-baf.workers.dev
- oob-worker.cf103-070.workers.dev
- oob-worker.cf99-9b3.workers.dev
- package-proxy.cf11oobworker.workers.dev
- package-proxy.cf5oobworker.workers.dev
- package-proxy.cf6oobworker.workers.dev
- package-proxy.cf7oobworker.workers.dev
- package-proxy.cf8oobworker.workers.dev
- pkg.dl.wel1.ru
- repo-linux.tcsbank.ru
- sdk.dl.wel1.ru
URL
- https://oob-worker.cf102-baf.workers.dev/pkg/loader_mac
- https://oob-worker.cf102-baf.workers.dev/pkg/package
- https://oob-worker.cf102-baf.workers.dev/pkg/package.exe
- https://oob-worker.cf102-baf.workers.dev/pkg/package-arm64
- https://oob-worker.cf103-070.workers.dev/pkg/loader_mac
- https://oob-worker.cf103-070.workers.dev/pkg/package
- https://oob-worker.cf103-070.workers.dev/pkg/package.exe
- https://oob-worker.cf103-070.workers.dev/pkg/package-arm64
- https://oob-worker.cf99-9b3.workers.dev/pkg/loader_mac
- https://oob-worker.cf99-9b3.workers.dev/pkg/package
- https://oob-worker.cf99-9b3.workers.dev/pkg/package.exe
- https://oob-worker.cf99-9b3.workers.dev/pkg/package-arm64
- https://package-proxy.cf11oobworker.workers.dev:<port>/pkg/beacon_mac.bin
- https://package-proxy.cf5oobworker.workers.dev:<port>/pkg/beacon_mac.bin
- https://package-proxy.cf6oobworker.workers.dev:<port>/pkg/beacon_mac.bin
- https://package-proxy.cf7oobworker.workers.dev:<port>/pkg/beacon_mac.bin
- https://package-proxy.cf8oobworker.workers.dev:<port>/pkg/beacon_mac.bin
SHA256
- 0fc30f82e1fa5e51a6c0c43f3ed7f13592ea731cb331e43a4d085df60a4db8b6
- 7e486657f30594afda379b97030252a09a19fe8055e25c9e371544f59bd8e9e3
- 94ef6b1c4a9d31f78f446d053048bcef34fd88f4376a1a46f7f777a9e9c83a29
- a3e2ffb440b779d30da3ff282affd649731088e8570df7b1aa72742d995b782c
- b74c5675725911c62091bdf40714df760cc2af7a88360d21065f4e1c878aa8f0
- c214746c74cae8ece8bdaf69aa05da4db6ce013f9e77452d1eed1a002fd9ba00
- e2650e9aa2f924433ba422857b22ee7c5996b5ad306f3f903283f6a13e248935