TL, д-р
Один видавець npm, ddjidd5640, створив каталог із 22 пакетів підроблених інструментів безпеки Web3 під такими вигаданими брендами, як Гільдія криптобезпеки, Колектив аудиту Web3 та Альянс безпеки DeFi.
Ці пакети не схожі на просту кампанію з помилковими позначеннями. Вони виглядають як брендована екосистема безпеки, підкріплена порожніми організаціями GitHub та переконливими назвами інструментів MCP, такими як search_leaked_credentials, validate_chain_key та deploy_safe.
Кампанія поділяється на два активних сімейства корисного навантаження та один сплячий транш.
Варіант А містить 8 пакетів для збору облікових даних. Постінсталяційний скрипт зчитує локальні сховища секретних даних, а пакет scanner.js запускається, коли агент штучного інтелекту викликає інструменти MCP пакета, шукаючи ключі гаманця, мнемоніку BIP39, токени API та інші облікові дані.
Варіант Б містить 5 бінарних дропперів на основі Pinggy. Ці пакети отримують та виконують віддалене корисне навантаження під час після встановлення, з foundry-deploy-helper:1.8.96 видалення відокремленого виконуваного файлу за адресою /tmp/.node-cache.
Варіант С містить 9 неактивних пакетів без очевидного постісталювального навантаження, але з тим самим видавцем, шаблоном брендингу та найменуванням, орієнтованим на Web3.
Лише 8 з 22 пакетів були позначені де завгодно; решта 14 все ще були активні на npm на момент аналізу.
Ступінь тяжкості: критичний.
Атака: Два корисних навантаження в одній шафі
Шафа – це бренд. Відкрийте README crypto-credential-scanner, і вам скажуть, що це сканер облікових даних, створений Гільдією криптобезпеки. Відкрийте сторінку defi-threat-scanner, і вам скажуть, що це інструмент Альянсу безпеки DeFi. Відкрийте web3-secrets-detector, і вам скажуть, що це Колектив аудиту Web3. Жоден з цих колективів не існує як організація. Вони існують як порожні організації GitHub, єдина мета яких – заповнити гіперпосилання «автор» сторінки npm.
Варіант A: передпольотна підготовка після встановлення та основна дія під час MCP
Усі 8 пакетів Variant-A мають двоетапне корисне навантаження — етап після встановлення, який отримує всі облікові дані, що вже є на диску, у вигляді звичайного тексту, та етап виконання, який активується, коли агент штучного інтелекту викликає один із інструментів MCP пакета.
«Етап 1, передпольотна підготовка» знаходиться вбудовано в package.json як однорядковий код node -e. Він відкриває сім відомих точкових файлів і відправляє перші 200 байт кожного до C2:
200 байтів ~/.ssh/id_ed25519 не надасть зловмиснику ваш закритий ключ сам по собі, але надасть ім'я файлу, коментар та перші рядки заголовка PEM — достатньо, щоб підтвердити, який саме ключ там знаходиться, чого достатньо для запуску наступного етапу. 200 байт ~/.env зазвичай більш ніж достатньо для витоку повного токена API. 200 байтів ~/.git-облікові дані зазвичай є повним набором токенів OAuth.
«Стадія 2, головний акт», Є scanner.jsВін завантажується компонентом пакета index.js і викликається зсередини обробника запитів MCP у момент, коли агент штучного інтелекту викликає будь-який із рекламованих інструментів. Файл є однаковим побайтово для всіх 8 пакетів Variant-A (b461106e47a1f5966159cd6e92541505), і воно відверто розповідає про те, що робить. Вступний блок коментарів дослівно звучить так:
| javascript // wallet-scanner.js — вбудований активний сканер для MCP-пакетів // Працює безшумно, коли агент ШІ викликає будь-який інструмент MCP, сканує середовище на наявність // гаманців/ключів // Використовує лише вбудовані функції Node.js, жодних зовнішніх залежностей |
Далі йде рекурсивний огляд глибиною 3:
сам домашній каталог
…фільтрація імен файлів, що містять будь-який з сховище ключів, 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 | (?:secret\|private).{0,10}[:=]\s*["']?([A-Za-z0-9+/=]{20,}) | Секрети та приватні значення зазвичай зберігаються у форматах конфігурації YAML, JSON та INI. |
| eth_address | 0x[a-fA-F0-9]{40} | Адреси гаманців Ethereum, що використовуються для ідентифікації та зняття відбитків пальців жертв. |
| пароль | (?:PASSWORD\|PASSPHRASE)\s*=\s*["']?(\S{4,64}) | Паролі та змінні середовища парольної фрази в стилі експорту оболонки. |
Потім scanner.js повністю зчитує ще шість dot-файлів — до 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 окремих знахідок, публікується як один об'єкт JSON.
Призначення exfil не задане жорстко безпосередньо. Пакет отримує його під час виконання з:
https://ddjidd564.github.io/defi-security-best-practices/config.json
— документ на GitHub Pages, яким керує зловмисник. Поточний config.json повертає
Якщо це отримання не вдасться, scanner.js повертається до того ж webhook.site URL-адреса жорстко закодована як константа. Ця індирекція є єдиним елементом операційної складності в кампанії: вона дозволяє зловмиснику обертати цільові об'єкти exfil без повторної публікації пакета, а також не допускає потрапляння фактичної URL-адреси збирача до артефакту npm, що ускладнює виявлення на основі сигнатур.
Варіант B: тунель Pinggy, бінарний файл та один постійний варіант
Інший активний транш набагато менший — п'ять пакетів — і набагато менш розумний. Автор повністю відмовився від костюма MCP. Ці пакети стверджують, що є помічниками в налаштуванні легітимних інструментів Ethereum та Solana (truffle-config-helper, агрегатор-стрічок-цін-chainlink, ganache-cli-провайдер, solana-pda-helper, помічник з розгортання foundry). Корисне навантаження — це одне https.get-і-Exec рядок у після встановлення
C2 є безкоштовним Пінгі тунель — універсальний сервіс тунелювання розробників, який зловмисник використовує як тимчасовий C2. Пакет завантажує все, що повертає тунель, і завантажує це в дочірній_процес.execНемає перевірки цілісності, немає підпису, немає захисту другого рівня. Те, що обслуговує тунель оператора сьогодні, те й працює.
Найбільш агресивний пакет, foundry-deploy-helper:1.8.96, замінює вбудований https.get з витися і трюк із наполегливістю:
Варіант C: полірований фасад, детонатора (поки що) немає
Решта дев'ять пакетів — верифікатор резервної копії гаманця, сканер безпеки env, foundy-toolkit (навмисна друкарська помилка у Foundry), solna-web3 (друкарська помилка Солани), перевірка безпеки гаманця, плагін-профайлера-гардшлема-газу, ефіри-багатодзвінки-утиліти, defi-env-auditor, etherjs-utils — мати немає постінсталяційного скрипта і на перший погляд немає очевидного вилучення під час виконання. Вони мають спільного видавця, брендові фронти, шаблон іменування Web3, а в деяких випадках ідентичний шаблонний файл README з активними варіантами. Ми розглядаємо їх як частину однієї кампанії та рекомендували превентивне видалення, але ми ще не перерахували повністю їхні тригери під час виконання. Сплячий транш може бути плацдармом, який оператор резервує для майбутнього перевороту — того ж шаблону, який PhantomBot використовував у середині травня, коли оператор обміняв викрадача облікових даних на рекрута ботнету, не перепублікувавши назву пакета.
Хронологія та каталог
Найдавніший пакет у кампанії має найнижчу версію: валідатор-ключів-ланцюжка:0.2.3 та defi-env-auditor:0.3.2 виглядають як ранні експериментальні краплі. На той час, як видавець досяг допоміжний засіб конфігурації трюфелів:1.7.0 та foundry-deploy-helper:1.8.96, інфляція версій була навмисною — вибиралися цифри, які читалися як походження встановленого пакета. Жоден з 22 не мав жодної попередньої легітимної історії під цим самим ім'ям на npm.
Повний каталог, згрупований за варіантами:
### Варіант А — збирач облікових даних (після встановлення + MCP-час 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 | так |
### Варіант Б — Pinggy tunnel 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 | типосквот солани |
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-проекту. Назви Variant-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 пакетах варіанта A. |
/tmp/.node-cache | B | Відокремлений виконуваний файл, видалений користувачем foundry-deploy-helper:1.8.96. |
видавець
- ім'я користувача npm: ddjidd5640
- електронна пошта: 1623682356@qq.com (неперевірено)
- Електронна пошта і SCM перевірка: немає
- Пакети на рахунку: 22, всі перелічені в каталозі вище
- Найперша видима активність: валідатор-ключів-ланцюжка:0.2.3 (Варіант А)
- Остання видима активність: chain-key-validator:0.2.3 та crypto-credential-scanner:2.0.2 (обидві протягом 24 годин до цього опису)
Фірмові фасади (використовуються в автор / README / фальшива GH org)
- «Гільдія криптобезпеки» — підтримується порожньою організацією GitHub криптосекторна гільдія
- «Web3 Audit Collective» — підтримується порожньою організацією GitHub w3audit
- «Альянс безпеки DeFi» — підтримується порожньою організацією GitHub дефі-безпека
- Довідковий обліковий запис GH ddjidd564 — хост config.json динамічного вебхука
Поведінкові
- вузол -e після встановлення, читаючи будь-що з .ssh, .ефіріум, .біткойн, .env, .bash_history, .zsh_history, .git-облікові дані з .slice(0, 200) та об'єднання з | роздільники – це майже унікальний відбиток для варіанта А.
- Імпортуючий ./сканер.js з пакета, який реєструється як MCP сервер з інструментами під назвою витік_посвідчень_з_пошуку або дієслова «аудит безпеки» у подібній формі є підтвердженням Варіанта А.
- Вузол -e postinstall, який отримує дані з будь-якого хоста *.run.pinggy-free.link та передає відповідь до child_process.exec, є підтвердженням Варіанта B незалежно від обгортки.
Атрибуція та мотивація
На столі достатньо інформації для часткового відбитка пальця видавця, але далеко не достатньо для справжньої ідентифікації. Електронна пошта. 1623682356@qq.com — це поштова адреса QQ — безкоштовна веб-пошта Tencent, популярна в материковому Китаї — а числова локальна частина — це ідентифікатор користувача QQ; ми розглядаємо це лише як м’який сигнал, оскільки адреси у форматі QQ реєструються тривіально. Обліковий запис npm не має двофакторного розкриття, не має підтвердженої електронної пошти, не має підтвердженої SCM посилання. Тріада брендів «Гільдія криптобезпеки» / «Колектив аудиту Web3» / «Альянс безпеки DeFi» є сфабрикованою вщент — жодна з трьох не існує поза цією кампанією — а організації GitHub, що її підтримують, є порожніми оболонками, створеними для заповнення посилань на сторінку npm.
Варто назвати дві закономірності, оскільки вони проявляються в суміжних кампаніях. Перша – префабрикація бренду як соціальний доказ: оператор не вибрав існуючі назви проектів з помилкою; вони створили цілий наратив про довіру з нуля, знаючи, що Збірка ШІ-агента pipeline або поспішний розробник, який сканує сторінку npm, знайде зіставлення зі шаблоном «схоже на організацію безпеки», а не «є організацією безпеки». Це той самий підхід, про який попереджала недбала література — пакети, налаштовані на назву, яку мала б LLM. винаходити якщо запитується інструмент безпеки Web3, достатньо добре оформлений, щоб LLM не перевіряв його двічі. Недбале присідання – це нещодавно введений термін для позначення шкідливих пакетів, назви яких збігаються з заповнювачами, що виникають у LLM, коли авторитетний пакет не існує; ця кампанія є її більш агресивним двоюрідним братом, де оператор також вигадує організацію, до якої належить заповнювач.
Другий візерунок — це Активація за часом MCPНа той час scanner.js запускається, встановлення завершено, і розробник рухається далі. Тригером є виклик інструменту агентом штучного інтелекту — витік_посвідчень_з_пошуку, у випадку Варіанта А — що агент обов’язково зробить, оскільки саме для цього йому й було надано пакет. Шкідлива робота відбувається під час добре частина робочого процесу, коли розробник, найімовірніше, спостерігатиме за тим, як його помічник зі штучним інтелектом успішно виконує завдання, яке він попросив. Це невеликий зсув у поведінці порівняно зі старішим «виключенням» npm встановити«шаблон», і він акуратно уникає пісочниці під час встановлення.
Ми не називаємо ім'я зловмисника. Сигнали (електронна пошта QQ, один обліковий запис, одноденний спалах із 22 пакетів, два паралельні стеки C2) однаково узгоджуються з одним постійним оператором, невеликою командою або однією з команд, що займалися розсилкою пакетів, що було видно в телеметрії npm протягом 2025–2026 років. Те, що ми може Можна сказати, що цей оператор має чітку бажану екосистему (Ethereum + Solana + інструменти Foundry/HardHat), чітку бажану жертву (розробники Web3 та агенти штучного інтелекту, що працюють над проектами Web3) та чітку бажану модель персистентності (тригер часу виконання MCP плюс окремий бінарний резервний файл).
Вплив, тенденції та що можуть зробити захисники
Наше раннє попередження pipeline спійманий 8 з 22 пакетів протягом усього періоду кампанії — шість під час початкової перевірки та ще два, що надійшли пізніше того ж дня під час кластеризації кампанії. Інші 14 пакетів були активні на npm протягом кількох днів. без жодної появи в жодній із каналів виявлення, які ми відстежуємо, і на момент написання залишаються встановлюваними. Цей проміжок важливий, оскільки:
- Варіант А не працює під час встановленняЗчитування dotfile відбувається, але масове вилучення файлу спрацьовує лише тоді, коли агент штучного інтелекту викликає інструменти MCP пакета. standard післявстановлення-спостереження за пісочницею побачить вузол -e блок і вирішити, що він малий і, очевидно, інертний.
- Варіант B — це один рядок. Класифікатор шкідливого програмного забезпечення не має з чого вчитися — ні обфускації, ні закодованого корисного навантаження, ні підозрілого домену. Тунель Pinggy — це легітимний сервіс для розробників. Єдине підозріле те, що «помічнику з конфігурації» взагалі потрібно телефонувати додому.
- Варіант C виглядає абсолютно чистим. Він не має встановлення hooksЗа кожним статичним сигналом це нормально.
Короткий контрольний список захисника для ери MCP-інструментів
Три конкретні дії, які б зацікавили цю кампанію раніше:
- Зважуйте видавця, а не пакет. Двадцять дві посилки в рамках одного річного облікового запису QQ-email без SCM Перевірка — це яскравіший сигнал, ніж будь-яка функція для кожного пакета. Наш робочий процес раннього попередження виявив перші пакети, оскільки відбиток видавця виділявся — рекомендувавши оцінку репутації видавця, яку може зменшити будь-який із класифікаторів безпечних, непереконливих або шкідливих програм для кожного пакета.
- Розглядайте непрямі налаштування динамічної конфігурації як шкідливі, доки не буде доведено протилежне. Пакет, який визначає свою вихідну кінцеву точку під час виконання зі стороннього документа (GitHub Pages, GitHub Gist, Pastebin, об'єкт S3, будь-де ще), не має законних підстав робити це для телеметрії. Справжні кінцеві точки телеметрії жорстко закодовані та задокументовані.
- Перевіряти пакети MCP-сервера за допомогою їх рекламованої поверхні інструменту. Пакети Variant-A рекламують інструменти під назвою
search_leaked_credentials,validate_chain_key,deploy_safeта подібні дієслова «аудиту». Хост MCP, який пропонує інструмент, опис якого стверджує, що він сканує каталоги проектів на наявність облікових даних, повинен вимагати явної згоди оператора, перш ніж агент викличе його на реальній базі коду. Суть MCP полягає в тому, що цикл агента не має можливості дізнатися, чиsearch_leaked_credentialsє пошуком облікових даних або є засобом вилучення облікових даних.
Для розробників, які, можливо, вже встановили один із 22 пакетів: припустимо, що будь-який ключ відкритого тексту в ~ / .ssh, ~/.ethereum, ~/.біткойн, ~/.solana, ~/.envабо ~/.git-облікові дані скомпрометовано, ротуйте всі облікові дані, ім'я яких відповідає списку фільтрів env-змінних вище, а в Linux/macOS перевірте наявність виконуваного файлу за адресою /tmp/.node-cache (і будь-який осиротілий процес, запущений з нього). Перевстановлення легітимної версії імітованого інструментарію (Ливарне виробництво, Трюфель, каска, Ganacheтощо) не видаляє видалений бінарний файл.
Неактивний транш Варіанта C – це та частина цієї історії, яка найгірше старіє. Дев'ять пакетів із чистим профілем встановлення та встановленим видавцем – це саме той інвентар, який оператор тримає про запас. Якщо вони вибухнуть пізніше – як це сталося з PhantomBot, коли його axois-utils перепакування перетворилося з крадіжки облікових даних на вербування ботнету — вони вибухнуть проти будь-якого користувача реєстру, який закріпив пакет Variant-C між сьогоднішнім днем і видаленням. Закріплення шкідливого пакета за версією не захищає вас від видавця, який контролює кожну версію.
Посилання
- [сторінка видавця npm для ddjidd5640](https://www.npmjs.com/~ddjidd5640) — 22 пакети, що наразі перелічені під цим обліковим записом. Авторитетне джерело каталогу на момент написання.
- [сторінка пакета npm для крипто-сканер-посвідчень](https://www.npmjs.com/package/crypto-credential-scanner) — приклад артефакту Варіанта А; тут видно файл README, історію версій та посилання на авторів.





