Десять сопровождающих npm скоординированно опубликовали 30 вредоносных пакетов для атаки на разработчиков DeFi

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

Группа из десяти учётных записей реестра npm в июне 2026 года запустила масштабную кампанию, нацеленную на разработчиков децентрализованных финансов (DeFi). Участники опубликовали 30 пакетов, имена которых имитируют инструменты для торговой платформы Polymarket и общие математические библиотеки, используемые в DeFi. Операторы использовали общую инфраструктуру управления и командования (C2), строили программы-дропперы по единому шаблону и применили четыре различные техники доставки вредоносной нагрузки. Второй этап атаки - похититель данных на JavaScript объёмом от 2787 до 2887 строк - читает хранилища криптокошельков, учётные данные браузеров, SSH-ключи, токены доступа к облачным сервисам и базы данных менеджеров паролей.

Описание

Атака была направлена на две категории разработчиков. Первая - команды, создающие приложения для протокола Polymarket: названия пакетов содержат префиксы polymarket- и clob-. Вторая - более широкая аудитория DeFi-разработчиков, использующих математические утилиты: среди имён фигурируют kelly-stake, stake-math, bn-lint, ts-precision. Дополнительно один из аккаунтов (rohmat2527) опубликовал кластер опечаточных доменов (typosquatting): пакеты, напоминающие thirdweb (thurdweb, thirdwebjs, thidweb, thirdwebb, therdweb, thirdwb) и rainbowkit (rainbokit, rainbownkit). Любой разработчик, случайно допустивший опечатку при установке этих популярных библиотек, также попадал под действие атаки.

Входной точкой послужил репозиторий на GitHub под названием Trum3it/polymarket-arbitrage-bot. Он описывал бота для арбитража на Polymarket и обещал высокую годовую доходность. В файле package.json значились четыре зависимости, включая легитимный @polymarket/clob-client и вредоносный clob-client-math. Поскольку clob-client-math никогда не импортировался в исходном коде бота, его единственной целью была установка через хук postinstall. Репозиторий появился 20-22 июня 2026 года - в ту же неделю, когда были опубликованы вредоносные пакеты. За несколько дней 53 разработчика сделали форк этого репозитория, и каждый, кто выполнил npm install, запускал похититель.

Предоставленный анализ вредоносных пакетов выявил четыре способа доставки. Девять из десяти аккаунтов использовали технику дроппера: хук postinstall запускал скрипт, который считывал URL командного сервера из поля homepage в package.json (а не из самого скрипта, что обходило сигнатурный поиск). Скрипт загружал конфигурационный JSON, затем - tarball со второй стадией и выполнял вредоносный код. Интересно, что один из дропперов в своих сообщениях об ошибке содержал название другого пакета из кампании - copy-paste ошибка, оставленная оператором.

Вторая техника - прямая встройка. Пакеты ts-bn-lint@3.1.19 и ts-bn-lint-helper@3.1.19 содержали полный код похитителя непосредственно в index.js (около 2800 строк) и запускали его через postinstall. При этом C2-хост был закодирован base64, что затрудняло статический анализ. Третья техника - side-loader. Пакет ts-precision@3.7.2 являлся рабочей обёрткой библиотеки big.js, но в нескольких строках кода между математическими функциями содержал вызов require('data-parser-utils'), который загружал вредоносный пакет-дроппер как транзитивную зависимость. Поскольку вызов происходил при импорте, флаг --ignore-scripts его не блокировал.

Четвёртая техника - самообновление через реестр npm. Пакет decimal-format-utils@1.0.0 не содержал вредоносного кода. Его хук postinstall использовал npm, чтобы скачать версию 1.0.1 с тем же именем, а затем перезаписывал все свои установленные файлы похитителем. Таким образом, сканирование tarball версии 1.0.0 не находило угрозы - payload доставлялся только после установки, и доставщиком служил сам реестр npm.

Вторая стадия - похититель данных, написанный на JavaScript. Он читает зашифрованные файлы хранилищ криптокошельков MetaMask, Phantom, Solflare, OKX Wallet, Coinbase Wallet, TrustWallet, Backpack, TronLink. Также извлекает cookie-файлы и сохранённые пароли браузеров Chrome, Firefox и Brave (с использованием встроенной SQLite-библиотеки), SSH-приватные ключи, учётные данные AWS, токены .npmrc, конфигурацию Docker, ключи GPG и историю командной строки (последние 10 000 строк). Сборщик также сканирует исходные файлы в рабочем каталоге на наличие seed-фраз, приватных ключей и API-токенов. Атака охватывает менеджеры паролей Bitwarden, KeePass и 1Password.

Координация между десятью аккаунтами подтверждается шестью артефактами. Общие C2-хосты: например, polymarket-clob-service.vercel[.]app использовался для пакетов micha.el.g.ebu.rt.u.z и pmtrader, а log-taker[.]store - для rohmat2527 и asdjakldjflkadsjflkajdk. Дроп-код install-check.cjs идентичен во всех пакетах с точностью до байта. Упомянутая copy-paste ошибка дополнительно связывает разных операторов. Пакеты от одного аккаунта polymaster имеют идентичные файлы index.js. Операторы публиковали безвредные версии 2.x-3.x до внедрения payload, чтобы создать историю и обойти инструменты безопасности. Наконец, пакет garir случайно содержал в tarball файл .npmrc.bak с действующим npm-токеном, что указывает на внутреннюю небрежность.

Для разработчиков DeFi последствия этой кампании особенно серьёзны: скомпрометированный рабочий компьютер даёт доступ к ключам от криптокошельков, seed-фразам, токенам CI/CD и учётным записям в npm. Использование техники самообновления ломает традиционную модель безопасности на основе сканирования tarball. Единственная надёжная защита - проверка не только имён пакетов и их метаданных, но и полного графа транзитивных зависимостей, а также мониторинг любых вызовов внешних ресурсов на этапе установки.

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

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