В npm найден пакет-двойник, скрывавший кроссплатформенную программу удалённого доступа

Атака на цепочку поставок NPM

В июне 2026 года в реестре программных модулей npm появился пакет ulid-xyz. Он подражает библиотеке ulidx, предназначенной для генерации сортируемых уникальных идентификаторов. Вместо полезного кода пакет содержал вредоносную программу удалённого доступа.

Описание

Установка модуля сопровождалась выполнением скрытой команды. Внешне она напоминала проверку наличия файла сборки, но на деле запускала приложенный к пакету код объёмом 467 КБ. Размер самого пакета вырос с 64 КБ до 536 КБ после добавления этой нагрузки, что стало заметным признаком подмены.

Анализ SafeDep показал, что заражение проходило по цепочке из трёх пакетов. Всё начинается с ioredis-xyz, клона популярного клиента для работы с базой данных Redis. Архив содержит почти те же файлы, что и оригинал, за исключением файла описания. Поэтому подделку трудно отличить от настоящего модуля. Один из выпусков ioredis-xyz дополнительно указывал на компонент redis-type-xyz, хотя в коде этот компонент никогда не использовался. Однако система установки всё равно загружала указанный дополнительный пакет.

Промежуточный компонент redis-type-xyz был устроен так, чтобы не привлекать внимания. В нём не было исполняемого кода, только служебное описание и сведения о зависимостях. Когда вышла очередная версия, в списке зависимостей появился пакет ulid-xyz. Именно он содержал вредоносную программу. Такая конструкция позволяет прятать настоящее содержимое за безобидным именем, которое легко перепутать с известной библиотекой.

Важная деталь - время публикации. Сначала пакет ioredis-xyz вышел без вредоносной нагрузки. Через 19 минут злоумышленник опубликовал новую версию промежуточного пакета, которая уже ссылалась на ulid-xyz. Основной пакет при этом не переиздавался. Разработчик, проверивший его содержимое в день релиза, не увидел бы ничего опасного. Цепочка стала угрожающей только после появления новой версии компонента на уровень ниже, где обычно никто не ищет вредоносный код.

Для распространения подделки использовались 28 репозиториев на GitHub. Это не взломанные чужие проекты, а специально созданные хранилища. Их названия имитируют инструменты для финансовых консультаций, торговли акциями, ставок на спорт, создания сайтов и работы с искусственным интеллектом. В каждом из репозиториев была указана зависимость от ioredis-xyz, поэтому после установки проекта троян попадал на компьютер разработчика.

Вредоносная программа умела обходить аналитические системы. При запуске она проверяет количество ядер процессора. Если их меньше четырёх, работа прекращается. Такой приём спасает её от исследовательских стендов и сборочных серверов. На обычных пользовательских компьютерах с достаточным числом ядер троян продолжает действовать и связывается с внешним управляющим сервером по постоянному сетевому каналу.

Затем вредоносный код закрепляется в системе под именем MicrosoftSystem64. Это название уже встречалось в мае 2026 года, когда SafeDep анализировал другого вредоносного бота, распространявшегося через отдельные пакеты в npm. Тот образец похищал сохранённые пароли браузеров, данные более чем восьмидесяти расширений криптовалютных кошельков, сессии мессенджера Telegram и ключи для удалённого доступа к серверам.

Сходство не ограничивалось именем. В обоих случаях были одинаковыми способ закрепления в Windows, macOS и Linux, хостинг-провайдер управляющих серверов и ряд деталей сетевого взаимодействия. Кроме того, псевдоним, связанный с майской кампанией, принадлежал владельцу двух репозиториев из списка. Такое пересечение указывает на одну и ту же группировку. По оценкам ряда исследователей, она связана с КНДР и известна как FAMOUS CHOLLIMA или Contagious Interview.

Возможности самой первой ступени ограничены. Программа собирает сведения об устройстве, позволяет удалённо просматривать диски и папки, принимать файлы и запускать их, а также удалять себя. Пароли и данные кошельков она напрямую не крадёт. Оператор сначала изучает заражённую машину, а затем выбирает, какой дополнительный код на неё отправить. Троян способен принять такой код, сохранить его и запустить. Вторая ступень, судя по всему, должна была выполнять основную кражу данных.

В опубликованных архивах этих пакетов вторая стадия не обнаружена. Поэтому нельзя утверждать, что именно получили конкретные жертвы. Судя по связям с прежней кампанией, конечной целью были пароли, содержимое криптовалютных кошельков и другие чувствительные данные пользователей.

Разработчикам стоит помнить, что вредоносный пакет не обязательно бывает единственным и прямым компонентом. Иногда он спрятан за несколькими слоями дополнительных зависимостей. Перед установкой полезно проверить, какие модули подтянет проект и совпадает ли имя каждого из них с официальной страницей библиотеки. Особую осторожность следует проявлять при работе с репозиториями, которые предлагают готовые торговые или инвестиционные алгоритмы.

Цепочка оставалась в каталоге до её обнаружения. Пакет ulid-xyz удалили из npm только в конце августа, спустя два месяца после начала кампании. За несколько часов до удаления в одном из скопированных репозиториев торгового бота снова была добавлена зависимость от начального вредоносного пакета. Это говорит о том, что злоумышленники продолжали использовать схему до последнего момента.

Индикаторы компрометации

URL

  • http://65.21.30.171:8010
  • http://95.216.232.162:8010

WebSocket

ws://65.21.30.171:8010

ws://95.216.232.162:8010

Entry package

  • ioredis-xyz@5.11.2

Relay package

  • redis-type-xyz@1.10.6
  • redis-type-xyz@2.1.1

Payload package

  • ulid-xyz@2.12.2
  • ulid-xyz@2.12.3

SHA256

  • 3a9089e9db3650dd6d1584fae709022002dc34854b961abfb014a90f0a7c6a50
  • a3c28435295fed4babdeefedcefdd0ed037ff24ed3ff363a49d080c2768d07f2
  • aa01a83c7a420c22a719b02ec327451ddd751ab5b189fd0127824ea43533b96a

Комментарии: 0