Десять сопровождающих 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. Единственная надёжная защита - проверка не только имён пакетов и их метаданных, но и полного графа транзитивных зависимостей, а также мониторинг любых вызовов внешних ресурсов на этапе установки.

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

Domain

  • data-stream.space
  • log-prettier.store
  • logstream-api.online
  • log-taker.store
  • ogstream-api.online
  • pm-trading-dev-tools-be.vercel.app
  • polymarket-clob-service.vercel.app
  • trabalhos-flax.vercel.app
  • vercel-backend-green-five.vercel.app
  • vercel-backend-myapp.vercel.app
  • zscdao.help

Package

  • bn-lint 3.0.8
  • clob-client-math 1.0.0
  • clob-client-math 1.0.1
  • console-fmt-cli 2.9.0
  • data-parser-utils 3.0.2
  • decimal-format-core 3.5.2
  • decimal-format-utils 1.0.0
  • kelly-stake 3.5.2
  • kelly-stake 3.5.3
  • kelly-stake 3.5.4
  • kelly-stake 3.5.5
  • kelly-stake 3.5.6
  • logfmt-core 3.5.2
  • log-taker 0.1.0
  • log-taker1 0.1.0
  • poly-kelly 3.5.2
  • poly-kelly 3.5.3
  • polymarket-clob-maths 2.3.9
  • polymarket-clob-maths 3.3.9
  • polymarket-stake-math 3.5.0
  • polymarket-stake-math 3.5.1
  • polymarket-stake-maths 3.5.2
  • polymarket-trading-developer-tools 0.1.0
  • polymarket-trading-developer-tools 0.1.1
  • rainbokit 0.0.8
  • rainbownkit 0.0.8
  • stake-math 3.5.2
  • stake-math 3.5.3
  • stake-math 3.5.4
  • therdweb 0.0.8
  • thidweb 0.0.8
  • thirdwb 0.0.8
  • thirdwebb 0.0.8
  • thirdwebjs 0.0.8
  • thurdweb 0.0.8
  • ts-bn-lint 3.1.19
  • ts-bn-lint 5.8.0
  • ts-bn-lint-helper 3.1.19
  • ts-bn-proto 5.8.1
  • ts-escro 0.0.9
  • ts-escrow 0.1.0
  • ts-precision 3.7.2

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