TL; DR
Hiji penerbit npm ngirimkeun dalapan pakét alit anu namina siga blok wangunan sadidinten pikeun pamekaran blockchain sareng dompét, base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, sarta crypto-validate-libMasing-masing ngandung utilitas anu tiasa dianggo. Nanging, saatos utilitas éta ditambihkeun blok kode anu tiasa dianggo nyalira anu dijalankeun nalika modul diimpor.
Kira-kira 37 detik saatos impor, blok éta ngadekode payload anu dikirimkeun ka jero pakét anu disamar salaku fixture tés, nyeratna kana file anu disumputkeun dina diréktori home pangguna, ngadaptarkeun dirina pikeun ngamimitian deui dina unggal login dina Windows, macOS, sareng Linux, teras ngaluncurkeun skrip anu didekode salaku prosés anu misah. Teu aya nanaon ngeunaan ieu anu hurung nalika pamasangan npm; éta ngantosan kode diimpor sareng dijalankeun, anu mangrupikeun momen anu langkung sepi tibatan pamasangan.
Muatanna henteu opak. Éta dikirimkeun salaku base64 polos, janten dekoding "fixture tés" mulangkeun tahap kadua sacara lengkep: a dompét kripto sareng maling rahasia anu ngantosan mesin teu dianggo, ngumpulkeun konci pribadi sareng frasa bibit, ngenkripsi unggal pamanggihan nganggo konci RSA-4096 anu di-hardcode, teras ngaluarkeunana ku cara nyematkan kana panyimpenan IPFS umum, anu ngirimkeun sinyal deui unggal 12 jam.
Urang ngalacak klaster salaku Sinkronisasi PhantomSadaya dalapan pakét aya dina pendaptaran npm nalika analisis, diterbitkeun dina hiji akun.
| ékosistem | npm |
| bungkusan | base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-lib |
| Platform anu dituju | Windows, macOS, Linux |
| Paripolah inti | Dropper waktos impor anu ditunda disumputkeun salaku perlengkapan tés; masang persistensi lintas platform |
| Beban | Pencuri dompét kripto sareng rahasia, énkripsi RSA-4096, éksfiltrasi ngalangkungan pinning IPFS umum |
Anatomi serangan
Unggal bungkusan katingalina biasa waé dina bacaan munggaran. base58-utils, contona, nyaéta sababaraha kilobyte kodeu pembantu Base58 / Bitcoin-WIF anu gumantung kana nol — persis sapertos anu dijanjikeun ku namina. Kodeu anu relevan aya saatos modulna modul.ékspor, dimana nu maca nu keur maca sakilas luhureun file sigana moal ningali: fungsi nu nimukeun sorangan nu ngajadwalkeun sorangan maké timer.
Ranté operasi, anu diwangun deui tina sumber pakét, dijalankeun sapertos kieu:
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 Dua pilihan desain anu nonjol.
Muatan ngarambat salaku perlengkapan uji. Tahap kadua teu ditulis salaku kode anu jelas. Éta hirup di tés/jadwal/pasangan konci.dat, file base64 anu ngaranna nyampur kana pakét anu ngaku tiasa nanganan pasangan konci. Pikeun manusa anu ningali tarball, éta katingalina sapertos data sampel; pikeun kode anu dilampirkeun, éta mangrupikeun skrip pikeun ngadekode sareng ngajalankeun. Dropper éta sorangan henteu ngandung alamat jaringan — éta aya dina tahap kadua — tapi teu aya obfuscation tambahan: fixture mangrupikeun lapisan tunggal base64, janten ngadekode éta (base64 -d) mulangkeun deui sacara lengkep syncd.js sareng paripolah jaringanna. Bagian salajengna ngajelaskeun naon anu dilakukeun ku tahapan anu dipulihkeun éta.
Detonasi ditunda sareng dihijikeun kana impor, sanés kana pamasangan. Kusabab pemicuna nyaéta merlukeun() ditambah timer ~37 detik tinimbang hook pamasangan, paripolahna nyingkahan cék anu ngan ukur ningali npm install léngkah, sareng reureuhna langkung lami tibatan seueur sandbox sareng CI anu umurna pondok. Nalika aya anu dijalankeun, pamasangan anu narik pakét parantos lami réngsé.
Sakali skrip anu didekode aya dina disk dina ~/.cache-db/.node-sync/syncd.js — jalur anu dipilih pikeun dibaca sapertos diréktori cache rutin — dropper ngajantenkeun éta salamet nalika di-reboot dina sadaya tilu platform utama:
- Linux: hiji éntri cron anu ngaluncurkeun deui skrip. Éntri éta dipasang ku cara nyaring crontab anu tos aya ngaliwatan grep -v singkronisasi, anu gaduh efek samping nyaéta ninggalkeun entri anyar tina daptar polos anu ngarékam nami anu sami.
- Windows: tugas anu dijadwalkeun anu namina WinNodeSync, disetel pikeun dijalankeun deui dina interval 12 menit.
- macOS: padamelan anu diluncurkeun dilabélan com.apple.syncd, aya dina sababaraha pakét — labél anu niru layanan sistem Apple anu sah.
Skrip teras langsung dimimitian salaku prosés anu misah, janten teras jalan saatos program impor kaluar.
Naon anu dilakukeun ku tahap kadua
Kusabab fixture-na mangrupikeun lapisan base64 tunggal, tahap kadua dekode kalayan bersih sareng tiasa dibaca sacara lengkep. Sadaya dalapan pakét ngagaduhan salah sahiji tina tilu varian skrip anu sami, anu ngidentipikasi dirina dina koméntar header salaku phantom syncd v3 - topo durmiente (“tahi lalat sare”). Padamelanna nyaéta maok bahan dompét cryptocurrency sareng rahasia pamekar teras ngirimkeunana tina mesin. Éta dijalankeun dina léngkah-léngkah ieu:
- 1. Antosan dugi ka mesin teu dianggo. Sateuacan ngalakukeun nanaon, syncd.js mariksa sabaraha lami pangguna teu aktip sareng ngan ukur ngalangkungan ambang batas (sakitar 15 menit) — xprintidle dina Linux, ioreg HIDIdleTime dina macOS, sareng PowerShell idle-time query dina Windows. Ku kituna, panén biasana lumangsung nalika teu aya nu maké kibor.
- 2. Candak saklar aktivasi anu dikontrol jarak jauhSkripna nyokot konfigurasi leutik tina dead-drop sateuacan dijalankeun. Sumber utama nyaéta URL atah gist GitHub (gist.githubusercontent.com/juang55/…/cfg.txt); skrip ngan ukur aktip upami konfigurasi éta maca aktif = 1Upami inti sari henteu sayogi, éta bakal uih deui ka tilu idéntifikasi eusi IPFS anu di-hardcode, anu dicandak ngalangkungan gateway umum. gateway.pinata.cloud, ipfs.io, sarta cloudflare-ipfs.comIeu masihan operator kontrol panangan/disarm saatos kajadian sareng fallback anu tahan takedown. (Varian pangleutikna, dikirim dina crypto-validate-lib, nu ngabantuan dompét-éta, sarta solana-konci-utils, lapisan inti na dihapus sareng ngan ukur ngandelkeun idéntifikasi IPFS.)
- 3. Panén bahan sareng rahasia dompét. Skripna ngajalankeun diréktori utama pangguna — ~/.config/solana, ~/.ethereum/toko konci, ~/.pabrik pengecoran, ~/.topi teuas, ~ / .shsh, sarta desktop/dokumén/undeuran (kalebet nami folder basa Spanyol), ditambah ~/.env sareng file shell rc, sareng anu sami AppData lokasi dina Windows. Éta narékahan konci pribadi Ethereum, konci WIF Bitcoin, frasa bibit BIP-39, pasangan konci Solana, JSON toko konci Ethereum, konci SSH, sareng variabel lingkungan anu ngandung rahasia. Varian anu langkung ageung (dina abi-encode, base58-utils, éth-dev) ngandung kamus BIP-39 lengkep anu diwangun ku 2048 kecap sareng nganggo éksprési régulér pikeun sari konci individu sareng frasa bibit anu divalidasi tina téks naon waé anu dibacana; dua varian anu langkung alit gantina cocogkeun file ku kecap konci (siki, mnemonik, dompet, metamask, phantom, ledger, trezor, …) sareng unggah sadayana file.
- 4. Énkripsi sareng éksfiltrasi ngalangkungan layanan pinning umum. Unggal panemuan dibundel ku sidik jari host (ngaran pangguna@ngaran host, platform, cap waktu) sareng dienkripsi nganggo konci publik RSA-4096 anu di-hardcode anu dipasang dina skrip. Rékaman anu dienkripsi teras diunggah ku cara nyematkan kana IPFS via api.pinata.cloud/pinning/pinJSONToIPFS, diauténtikasi nganggo kredensial API Pinata anu di-hardcode. Teu aya server C2 anu dijieun khusus pikeun disita: data anu dipaling disimpen dina panyimpenan desentralisasi umum, anu tiasa dicandak deui ku operator nganggo hash eusi anu dihasilkeun. Unggahan dipisahkeun ku sababaraha detik jitter acak, sareng log lokal cap waktu | tipe-konci | hash-anu-dibalikkeun disimpen di ~/.cache-db/.node-sync/.sl.
- 5. Teruskeun sareng hurungkeun dina siklus 12 jam. Tahap kadua ngawangun deui persistensi na sorangan — éntri cron dina Linux, a com.apple.syncd ngaluncurkeun padamelan dina macOS, sareng tugas anu dijadwalkeun dingaranan Sinkronisasi Node Windows dina Windows — disetel pikeun dijalankeun deui unggal 12 jam. Catet ieu mangrupikeun béda Ngaran tugas Windows tina anu dipasang ku dropper (WinNodeSync); duanana pantes diburu.
Gariswanci
Dalapan pakét éta dipedalkeun sacara singget dina 2026-07-13 sareng 2026-07-14. Sababaraha pakét ngandung leuwih ti hiji vérsi; dropper-na sarua di sakuliah vérsi, ngan ukur offset garis anu robah nalika ukuran kode utilitas anu teu bahaya di luhurna robah.
| tanggal | kajadian |
|---|---|
| 2026-07-13 | Paket munggaran dina klaster muncul dina hiji penerbit (solana-key-utils, eth-wallet-helpers, crypto-validate-lib sareng vérsi awal sésana) |
| 2026-07-13 → 07-14 | Ngaran-ngaran sésana sareng vérsi susulan parantos diterbitkeun; dropper anu sami anu dilampirkeun dikirimkeun dina unggal |
| 2026-07-14 | Sadayana dalapan ditandaan sareng dianalisis; unggal pakét masih tiasa dipasang tina pendaptaran |
Dina waktu anu singget, reputasi pendaptaran penerbit robah ti anu ampir nétral dina awal klaster ka anu négatip pisan sabab deteksi akumulasi — efek samping anu tiasa dititénan tina pakét anu ditandaan, sanés fitur anu dirancang.
Indikator Kompromi
Sadaya indikator di handap ieu dikonfirmasi aya dina waktos analisis — anu aya dina tabel "Tahap Kadua" ku cara ngadekodekeun tés/jadwal/pasangan konci.dat sareng maca anu parantos dibalikeun syncd.js.
File sareng jalur
| indikator | peran |
|---|---|
~/.cache-db/.node-sync/syncd.js | Tahap kadua anu didekode, ditulis nganggo mode 0o700 |
~/.cache-db/.node-sync/.sl | Log éksfiltrasi lokal (stempel waktos | jinis konci | hash IPFS) |
test/fixtures/keypairs.dat | Payload anu dikodekeun Base64 disimpen di jero tarball salaku "fixture uji" |
Infrastruktur jaringan tahap kadua (dicandak tina syncd.js)
| indikator | peran |
|---|---|
gist.githubusercontent.com/juang55/b298754cb72942b1cdcf02ccd45cde2f/raw/cfg.txt | Aktivasina teu jalan; skrip ngan ukur tiasa dijalankeun upami konfigurasina dibaca active=1 |
Qmcqz3w8j4qFQXDAXAxnrdc2oSX3nzBT4NqtpTqL8mr1ga | Cadangan konfigurasi IPFS (CID) |
QmdTXoqVmTHY1i4ZWLdLkoQ9YChp5TXPh5cWXwnAYZt5iF | Cadangan konfigurasi IPFS (CID) |
QmfJkLU5gdCpqbbqEjWYC2anXW9FmuEeSLLeLiHVJKYUjp | Cadangan konfigurasi IPFS (CID) |
gateway.pinata.cloud, ipfs.io, cloudflare-ipfs.com | Gerbang IPFS anu dianggo pikeun nyandak cadangan konfigurasi |
api.pinata.cloud/pinning/pinJSONToIPFS | Titik tungtung éksfiltrasi, data anu dipaling disematkeun kana IPFS umum |
| Konci API Pinata | 13c766575b9270a9825d, kredensial éksfiltrasi anu dikodekeun sacara teuas |
Target pangumpulan tahap kadua (diambil tina syncd.js)
| indikator | peran |
|---|---|
~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.hardhat, ~/.ssh, ~/.env, file cangkang rc | Diréktori/file anu dipilarian pikeun konci sareng rusiah |
AppData\Roaming\Solana, AppData\Local\ethereum\keystore | Padanan Windows anu dipilarian |
| Jenis artefak anu dipanén | Konci pribadi ETH, Bitcoin WIF, frasa awal BIP-39, pasangan konci Solana, JSON toko konci Ethereum, konci SSH, vars lingkungan rahasia |
Artefak kegigihan
| panggung | indikator |
|---|---|
| Linux | peluncuran entri cron syncd.js; dipasang via crontab anu disaring grep -v syncd |
| Windows | tugas anu dijadwalkeun WinNodeSync (pipet) jeung WindowsNodeSync (tahap kadua) |
| macOS | labél peluncuran com.apple.syncd |
| sadaya | Tahap kadua lumangsung deui dina siklus 12 jam |
Paripolah
- Fungsi anu nitah sorangan ditambahkeun saatosna modul.ékspor, ngajadwalkeun a setTimeout tina ~37,000 ms impor.
- prosés_anak nembongan ("node", ) kalawan susunan pilihan anu misah.
- Aktivasina dianggurkeun dina tahap kadua (xprintidle / ioreg HIDIdleTime / PowerShell waktos nganggur; ambang ~15 menit).
- Per-finding énkripsi RSA-4096, teras HTTPS POST ka API pinning IPFS umum.
Pakét sareng vérsi (npm, penerbit solbuilder_io)
| paket | versi |
|---|---|
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 |
pausahaan nu ngaluarkeun
- solbuilder_io - angel_lopez89[@]proton[.]kuring, surelek teu diverifikasi, teu aya akun kontrol sumber anu diverifikasi, teu aya repositori anu ditautan.
Atribusi & Paripolah anu Diamati
Dalapan pakét éta ngabagi hiji akun penerbit sareng hiji payload. Masing-masing mangrupikeun pakét anu teu pati penting — sababaraha kilobyte kode utilitas nyata kalayan dropper anu sami ditambihkeun — diterbitkeun tanpa repositori anu ditautan sareng dina email gaya anu tiasa dianggo sakali anu teu diverifikasi. Éta kaseragaman, jalur leupaskeun anu dibagikeun, labél persistensi anu dibagikeun, sareng anu dibagikeun pasangan konci.dat file pementasan nyaéta anu ngahijikeun klaster.
Bungkusan-bungkusan éta luar biasa terus terang ngeunaan paripolahna sorangan. solana-konci-utils mawa koméntar inline anu ngajelaskeun blok anu dilampirkeun sacara lugas — hiji labélna PHANTOM: kegigihan anu teu katingali, anu sanésna (dina basa Spanyol) dibaca Ejecutar topo en background, "jalankeun mol di tukang." Ieu mangrupikeun anotasi kode sorangan ngeunaan naon anu dilakukeunana; nami kampanye dina tulisan ieu dicandak tina labél munggaran éta babarengan sareng simpul palsu "daemon sinkronisasi" (disinkronkeun) anu ditiru ku mesin kegigihan.
Kami ngan ukur ngajelaskeun naon anu dilakukeun ku kodeu sacara katempo. Ngaran pakét — sadaya istilah crypto, dompét, sareng blockchain-tooling — nunjukkeun pamiarsa pamekar anu paling dipikaresep pikeun narik éta ku nami; éta henteu ku nyalira netepkeun saha penerbitna. Tahap kadua tiasa dibalikeun deui sapinuhna ku cara ngadekodekeun fixture base64, sareng paripolahna dijelaskeun di luhur: éta ngumpulkeun konci dompét, frasa bibit, sareng rahasia teras ngaluarkeunana, dienkripsi RSA, ka panyimpenan IPFS umum via Pinata. Pilihan desain anu penting nyaéta henteuna server C2 pribadi — konfigurasi sumping tina gist GitHub sareng IPFS, sareng data anu dipaling diparkir dina panyimpenan desentralisasi umum anu dikonci ku hash eusi, anu duanana langkung sesah disita tibatan hiji host anu dikontrol ku panyerang. Teu aya laporan umum sateuacanna anu cocog sareng klaster ieu anu kapendak dina waktos nyerat.
Dampak, Tren & Pituduh pikeun Para Pembela
Saha anu kakeunaan. Saha waé anu nambihan salah sahiji pakét ieu kana proyék Node teras ngajalankeun kode anu ngimporna. Kusabab detonasi mangrupikeun waktos impor tinimbang waktos pamasangan, ngan saukur gaduh pakét anu aya henteu cekap — tapi panggunaan normal anu ngamuat modul ngahontal payload. Nami daya tarik nargétkeun pamekar anu ngawangun dina Ethereum, Solana, Arbitrum, Layer-2, sareng alat dompét/encoding umum — populasi anu paling dipikaresep gaduh aset anu diburu tahap kadua. Saha waé anu ngajalankeun salah sahiji modul ieu dina mesin anu nyepeng konci dompét, frasa bibit, keystores, konci SSH, atanapi .env rusiah kedah nganggap kredensial éta salaku anu parantos dibobol sareng diputer.
Dua pola anu pantes diinternalisasi. heula, muatan-salaku-fixture: ngirimkeun tahap kadua salaku base64 di jero file data anu dingaranan sacara masuk akal (tés/jadwal/pasangan konci.dat) ngajaga sumber pakét anu katingali katingali bersih sareng ngadorong eusi jahat kana file anu alat ulasan sareng skim manusa sering dianggap salaku data inert. Kadua, palaksanaan anu ditunda waktos impor kalayan persistensi lintas platform: mindahkeun pemicu tina hook pamasangan, nambahkeun timer, teras neraskeun cron, tugas anu dijadwalkeun, sareng launchd mangrupikeun léngkah anu disengaja tina téknik skrip pamasangan anu langkung ribut anu paling diawaskeun ku pamindaian pendaptaran otomatis.
Pituduh pikeun nu ngajaga sareng nu ngajaga:
- Perlakukeun kode anu ditambahkeun saatosna modul.ékspor salaku prioritas ulasan — logika dropper sering nyumput di handapeun permukaan modul "asli".
- Ulah nganggap file data teu aktip. Gumpalan base64 di handapeun tés/jadwal pertandingan/ anu dibaca nalika runtime sareng didekodekeun aya dieksekusi-padeukeut; tandai bacaan runtime tina file fixture anu ngeusian fungsi/ngabuktikeun/nulis-terus-spawn ranté.
- Ngaburu jalur turun ~/.cache-db/.node-sync/ sareng pikeun unit persistensi WinNodeSync (tugas anu dijadwalkeun) sareng com.apple.syncd (launchd) dina mesin pamekar anu narik nami-nami ieu.
- Bewara ngeunaan prosés Node anu nyiptakeun entri cron, tugas anu dijadwalkeun, atanapi padamelan anu diluncurkeun — perpustakaan anu sah jarang ngalakukeun ieu nalika impor.
- Leuwih resep kana lockfiles sareng vérsi anu disematkeun, sareng marios bédana tina katergantungan "utilitas" alit anu énggal, khususna pakét enol-katergantungan diterbitkeun ku akun anu teu diverifikasi tanpa gudang anu ditautan.
Pikeun anu ngabela pendaptaran, intina nyaéta pangawasan install-hook téh perlu tapi teu cekap: dropper anu ditunda waktu impor anu disimpen di jero file data bakal lulus cék waktu-pamasangan hungkul, sareng léngkah persistensi sering janten sinyal anu paling tarik anu kedah dititénan.




