PhantomSync: npm kripto paketlari hamyon o'g'irlovchisini yashiradi

PhantomSync: sakkizta kripto-ishlab chiquvchi npm paketlari kechiktirilgan, o'z-o'zidan davom etadigan dropperni yashiradi

TP; DR

Bitta npm nashriyotchisi blokcheyn va hamyonni ishlab chiqish uchun kundalik qurilish bloklari kabi o'qiladigan sakkizta kichik paketlarni jo'natdi. base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpersva crypto-validate-libHar birida ishlaydigan yordamchi dastur mavjud. Biroq, ushbu yordamchi dasturdan keyin modul import qilingan paytda ishlaydigan o'z-o'zini chaqiradigan kod bloki qo'shilgan.

Import qilinganidan taxminan 37 soniya o'tgach, bu blok sinov moslamasi sifatida niqoblangan paket ichida jo'natilgan foydali yukni dekodlaydi, uni foydalanuvchining uy katalogi ostidagi yashirin faylga yozadi va har bir qayta ishga tushirish uchun o'zini ro'yxatdan o'tkazadi. login Windows, macOS va Linux bo'ylab ishlaydi va dekodlangan skriptni alohida jarayon sifatida ishga tushiradi. Bu haqda hech narsa npm o'rnatish paytida ishga tushmaydi; u kod import qilinishini va ishga tushirilishini kutadi, bu esa o'rnatishga qaraganda tinchroq vaqt.

Yuklama shaffof emas. U oddiy base64 sifatida jo'natiladi, shuning uchun "sinov moslamasi" ni dekodlash ikkinchi bosqichni to'liq tiklaydi: a kripto-hamyon va sirlarni o'g'irlovchi mashinaning ishlamay turishini kutadi, shaxsiy kalitlar va boshlang'ich iboralarni yig'adi, har bir topilmani qattiq kodlangan RSA-4096 kaliti bilan shifrlaydi va uni har 12 soatda qayta signalizatsiya qilib, ommaviy IPFS xotirasiga qadab chiqaradi.

Biz klasterni quyidagicha kuzatamiz PhantomSyncTahlil vaqtida barcha sakkizta paketlar npm registrida bitta hisob ostida nashr etilgan holda faol edi.

Ekosistemanpm
paketlarbase58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-lib
Maqsadli platformalarWindows, macOS, Linux
Asosiy xatti-harakatlarKechiktirilgan, import vaqtidagi dropper sinov moslamasi sifatida yashiringan; platformalararo qat'iylikni o'rnatadi
To'lovKripto-hamyon va sirlarni o'g'irlash, RSA-4096 shifrlash, ommaviy IPFS pinlash orqali eksfiltratsiya

Hujum anatomiyasi

Har bir paket birinchi marta o'qiganda ajoyib ko'rinadi. base58-utilsMasalan, bu bir necha kilobayt nolga bog'liq bo'lgan Base58 / Bitcoin-WIF yordamchi kodi — nomi va'da qilgan narsadir. Tegishli kod joylashgan so'ng modulning modul.exports, bu yerda faylning yuqori qismini ko'zdan kechirayotgan o'quvchi ko'rinishi ehtimoldan yiroq: o'zini taymer bilan rejalashtiradigan o'z-o'zini chaqiradigan funksiya.

Paket manbasidan qayta tiklangan operatsiyalar zanjiri quyidagicha ishlaydi:

1. Package is required() by the host project
2. A self-invoking function schedules a callback ~37,000 ms later (setTimeout)
3. On fire, the callback reads test/fixtures/keypairs.dat (a base64 blob)
4. It base64-decodes that blob into a Node.js script
5. It writes the script to ~/.cache-db/.node-sync/syncd.js (mode 0o700)
6. It installs login-persistence for that script (see below)
7. It spawns "node syncd.js" as a detached process

Ikkita dizayn varianti ajralib turadi.

