TL; DR
Tək bir npm nəşriyyatı, adları blokçeyn və cüzdan inkişafı üçün gündəlik tikinti blokları kimi oxunan səkkiz kiçik paket göndərdi. base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpersvə crypto-validate-libHər birində işləyən bir yardım proqramı var. Lakin, bu yardım proqramından sonra modul idxal edildiyi anda işləyən öz-özünə çağırılan kod bloku əlavə olunur.
İdxaldan təxminən 37 saniyə sonra, bu blok, test qurğusu kimi gizlədilmiş paketin içərisində göndərilən faydalı yükü deşifrə edir, onu istifadəçinin ev qovluğunun altındakı gizli bir fayla yazır və hər dəfə yenidən başlatmaq üçün özünü qeydiyyatdan keçirir login Windows, macOS və Linux-da işləyir və deşifrə olunmuş skripti ayrı bir proses kimi işə salır. Bu barədə heç bir şey npm quraşdırma zamanı işə düşmür; kodun idxal edilməsini və işə salınmasını gözləyir ki, bu da quraşdırmadan daha sakit bir andır.
Faydalı yük qeyri-şəffaf deyil. Sadə base64 kimi göndərilir, buna görə də "test qurğusu"nun dekodlanması ikinci mərhələni tam şəkildə bərpa edir: a kripto-cüzdan və sirr oğurlayıcısı maşının boş dayanmasını gözləyir, şəxsi açarları və ilkin ifadələri toplayır, hər tapıntını sərt kodlu RSA-4096 açarı ilə şifrələyir və hər 12 saatdan bir geri siqnal göndərərək ictimai IPFS yaddaşına sancaraq süzür.
Biz klasteri aşağıdakı kimi izləyirik PhantomSyncTəhlil zamanı səkkiz paketin hamısı npm reyestrində vahid hesab altında dərc olunmuşdu.
| Ekosistem | npm |
| Paketlər | base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-lib |
| Hədəf platformalar | Windows, macOS, Linux |
| Əsas davranış | Gecikmiş, idxal vaxtı dropper test qurğusu kimi gizlədilir; platformalararası davamlılıq quraşdırır |
| Payload | Kripto-cüzdan və sirr oğurlayıcısı, RSA-4096 şifrələmə, ictimai IPFS pinləmə vasitəsilə eksfiltrasiya |
Hücum anatomiyası
Hər bir paket ilk oxunuşda diqqətəlayiq görünmür. base58-utilsMəsələn, adın vəd etdiyi şeyin tam olaraq bir neçə kilobaytını sıfır asılılıqlı Base58 / Bitcoin-WIF köməkçi kodu təşkil edir. Müvafiq kod sonra modulun modul.exports, burada oxucunun faylın yuxarısına baxarkən görünməsi ehtimalı azdır: özünü taymerlə planlaşdıran öz-özünə çağırılan funksiya.
Paket mənbəyindən yenidən qurulan əməliyyatlar zənciri belə işləyir:
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 İki dizayn seçimi diqqət çəkir.
Yük sınaq qurğusu kimi hərəkət edir. İkinci mərhələ açıq kod kimi yazılmayıb. O, yaşayır test/fiksturlar/açar cütləri.dat, adı açar cütlüklərini idarə etdiyini iddia edən bir paketə qarışan base64 faylı. Tarball-u gözdən keçirən bir insan üçün bu, nümunə məlumatları kimi görünür; əlavə edilmiş koda isə, deşifrə edib işlətmək üçün bir skriptdir. Dropperin özündə heç bir şəbəkə ünvanı yoxdur — bunlar ikinci mərhələdədir — lakin əlavə qarışıqlıq yoxdur: armatur base64-ün tək bir təbəqəsidir, ona görə də onu deşifrə edin (base64 -d) tam bərpa edir syncd.js və onun şəbəkə davranışı. Növbəti hissədə bərpa olunmuş mərhələnin nə etdiyi izah olunur.
Detonasiya gecikir və quraşdırma ilə deyil, idxal ilə əlaqələndirilir. Çünki tetikleyici tələb edir() üstəgəl quraşdırma çəngəli əvəzinə ~37 saniyəlik bir taymer, davranış yalnız izlənilən yoxlamaları kənara qoyur npm yükləyin addım və gecikmə bir çox qısamüddətli sandbox və CI çalışmalarını üstələyir. Hər hansı bir şey icra olunana qədər, paketi yükləyən quraşdırma çoxdan bitmiş olur.
Şifrələnmiş skript diskdə olduqdan sonra ~/.cache-db/.node-sync/syncd.js — adi keş qovluğu kimi oxunmaq üçün seçilmiş yol — dropper onu hər üç əsas platformada yenidən başlatmalardan sonra da sağ qalmağa məcbur edir:
- Linux: Skripti yenidən işə salan cron girişi. Giriş mövcud crontab-ı süzgəcdən keçirməklə quraşdırılır. grep -v sinxronizasiyası, bu da eyni adı greps edən sadə siyahıdan yeni girişi çıxarmaq kimi yan təsirə malikdir.
- Windows: adlı planlaşdırılmış tapşırıq WinNodeSync, 12 dəqiqəlik fasilə ilə yenidən işə salınmaq üçün təyin edilib.
- macOS: etiketli bir işə salma işi com.apple.syncd, bir neçə paketdə mövcuddur — qanuni Apple sistem xidmətini təqlid edən bir etiket.
Daha sonra skript dərhal ayrı bir proses kimi işə salınır, beləliklə, idxal proqramı çıxdıqdan sonra da işləməyə davam edir.
İkinci mərhələ nə edir
Armatur tək base64 təbəqəsi olduğundan, ikinci mərhələ təmiz şəkildə deşifrə olunur və tam oxuna bilər. Bütün səkkiz paket eyni skriptin üç variantından birini daşıyır və başlıq şərhində özünü aşağıdakı kimi müəyyən edir. phantom syncd v3 — çox davamlıdır (“yatmış köstəbək”). Onun işi kriptovalyuta cüzdan materiallarını və geliştirici sirlərini oğurlayıb maşından göndərməkdir. Bu addımlarla işləyir:
- 1. Maşın boş qalana qədər gözləyin. Hər hansı bir şey etməzdən əvvəl, syncd.js istifadəçinin nə qədər müddət ərzində qeyri-aktiv olduğunu və yalnız müəyyən bir həddi (təxminən 15 dəqiqə) keçdiyini yoxlayır — xprintidle Linux-da, ioreg macOS-da HIDIdleTime və Windows-da PowerShell boş vaxt sorğusu. Buna görə də, məlumat yığımı adətən klaviaturada heç kim olmadığı zaman baş verir.
- 2. Uzaqdan idarə olunan aktivləşdirmə açarını əldə edin. Skript işə düşməzdən əvvəl ölü açılan yerdən kiçik bir konfiqurasiya çıxarır. Əsas mənbə GitHub gist xam URL-dir (gist.githubusercontent.com/juang55/…/cfg.txt); skript yalnız həmin konfiqurasiya oxuduqda aktivləşir aktiv=1Əgər gist mövcud deyilsə, o, ictimai şlüzlər vasitəsilə əldə edilən üç sərt kodlu IPFS məzmun identifikatoruna qayıdır. gateway.pinata.cloud, ipfs.iovə cloudflare-ipfs.comBu, operatora dərhal silah/silahsızlaşdırma idarəetməsi və atışlara davamlı ehtiyat zərbəsi verir. (Ən kiçik variant, göndərilib kripto-validate-lib, eth-pul kisəsi köməkçilərivə solana-key-utils, gist qatını silib və yalnız IPFS identifikatorlarından asılıdır.)
- 3. Cüzdan materialını və sirlərini yığın. Skript istifadəçinin ana qovluğunda gəzir — ~/.config/solana, ~/.ethereum/açar mağazası, ~/.tökmə zavodu, ~/.hardthat, ~ / .sshvə Desktop/Sənədlər/downloads (İspan dilində qovluq adları daxil olmaqla), üstəgəl ~/.env və shell rc faylları və ekvivalenti AppData Windows-dakı yerlər. Ethereum şəxsi açarlarını, Bitcoin WIF açarlarını, BIP-39 toxum ifadələrini, Solana açar cütlüklərini, Ethereum açar anbarı JSON-unu, SSH açarlarını və gizli mühit dəyişənlərini hədəf alır. Daha böyük variant (in) abi-encode, base58-utils, eth-dev) tam 2048 sözdən ibarət BIP-39 lüğətini daşıyır və müntəzəm ifadələrdən istifadə edir çıxarış oxuduğu istənilən mətndən fərdi açarlar və təsdiqlənmiş ilkin ifadələr; bunun əvəzinə iki kiçik variant faylları açar sözlə uyğunlaşdırır (toxum, mnemonic, cüzdan, metamask, xəyal, ledger, qutu, …) və bütün faylları yükləyin.
- 4. İctimai pin xidməti vasitəsilə şifrələyin və eksfiltrasiya edin. Hər tapıntı sahibin barmaq izi ilə birlikdə verilir (istifadəçi adı@hostname, platforma, zaman damğası) və skriptə daxil edilmiş sərt kodlu RSA-4096 açıq açarı ilə şifrələnir. Şifrəli qeyd daha sonra IPFS-ə sancılaraq yüklənir. api.pinata.cloud/pinning/pinJSONToIPFS, sərt kodlu Pinata API etimadnamələri ilə təsdiqlənmişdir. Müsadirə etmək üçün xüsusi C2 serveri yoxdur: oğurlanmış məlumatlar ictimai mərkəzləşdirilməmiş yaddaşda saxlanılır və operator tərəfindən nəticədə yaranan məzmun heşlərindən istifadə edərək bərpa edilə bilər. Yükləmələr bir neçə saniyəlik təsadüfi titrəmə və lokal qeyd ilə aralıqlarla aparılır. zaman möhürü | açar növü | qaytarılan heş saxlanılır ~/.cache-db/.node-sync/.sl.
- 5. 12 saatlıq bir dövrdə davam edin və mayak edin. İkinci mərhələ öz davamlılığını yenidən bərpa edir — Linux-da cron girişi, a com.apple.syncd macOS-da launchd işi və adlı planlaşdırılmış bir tapşırıq WindowsNodeSync Windows-da — hər 12 saatdan bir yenidən işə salınacaq şəkildə təyin edilmişdir. Qeyd edək ki, bu bir müxtəlif Dropperin quraşdırdığı Windows tapşırıq adı (WinNodeSync); hər ikisi axtarmağa dəyər.
İş qrafiki
Səkkiz paket 2026-07-13 və 2026-07-14 tarixlərində qısa bir fasilə ilə dərc edildi. Bir neçəsində birdən çox versiya var; dropper versiyalar arasında eynidir, yalnız yuxarıdakı faydalı kod ölçüsü dəyişdikcə sətirlər dəyişir.
| tarix | hadisə |
|---|---|
| 2026-07-13 | Klasterdəki ilk paketlər bir naşirin altında görünür (solana-key-utils, eth-wallet-helpers, crypto-validate-lib və qalanlarının erkən versiyaları) |
| 2026-07-13 → 07-14 | Qalan adlar və sonrakı versiyalar dərc olunub; əlavə edilmiş eyni damcı hər birinə göndərilir |
| 2026-07-14 | Səkkizin hamısı qeyd edildi və təhlil edildi; hər bir paket hələ də reyestrdən quraşdırıla bilər |
Partlayış boyunca, naşirin reyestr reputasiyası klasterin əvvəlində təxminən neytraldan aşkarlanmalar toplandıqca kəskin mənfiyə keçdi - paketlərin işarələnməsinin müşahidə edilə bilən yan təsiri, dizayn edilmiş bir xüsusiyyət deyil.
Kompromis göstəriciləri
Aşağıdakı bütün göstəricilər təhlil zamanı — "İkinci mərhələ" cədvəllərində olanlar — dekodlaşdırma yolu ilə təsdiqləndi. test/fiksturlar/açar cütləri.dat və bərpa olunmuşları oxumaq syncd.js.
Fayllar və yollar
| Göstərici | Rol |
|---|---|
~/.cache-db/.node-sync/syncd.js | 0o700 rejimi ilə yazılmış ikinci mərhələnin dekodlanması |
~/.cache-db/.node-sync/.sl | Yerli eksfiltrasiya jurnalı (vaxt möhürü | açar növü | IPFS heşi) |
test/fixtures/keypairs.dat | Base64 kodlu faydalı yük, tarballın içərisində "test qurğusu" kimi yerləşdirilib |
İkinci mərhələli şəbəkə infrastrukturu (syncd.js-dən bərpa olunub)
| Göstərici | Rol |
|---|---|
gist.githubusercontent.com/juang55/b298754cb72942b1cdcf02ccd45cde2f/raw/cfg.txt | Aktivləşdirmə dayandırılıb; skript yalnız konfiqurasiya oxuduqda işləyir active=1 |
Qmcqz3w8j4qFQXDAXAxnrdc2oSX3nzBT4NqtpTqL8mr1ga | IPFS konfiqurasiya ehtiyatı (CID) |
QmdTXoqVmTHY1i4ZWLdLkoQ9YChp5TXPh5cWXwnAYZt5iF | IPFS konfiqurasiya ehtiyatı (CID) |
QmfJkLU5gdCpqbbqEjWYC2anXW9FmuEeSLLeLiHVJKYUjp | IPFS konfiqurasiya ehtiyatı (CID) |
gateway.pinata.cloud, ipfs.io, cloudflare-ipfs.com | Konfiqurasiya ehtiyat nüsxəsini əldə etmək üçün istifadə olunan IPFS şlüzləri |
api.pinata.cloud/pinning/pinJSONToIPFS | Eksfiltrasiya son nöqtəsi, oğurlanmış məlumatlar ictimai IPFS-ə qoşulub |
| Pinata API açarı | 13c766575b9270a9825d, sərt kodlu eksfiltrasiya etimadnaməsi |
İkinci mərhələli toplama hədəfləri (syncd.js-dən bərpa olunub)
| Göstərici | Rol |
|---|---|
~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.hardhat, ~/.ssh, ~/.env, shell rc faylları | Açar və sirrlər üçün axtarılan qovluqlar/fayllar |
AppData\Roaming\Solana, AppData\Local\ethereum\keystore | Windows ekvivalentləri axtarıldı |
| Toplanan artefakt növləri | ETH gizli açarları, Bitcoin WIF, BIP-39 toxum ifadələri, Solana açar cütləri, Ethereum açar anbarı JSON, SSH açarları, gizli mühit dəyişikləri |
Davamlılıq artefaktları
| Platforma | Göstərici |
|---|---|
| Linux | cron girişinin işə salınması syncd.jscrontab vasitəsilə quraşdırılıb, filtrlənib grep -v syncd |
| Windows | planlaşdırılmış tapşırıq WinNodeSync (damcı) və WindowsNodeSync (ikinci mərhələ) |
| MacOS | launchd etiketi com.apple.syncd |
| Bütün həllər | İkinci mərhələ 12 saatlıq bir dövrdə təkrarlanır |
Davranışçı
- Öz-özünə çağırış funksiyası sonra əlavə edildi modul.exports, planlaşdırma a vaxtaşırı təyin etmək idxal zamanı ~37,000 ms.
- uşaq_prosesi spawn(“düyün”, ) ayrılmış seçim dəsti ilə.
- İkinci mərhələdə boş rejimdə aktivləşdirmə (xprintidle / ioreg HIDIdleTime / PowerShell boş vaxt; ~15 dəqiqəlik həddi).
- Hər tapıntı üçün RSA-4096 şifrələmə, sonra HTTPS POST ictimai IPFS pinləmə API-sinə.
Paketlər və versiyalar (npm, naşir solbuilder_io)
| Paketi | Sürümleri |
|---|---|
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 |
naşir
- solbuilder_io - angel_lopez89[@]proton[.]me, e-poçt təsdiqlənməyib, təsdiqlənmiş mənbə nəzarət hesabı yoxdur, əlaqəli depo yoxdur.
Atribut və Müşahidə Edilən Davranış
Səkkiz paket bir naşir hesabını və bir faydalı yükü paylaşır. Hər biri trivial paketdir — eyni dropper əlavə edilmiş bir neçə kilobayt real yardımçı kod — əlaqəli depo olmadan və təsdiqlənməmiş birdəfəlik istifadə üçün nəzərdə tutulmuş e-poçt altında dərc olunub. Bu vahidlik, paylaşılan drop yolu, paylaşılan davamlılıq etiketləri və paylaşılan açar cütləri.dat Stage faylları klasteri bir-birinə bağlayan şeylərdir.
Paketlər öz davranışları barədə qeyri-adi dərəcədə səmimidirlər. solana-key-utils əlavə edilmiş bloku sadə dildə təsvir edən sətir içi şərhlər daşıyır — biri onu etiketləyir XƏYAL: görünməz əzmkarlıq, başqa biri (ispan dilində) oxuyur Ejecutar topo en background, “köstəri arxa planda işlədin.” Bunlar kodun öz funksiyalarının şərhləridir; bu yazıdakı kampaniya adı saxta “sinxronizasiya demonu” qovşağı ilə birlikdə həmin ilk etiketdən götürülmüşdür (sinxronlaşdırılıb) ki, əzmkarlıq mexanizmi təqlid edir.
Biz yalnız kodun müşahidə edilə bilən şəkildə nə etdiyini təsvir edirik. Paketlərin adlandırılması - hamısı kripto, cüzdan və blokçeyn alətləri terminləri - geliştirici auditoriyasının onları adla çəkmə ehtimalını göstərir; bu, öz-özlüyündə naşirin kim olduğunu müəyyən etmir. İkinci mərhələ base64 qurğusunun deşifrə edilməsi ilə tam bərpa edilə bilən idi və onun davranışı yuxarıda təsvir edilmişdir: cüzdan açarlarını, toxum ifadələrini və sirləri toplayır və onları RSA ilə şifrələnmiş şəkildə Pinata vasitəsilə ictimai IPFS yaddaşına eksfiltrasiya edir. Diqqətəlayiq dizayn seçimi özəl C2 serverinin olmamasıdır - konfiqurasiya GitHub gist və IPFS-dən gəlir və oğurlanmış məlumatlar məzmun heşi ilə açarlanmış ictimai mərkəzləşdirilməmiş yaddaşda saxlanılır ki, bunların hər ikisi də tək bir hücumçu tərəfindən idarə olunan hostdan daha çətindir. Yazı zamanı bu klasterə uyğun heç bir əvvəlki ictimai hesabat tapılmadı.
Müdafiəçilər üçün təsir, tendensiyalar və rəhbərlik
Kim məruz qalır. Bu paketlərdən birini Node layihəsinə əlavə edib sonra onu idxal edən kodu işlədən hər kəs. Detonasiya quraşdırma vaxtı deyil, idxal vaxtı olduğundan, sadəcə paketin mövcud olması kifayət deyil - lakin modulu yükləyən hər hansı bir normal istifadə faydalı yükə çatır. Cazibə adları Ethereum, Solana, Arbitrum, Layer-2 və ümumi cüzdan/kodlaşdırma alətləri üzərində quran hədəf inkişaf etdiriciləri - ikinci mərhələnin axtardığı aktivlərə ən çox sahib olan əhali. Bu modullardan birini cüzdan açarları, toxum ifadələri, açar anbarları, SSH açarları və ya saxlayan bir maşında işlədən hər kəs .NS sirlər bu etimadnamələri pozulmuş kimi qəbul etməli və onları dəyişdirməlidir.
Daxililəşdirməyə dəyər iki nümunə. Birincisi, yük armaturu kimi: ikinci mərhələni base64 olaraq ehtimal olunan adlandırılmış məlumat faylı daxilində göndərir (test/fiksturlar/açar cütləri.dat) paketin görünən mənbəyini təmiz saxlayır və zərərli məzmunu alətləri və insan tərəfindən skan edilmiş məlumatları tez-tez inert məlumat kimi qəbul edilən bir fayla köçürür. İkincisi, platformalararası davamlılıqla idxal vaxtında gecikmiş icraTətiyi quraşdırma çəngəlindən çıxarmaq, taymer əlavə etmək və sonra cron, planlaşdırılmış tapşırıqlar və launchd arasında davam etdirmək, avtomatlaşdırılmış qeyd dəftəri skanlamasının ən yaxından izlədiyi daha səs-küylü quraşdırma skripti texnikalarından qəsdən uzaq bir addımdır.
Müdafiəçilər və dəstəkçilər üçün təlimat:
- Əlavə edilmiş kodu sonradan emal edin modul.exports nəzərdən keçirmə prioriteti kimi — dropper məntiqi tez-tez "real" modul səthinin altında gizlənir.
- Məlumat fayllarının inert olduğunu düşünməyin. Altında base64 blobu var. test/təyinatlar/ İş vaxtında oxunan və deşifrə edilən fayl, icra edilə bilən faylla bitişikdir; icra zamanı verilən fikstür fayllarının oxunuşlarını işarələyir Function/qiymətləndir/sonra yaz-kürü zəncir.
- Düşmə yolunu axtarın ~/.cache-db/.node-sync/ və davamlılıq vahidləri üçün WinNodeSync (planlaşdırılmış tapşırıq) və com.apple.syncd (launchd) bu adları çəkən geliştirici maşınlarında.
- Cron girişləri, planlaşdırılmış tapşırıqlar və ya launchd işləri yaradan Node prosesləri barədə xəbərdarlıq — qanuni kitabxanalar bunu nadir hallarda idxal zamanı edirlər.
- Kilid fayllarına və sancaqlanmış versiyalara üstünlük verin və xüsusən də hər hansı yeni kiçik "faydalı" asılılığın fərqini nəzərdən keçirin sıfır asılılıq paketləri dərc edildi əlaqəli deposu olmayan təsdiqlənməmiş hesablar tərəfindən.
Qeydiyyat müdafiəçiləri üçün əsas məsələ odur ki, quraşdırma zamanı monitorinq zəruridir, lakin kifayət deyil: məlumat faylının içərisində yerləşdirilmiş idxal vaxtı, taymer gecikdirilmiş dropper yalnız quraşdırma vaxtı yoxlamasından keçəcək və davamlılıq addımı çox vaxt tutulması mümkün olan ən yüksək siqnaldır.



