
Вредоносный npm-пакет indexed-btree маскируется под библиотеку для работы с B-деревьями и запускает вредоносный код во время работы приложения. Авторы кампании не используют привычные install-скрипты, поэтому установка зависимости не вызывает подозрений у защитных механизмов, проверяющих этап установки. По оценке исследователей, пакет достиг почти 2 млн еженедельных загрузок.
Как сообщает Checkmarx, indexed-btree имитирует легитимный пакет sorted-btree. В package.json у него нет обработчиков preinstall или postinstall, поэтому сама установка не выполняет вредоносных действий. Загрузка срабатывает позднее, когда программа обращается к основной функции библиотеки.
Загрузчик спрятан в методе BTree.prototype.set, который используется для записи значений в дерево. Код проверяет существование файла sharedLoad.min.js и запускает его через Node.js при определённом значении ключа. Вредоносный компонент находится в обычной логике пакета, а не в сценарии установки.
Файл sharedLoad.min.js обфусцирован: в нём применяются кодирование строк и самопроверка массива. После запуска он собирает сведения о хосте, включая архитектуру ОС, имя устройства, данные о процессоре, памяти и времени работы системы. Эти сведения отправляются в заранее заданные каналы Slack и Telegram.
Для управления вредоносной программой используется смарт-контракт в тестовой сети Ethereum Sepolia. Он хранит адрес для связи с управляющей инфраструктурой и позволяет менять его без замены домена или IP-адреса. Загрузчик также создаёт пару ключей X25519, получает публичный ключ атакующих из контракта и через ECDH выводит AES-ключ для расшифровки второго этапа программы.
Расшифрованная полезная нагрузка хранится в контракте двумя фрагментами. В коде также предусмотрено удаление файлов вредоносной программы и очистка изменений в BTree.prototype.set. Это позволяет операторам убрать следы из заражённого окружения.
Авторы кампании оформили для indexed-btree репозиторий на GitHub с правдоподобной историей коммитов и отдельной учётной записью разработчика. В самом репозитории вредоносного кода нет. Исследователи указывают, что многочисленные коммиты и изображение профиля, сгенерированное ИИ, создают впечатление обычного открытого проекта.
Исследователи связали со схемой ещё девять пакетов, которые позднее удалили. Среди них ordered-kv-index с 448 184 загрузками, btree-leaderboard с 493 685, priority-slot-queue с 402 860, btree-range-store с 468 092 и btree-core с 1 951 274 загрузками.
В этом же перечне оказались btree-time-index с 425 312 загрузками, btree-lru-cache с 372 185, neighbor-key-map с 366 019 и sliding-score-window с 448 024 загрузками. Тот же смарт-контракт исследователи обнаружили и в пакете mutex-forge. На момент публикации Checkmarx оценивал средства, полученные атакующими, в 109 ETH, или примерно 230 933,57 евро.
В indexed-btree вредоносный код активируется не при добавлении пакета в проект, а при вызове его функций. Поэтому проверки во время установки его не затрагивают.