Yuk sinov moslamasi sifatida harakatlanadi. Ikkinchi bosqich aniq kod sifatida yozilmagan. U ... da yashaydi. sinov/moslamalar/keypairs.dat, nomi kalit juftliklarini qayta ishlashni da'vo qiladigan paketga aralashadigan base64 fayli. Tarballni ko'zdan kechirayotgan odam uchun bu namunaviy ma'lumotlarga o'xshaydi; qo'shilgan kod uchun bu dekodlash va ishga tushirish uchun skript. Dropperning o'zida tarmoq manzili yo'q - ular ikkinchi bosqichda yashaydi - lekin qo'shimcha chalkashlik yo'q: armatura base64 ning bitta qatlamidir, shuning uchun uni dekodlash (base64 -d) to'liq tiklanadi syncd.js va uning tarmoq xatti-harakati. Keyingi bo'limda tiklangan bosqich nima qilishi ko'rib chiqiladi.

Portlash kechiktirildi va o'rnatishga emas, balki importga bog'liq. Chunki tetik talab qilish() o'rnatish kancasi o'rniga ~37 soniyali taymerga qo'shimcha ravishda, faqat kuzatiladigan tekshiruvlarni chetlab o'tish xatti-harakati npm o'rnatish qadam va kechikish ko'plab qisqa muddatli sinov muhiti va CI ishga tushirishlaridan uzoqroq davom etadi. Biror narsa ishga tushirilgunga qadar, paketni yuklagan o'rnatish allaqachon tugagan bo'ladi.

Dekodlangan skript diskda bo'lgandan so'ng ~/.cache-db/.node-sync/syncd.js — odatiy kesh katalogi kabi o'qish uchun tanlangan yo'l — dropper uni uchta asosiy platformada ham qayta ishga tushirishdan omon qolishga imkon beradi:

  • linux: Skriptni qayta ishga tushiradigan cron yozuvi. Yozuv mavjud crontabni filtrlash orqali o'rnatiladi grep -v sinxronlashtirildi, bu esa xuddi shu nom uchun greps qiladigan oddiy ro'yxatdagi yangi yozuvni chiqarib tashlashning yon ta'siriga ega.
  • Windows: nomlangan rejalashtirilgan vazifa WinNodeSync, 12 daqiqalik interval bilan qayta ishga tushirishga sozlangan.
  • MacOS: ishga tushirish ishi deb nomlangan com.apple.syncd, bir nechta paketlarda mavjud — qonuniy Apple tizim xizmatini taqlid qiluvchi yorliq.

Keyin skript darhol alohida jarayon sifatida ishga tushiriladi, shuning uchun import qilingan dastur tugagandan so'ng u ishlashda davom etadi.

Ikkinchi bosqich nima qiladi

Armatura bitta base64 qatlami bo'lgani uchun, ikkinchi bosqich toza dekodlanadi va to'liq o'qilishi mumkin. Barcha sakkizta paket bir xil skriptning uchta variantidan birini o'z ichiga oladi, bu esa o'zini sarlavha izohida quyidagicha aniqlaydi. phantom syncd v3 - topo durmiente ("uyqudagi xol"). Uning vazifasi kriptovalyuta hamyon materiallari va ishlab chiquvchilar sirlarini o'g'irlash va ularni mashinadan jo'natishdir. U quyidagi bosqichlarda ishlaydi:

  • 1. Mashina ishlamay qolguncha kuting. Biror narsa qilishdan oldin, syncd.js foydalanuvchi qancha vaqt faol bo'lmaganligini va faqat belgilangan chegaradan oshib ketganligini tekshiradi (taxminan 15 daqiqa) — xprintide Linuxda, ioreg macOS’da HIDIdleTime va Windows’da PowerShell’ning bo‘sh vaqt so‘rovi. Shuning uchun, ma’lumotlarni yig‘ish odatda klaviatura yonida hech kim bo‘lmaganida sodir bo‘ladi.
  • 2. Masofadan boshqariladigan faollashtirish tugmachasini olingSkript ishga tushirishdan oldin o'lik ochilish joyidan kichik konfiguratsiyani oladi. Asosiy manba GitHub gist xom URL manzilidir (gist.githubusercontent.com/juang55/…/cfg.txt); skript faqat ushbu konfiguratsiya o'qilsa faollashadi faol=1Agar gist mavjud bo'lmasa, u umumiy shlyuzlar orqali olinadigan uchta qattiq kodlangan IPFS kontent identifikatorlariga qaytadi. gateway.pinata.cloud, ipfs.iova cloudflare-ipfs.comBu operatorga qo'lni/qurolsizlantirishni boshqarish va olib tashlashga chidamli zaxira imkoniyatini beradi. (Eng kichik variant, yetkazib berilgan kripto-validate-lib, eth-hamyon yordamchilariva solana-key-utils, gist qatlamini olib tashlagan va faqat IPFS identifikatorlariga tayanadi.)
  • 3. Hamyon materiallari va sirlarini yig'ib oling. Skript foydalanuvchining uy katalogida harakatlanadi — ~/.config/solana, ~/.ethereum/keystore, ~/.quyma sexi, ~/.qattiq shlyapa, ~ / .sshva Desktop/hujjatlar/Yuklamalar (ispan tilidagi papka nomlarini ham qo'shgan holda), shuningdek ~/.env va shell rc fayllari va unga tenglashtirilgan fayllar Dasturlar ma'lumoti Windows’dagi joylashuvlar. U Ethereum maxfiy kalitlarini, Bitcoin WIF kalitlarini, BIP-39 boshlang‘ich iboralarini, Solana kalit juftliklarini, Ethereum kalit do‘koni JSONini, SSH kalitlarini va maxfiy muhit o‘zgaruvchilarini nishonga oladi. Kattaroq variant (ichida) abi-kodlash, base58-utils, eth-dev) to'liq 2048 so'zdan iborat BIP-39 lug'atini o'z ichiga oladi va muntazam iboralardan foydalanadi ko'chirma o'qilgan har qanday matndan individual kalitlar va tasdiqlangan boshlang'ich iboralar; buning o'rniga ikkita kichikroq variant fayllarni kalit so'z bo'yicha moslashtiradi (urug'lar, mnemonik, hamyon, metamask, O'ylab, kitoblariga, trezor, …) va butun fayllarni yuklang.
  • 4. Umumiy pinning xizmati orqali shifrlang va filtrlang. Har bir topilma xost barmoq izi bilan birga keladi (foydalanuvchi nomi@hostname, platforma, vaqt tamg'asi) va skriptga o'rnatilgan qattiq kodlangan RSA-4096 ochiq kaliti bilan shifrlangan. Keyin shifrlangan yozuv IPFSga qadab yuklanadi. api.pinata.cloud/pinning/pinJSONToIPFS, qattiq kodlangan Pinata API hisob ma'lumotlari bilan tasdiqlangan. Musodara qilish uchun maxsus C2 serveri yo'q: o'g'irlangan ma'lumotlar ommaviy markazlashtirilmagan xotirada saqlanadi, operator tomonidan natijada olingan kontent xeshlari yordamida olinishi mumkin. Yuklashlar bir necha soniya tasodifiy titrash va mahalliy jurnal bilan oraliqda amalga oshiriladi. vaqt tamg'asi | kalit turi | qaytarilgan xesh saqlanadi ~/.cache-db/.node-sync/.sl.
  • 5. 12 soatlik tsiklda davom eting va mayoq qiling. Ikkinchi bosqich o'zining barqarorligini qayta tiklaydi — Linuxda cron yozuvi, a com.apple.syncd macOS da ishga tushirish vazifasi va nomlangan rejalashtirilgan vazifa WindowsNodeSync Windows’da — har 12 soatda qayta ishga tushirishga sozlangan. E’tibor bering, bu a turli xil Dropper o'rnatgan Windows vazifa nomi (WinNodeSync); ikkalasi ham qidirishga arziydi.

Timeline

Sakkizta paket 2026-yil 13-iyul va 2026-yil 14-iyul kunlari qisqa muddatda nashr etildi. Bir nechta versiyalari bir nechta versiyalarga ega; dropper barcha versiyalarda bir xil, faqat yuqoridagi foydali kodning hajmi o'zgarganda qatorlar siljishi o'zgaradi.

sana hodisa
2026-07-13 Klasterdagi birinchi paketlar bitta nashriyotchi ostida paydo bo'ladi (solana-key-utils, eth-wallet-helpers, crypto-validate-lib va qolganlarining dastlabki versiyalari)
2026-07-13 → 07-14 Qolgan ismlar va keyingi versiyalar nashr etildi; har biriga bir xil ilova qilingan tomchi jo'natiladi
2026-07-14 Sakkiztasining barchasi belgilandi va tahlil qilindi; har bir paket hali ham registrdan o'rnatilishi mumkin

Natijada, nashriyotchining reyestrdagi obro'si klaster boshida taxminan neytraldan aniqlanishlar to'planib borishi bilan juda salbiyga o'tdi - bu paketlarning belgilanishining kuzatilishi mumkin bo'lgan yon ta'siri, mo'ljallangan xususiyat emas.

Murosaga kelish ko'rsatkichlari

Quyidagi barcha ko'rsatkichlar tahlil vaqtida — “Ikkinchi bosqich” jadvallarida dekodlash orqali mavjudligi tasdiqlandi. sinov/moslamalar/keypairs.dat va tiklanganlarni o'qish syncd.js.

Fayllar va yo'llar

Ko'rsatkichlar roli
~/.cache-db/.node-sync/syncd.js 0o700 rejimida yozilgan ikkinchi bosqich dekodlangan
~/.cache-db/.node-sync/.sl Mahalliy eksfiltratsiya jurnali (vaqt tamg'asi | kalit turi | IPFS xeshi)
test/fixtures/keypairs.dat Base64 kodlangan foydali yuk tarball ichida "sinov moslamasi" sifatida joylashtirilgan

Ikkinchi bosqichli tarmoq infratuzilmasi (syncd.js dan tiklangan)

Ko'rsatkichlar roli
gist.githubusercontent.com/juang55/b298754cb72942b1cdcf02ccd45cde2f/raw/cfg.txt Faollashtirish o'chirilgan; skript faqat konfiguratsiya o'qilsa ishlaydi active=1
Qmcqz3w8j4qFQXDAXAxnrdc2oSX3nzBT4NqtpTqL8mr1ga IPFS konfiguratsiyasining zaxira nusxasi (CID)
QmdTXoqVmTHY1i4ZWLdLkoQ9YChp5TXPh5cWXwnAYZt5iF IPFS konfiguratsiyasining zaxira nusxasi (CID)
QmfJkLU5gdCpqbbqEjWYC2anXW9FmuEeSLLeLiHVJKYUjp IPFS konfiguratsiyasining zaxira nusxasi (CID)
gateway.pinata.cloud, ipfs.io, cloudflare-ipfs.com Konfiguratsiya zaxira nusxasini olish uchun ishlatiladigan IPFS shlyuzlari
api.pinata.cloud/pinning/pinJSONToIPFS Eksfiltratsiya so'nggi nuqtasi, o'g'irlangan ma'lumotlar ommaviy IPFSga biriktirilgan
Pinata API kaliti 13c766575b9270a9825d, qattiq kodlangan eksfiltratsiya ma'lumotlari

Ikkinchi bosqichli yig'ish maqsadlari (syncd.js dan tiklangan)

Ko'rsatkichlar roli
~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.hardhat, ~/.ssh, ~/.env, shell rc fayllari Kalitlar va sirlar qidirilgan kataloglar/fayllar
AppData\Roaming\Solana, AppData\Local\ethereum\keystore Windows ekvivalentlari qidirildi
To'plangan artefakt turlari ETH maxfiy kalitlari, Bitcoin WIF, BIP-39 boshlang'ich iboralari, Solana kalit juftliklari, Ethereum kalit do'koni JSON, SSH kalitlari, maxfiy muhit o'zgaruvchilari

Qat'iylik artefaktlari

platforma Ko'rsatkichlar
Linux cron yozuvini ishga tushirish syncd.jscrontab orqali o'rnatilgan, filtrlangan grep -v syncd
Windows rejalashtirilgan vazifa WinNodeSync (tomchilagich) va WindowsNodeSync (ikkinchi bosqich)
MacOS ishga tushirish yorlig'i com.apple.syncd
hamma Ikkinchi bosqich 12 soatlik tsiklda takrorlanadi

Behavioral

  • O'z-o'zini chaqiruvchi funksiya keyin qo'shildi modul.exports, rejalashtirish Vaqtni belgilash import qilinganida ~37,000 ms.
  • bola_jarayoni spawn(“tugun”, ) ajratilgan parametrlar to'plami bilan.
  • Ikkinchi bosqichda bo'sh turgan faollashtirish (xprintide / ioreg HIDIdleTime / PowerShell bo'sh vaqti; ~15 daqiqalik chegara).
  • Har bir RSA-4096 shifrlash, keyin HTTPS POST ommaviy IPFS pinlash API-siga.

Paketlar va versiyalar (npm, nashriyotchi solbuilder_io)

To'plam versiyalari
base58-utils 1.0.0, 1.0.1, 1.0.3
abi-encode 1.0.0, 1.0.1, 1.0.2
eth-dev 1.0.0, 1.0.1, 1.0.2
arb-kit 1.0.0, 1.0.1
layer2-sdk 1.0.0, 1.0.1
solana-key-utils 1.0.0
eth-wallet-helpers 1.0.0
crypto-validate-lib 1.0.0

nashriyotchi

  • solbuilder_io - angel_lopez89[@]proton[.]me, elektron pochta tasdiqlanmagan, tasdiqlangan manba nazorati hisobi yo'q, bog'langan omborxona yo'q.

Atribut va kuzatilgan xatti-harakatlar

Sakkizta paket bitta nashriyotchi hisobi va bitta foydali yuklamani baham ko'radi. Ularning har biri oddiy paket — bir xil dropper qo'shilgan bir necha kilobayt haqiqiy yordamchi kod — bog'langan omborsiz va tasdiqlanmagan bir martalik elektron pochta orqali nashr etilgan. Bu bir xillik, umumiy drop yo'li, umumiy doimiylik yorliqlari va umumiy kalit juftliklari.dat bosqichma-bosqich fayllar klasterni bir-biriga bog'laydigan narsadir.

Paketlar o'zlarining xatti-harakatlari haqida g'ayrioddiy darajada samimiy. solana-key-utils qo'shilgan blokni oddiy so'zlar bilan tavsiflovchi qator ichidagi izohlarni olib yuradi — ulardan biri uni belgilaydi FANTOM: ko'rinmas qat'iyatlilik, boshqasi (ispan tilida) o'qiydi Topo en background ni chiqarib tashlang, “molni orqa fonda ishga tushirish.” Bu kodning o'z faoliyati haqidagi izohlari; ushbu postdagi kampaniya nomi birinchi yorliqdan va soxta “sinxronizatsiya demoni” tugunidan olingan (sinxronlangan) qat'iyatlilik mexanizmi taqlid qiladigan narsa.

Biz faqat kodning kuzatiladigan ishi nima ekanligini tasvirlaymiz. Paketlarning nomlanishi - barcha kripto, hamyon va blokcheyn vositalari atamalari - ishlab chiquvchi auditoriyasi ularni nom bilan chaqirishga moyil ekanligini ko'rsatadi; bu nashriyotchi kimligini o'zi aniqlamaydi. Ikkinchi bosqich base64 moslamasini dekodlash orqali to'liq tiklanishi mumkin edi va uning xatti-harakati yuqorida tavsiflangan: u hamyon kalitlarini, urug' iboralarini va sirlarni to'playdi va ularni RSA-shifrlangan holda Pinata orqali ommaviy IPFS xotirasiga chiqaradi. Dizaynning diqqatga sazovor tanlovi xususiy C2 serverining yo'qligi - konfiguratsiya GitHub gist va IPFS dan keladi va o'g'irlangan ma'lumotlar kontent xeshi bilan kalitlangan ommaviy markazlashtirilmagan xotirada saqlanadi, ularning ikkalasini ham bitta hujumchi tomonidan boshqariladigan xostga qaraganda qo'lga olish qiyinroq. Yozish paytida ushbu klasterga mos keladigan avvalgi ommaviy hisobotlar topilmadi.

Himoyachilar uchun ta'sir, tendentsiyalar va ko'rsatmalar

Kim fosh bo'ladi. Ushbu paketlardan birini Node loyihasiga qo'shgan va keyin uni import qiladigan kodni ishga tushirgan har bir kishi. Detonatsiya o'rnatish vaqti emas, balki import vaqti bo'lgani uchun, shunchaki paketning mavjudligi yetarli emas - lekin modulni yuklaydigan har qanday oddiy foydalanish foydali yukga yetadi. Ethereum, Solana, Arbitrum, Layer-2 va umumiy hamyon/kodlash vositalariga asoslangan maqsadli ishlab chiquvchilarning jozibador nomlari - ikkinchi bosqich qidiradigan aktivlarga ega bo'lish ehtimoli yuqori bo'lgan populyatsiya. Ushbu modullardan birini hamyon kalitlari, urug' iboralari, kalit do'konlari, SSH kalitlari yoki .NS sirlar ushbu ma'lumotlarni buzilgan deb hisoblashi va ularni o'zgartirishi kerak.

Ichkilashtirishga arziydigan ikkita naqsh. Birinchidan, yuk ko'tarish moslamasi sifatida: ikkinchi bosqichni base64 sifatida ehtimoliy nomlangan ma'lumotlar fayli ichida jo'natish (sinov/moslamalar/keypairs.dat) paketning ko'rinadigan manbasini toza ko'rinishda saqlaydi va zararli kontentni vositalarni ko'rib chiqadigan faylga joylashtiradi va inson tomonidan o'chirilgan ma'lumotlar ko'pincha inert ma'lumotlar sifatida qabul qilinadi. Ikkinchidan, import vaqtida kechiktirilgan ijro, platformalararo qat'iylik bilan: triggerni o'rnatish kancasidan olib tashlash, taymer qo'shish va keyin cron, rejalashtirilgan vazifalar va launchd bo'ylab davom ettirish avtomatlashtirilgan registrni skanerlash eng diqqat bilan kuzatadigan shovqinli o'rnatish skripti texnikasidan ataylab bir qadam narida.

Himoyachilar va himoyachilar uchun ko'rsatmalar:

  • Qo'shilgan kodni keyin qayta ishlash modul.exports ko'rib chiqish ustuvorligi sifatida — dropper mantig'i ko'pincha "haqiqiy" modul yuzasi ostida yashirinadi.
  • Ma'lumotlar fayllari inert deb o'ylamang. Base64 bloki ostida sinov/jadvallar/ ish vaqtida o'qiladigan va dekodlangan fayl bajariladigan faylga tutashgan fayl; ish vaqtidagi faylni o'qiydigan faylni belgilaydi vazifa/baholash/yozing-keyin-spawn zanjir.
  • Tushish yo'lini qidiring ~/.cache-db/.node-sync/ va qat'iylik birliklari uchun WinNodeSync (rejalashtirilgan vazifa) va com.apple.syncd (launchd) ushbu nomlarni olgan ishlab chiquvchi mashinalarida.
  • Cron yozuvlarini, rejalashtirilgan vazifalarni yoki ishga tushirish ishlarini yaratadigan Node jarayonlari haqida ogohlantirish — qonuniy kutubxonalar buni import qilishda kamdan-kam hollarda bajaradi.
  • Qulflangan fayllar va qadalgan versiyalarni afzal ko'ring va ayniqsa, har qanday yangi kichik "yordamchi" qaramlikning farqini ko'rib chiqing. nolga bog'liqlik paketlari nashr etildi bog'langan omborxonasi bo'lmagan tasdiqlanmagan hisoblar tomonidan.

Ro'yxatga olish kitobi himoyachilari uchun xulosa shuki, o'rnatish-hook monitoringi zarur, ammo yetarli emas: ma'lumotlar fayli ichida joylashtirilgan import vaqti, taymer kechiktirilgan dropper faqat o'rnatish vaqti tekshiruvidan o'tadi va doimiylik bosqichi ko'pincha ushlash uchun qolgan eng baland kuzatiladigan signaldir.

sca-vositalari-dasturiy ta'minot-kompozitsiya-tahlil-vositalari
Dasturiy ta'minot xavflaringizni ustuvorlashtiring, bartaraf eting va himoya qiling
Bepul hisobingizni oling.
Kredit karta talab qilinmaydi.

Dasturiy ta'minotingizni ishlab chiqish va yetkazib berishni ta'minlang

Xygeni mahsulot to'plami bilan