PhantomSync: Paket Kripto npm Ndhelikake Pencuri Dompet

PhantomSync: wolung paket npm pangembang kripto ndhelikake dropper sing telat lan terus-terusan

TL; DR

Penerbit npm tunggal ngirim wolung paket cilik sing jenenge kaya blok bangunan saben dina kanggo pangembangan blockchain lan dompet, base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, Lan crypto-validate-libSaben-saben nduweni utilitas sing bisa digunakake. Nanging, sawise utilitas kasebut ana blok kode sing bisa digunakake dhewe sing mlaku nalika modul diimpor.

Kira-kira 37 detik sawise impor, blok kasebut dekode muatan sing dikirim ing njero paket sing disamar minangka perlengkapan uji coba, nulis menyang file sing didhelikake ing direktori ngarep pangguna, ndhaptar dhewe kanggo miwiti maneh ing saben login ing Windows, macOS, lan Linux, lan ngluncurake skrip sing didekode minangka proses sing kapisah. Ora ana sing kedadeyan babagan iki nalika instalasi npm; iki ngenteni kode diimpor lan dilakokake, sing luwih sepi tinimbang instalasi.

Muatan ora buram. Iki dikirim minangka base64 polos, mula dekoding "test fixture" bakal mbalekake tahap kapindho kanthi lengkap: a dompet kripto lan maling rahasia sing ngenteni mesin nganggur, njupuk kunci pribadi lan frasa wiwitan, ngenkripsi saben panemuan nganggo kunci RSA-4096 sing wis di-hardcode, lan ngekstrak kanthi nyematkan menyang panyimpenan IPFS umum, lan menehi sinyal bali saben 12 jam.

Kita nglacak kluster kasebut minangka Sinkronisasi PhantomKabeh wolung paket kasebut ana ing registri npm nalika analisis, diterbitake ing sangisore siji akun.

Ekosistemnpm
Packagesbase58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-lib
Platform sing ditargetakeWindows, macOS, Linux
Prilaku intiDropper wektu impor sing ditundha didhelikake minangka piranti uji coba; nginstal persistensi lintas platform
PayloadPencuri dompet kripto lan rahasia, enkripsi RSA-4096, eksfiltrasi liwat pinning IPFS publik

Anatomi serangan

Saben paket katon ora ana gunané nalika diwaca pisanan. base58-utils, contone, yaiku sawetara kilobyte kode pembantu Base58 / Bitcoin-WIF sing ora gumantung - persis kaya sing dijanjekake jenenge. Kode sing relevan ana ing sawise modul kasebut modul.ekspor, ing ngendi pamaca sing mung ndeleng sisih ndhuwur file ora mungkin ndeleng: fungsi sing bisa nimbali dhewe sing njadwalake awake dhewe nganggo timer.

Rantai operasi, sing direkonstruksi saka sumber paket, mlaku kaya iki:

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

Ana rong pilihan desain sing narik kawigaten.

Muatan kasebut lelungan minangka piranti uji coba. Tahap kapindho ora ditulis minangka kode sing jelas. Iku manggon ing tes/jadwal/pasangan kunci.dat, file base64 sing jenenge nyampur karo paket sing ngaku bisa nangani pasangan kunci. Kanggo manungsa sing ndeleng tarball, katon kaya data conto; kanggo kode sing ditambahake, iku skrip kanggo dekode lan mbukak. Dropper dhewe ora ngemot alamat jaringan — sing ana ing tahap kapindho — nanging ora ana obfuscation tambahan: fixture minangka lapisan tunggal base64, mula dekode kasebut (base64 -d) mulihake kanthi lengkap sinkronisasi.js lan prilaku jaringane. Bagean sabanjure ngrembug apa sing ditindakake tahap sing wis pulih kasebut.

Detonasi ditundha lan ana gandheng cenenge karo impor, dudu instalasi. Amarga pemicu kasebut mbutuhake() ditambah timer ~37 detik tinimbang hook instalasi, prilaku kasebut ngindhari pamriksan sing mung nonton npm nginstal langkah, lan wektu tundha luwih suwe tinimbang akeh proses sandbox lan CI sing umure cendhak. Nalika ana sing dieksekusi, instalasi sing narik paket kasebut wis rampung.

Sawise skrip sing wis didekode ana ing disk ing ~/.cache-db/.node-sync/syncd.js — jalur sing dipilih kanggo diwaca kaya direktori cache rutin — dropper ndadekake bisa urip nalika di-reboot ing kabeh telung platform utama:

  • Linux: entri cron sing ngluncurake maneh skrip. Entri kasebut diinstal kanthi nyaring crontab sing wis ana liwat grep -v sing disinkronake, sing nduweni efek samping yaiku ora nglebokake entri anyar saka dhaptar polos sing njupuk jeneng sing padha.
  • Windows: tugas sing wis dijadwalake jenenge Sinkronisasi WinNode, disetel kanggo dilakokake maneh kanthi interval 12 menit.
  • macOS: proyek peluncuran sing diwenehi label com.apple.syncd, ana ing sawetara paket — label sing niru layanan sistem Apple sing sah.

Skrip banjur langsung diwiwiti minangka proses sing kapisah, saengga terus mlaku sawise program impor metu.

Apa sing ditindakake tahap kapindho

Amarga fixture kasebut minangka lapisan base64 tunggal, tahap kapindho dekode kanthi resik lan bisa diwaca kanthi lengkap. Kabeh wolung paket nggawa salah siji saka telung varian skrip sing padha, sing ngidentifikasi awake dhewe ing komentar header minangka phantom syncd v3 - topo durmiente (“tikel turu”). Pakaryane yaiku nyolong materi dompet cryptocurrency lan rahasia pangembang lan ngirim saka mesin kasebut. Cara iki mlaku kanthi langkah-langkah iki:

  • 1. Enteni nganti mesin ora aktif. Sadurunge nindakake apa-apa, sinkronisasi.js mriksa suwene pangguna ora aktif lan mung ngluwihi ambang batas (udakara 15 menit) — xprintidle ing Linux, ioreg HIDIdleTime ing macOS, lan query PowerShell idle-time ing Windows. Mula, panen cenderung kedadeyan nalika ora ana wong ing keyboard.
  • 2. Jupuk saklar aktivasi sing dikontrol saka kadohanSkrip iki njupuk konfigurasi cilik saka dead-drop sadurunge tumindak. Sumber utama yaiku URL mentah GitHub gist (gist.githubusercontent.com/juang55/…/cfg.txt); skrip mung diaktifake yen konfigurasi kasebut maca aktif=1Yen intine ora kasedhiya, bakal bali menyang telung pengenal konten IPFS sing wis di-hardcode, sing dijupuk liwat gateway umum. gateway.pinata.cloud, ipfs.io, Lan cloudflare-ipfs.comIki menehi operator kontrol lengen/disarm sawise kedadeyan lan fallback tahan takedown. (Varian paling cilik, dikirim ing validasi-crypto-lib, pembantu dompet-et, Lan utils-kunci-solana, lapisan inti wis dibusak lan mung gumantung marang pengenal IPFS.)
  • 3. Panen bahan lan rahasia dompet. Skrip kasebut mlaku ing direktori ngarep pangguna — ~/.config/solana, ~/.ethereum/toko kunci, ~/.pangecoran, ~/.topi atos, ~/.ssh, Lan Desktop/dokumen/Downloads (kalebu jeneng folder basa Spanyol), ditambah ~/.env lan file shell rc, lan sing padha AppData lokasi ing Windows. Iki nargetake kunci pribadi Ethereum, kunci WIF Bitcoin, frasa wiji BIP-39, pasangan kunci Solana, JSON toko kunci Ethereum, kunci SSH, lan variabel lingkungan sing nggawa rahasia. Varian sing luwih gedhe (ing abi-encode, base58-utils, eth-dev) nggawa kamus BIP-39 lengkap sing dumadi saka 2048 tembung lan nggunakake ekspresi reguler kanggo extract kunci individu lan frasa wiji sing divalidasi saka teks apa wae sing diwaca; rong varian sing luwih cilik tinimbang cocog karo file miturut tembung kunci (winih, mnemonik, dompet, metamask, phantom, ledger, trezor, …) lan unggah kabeh file.
  • 4. Enkripsi lan eksfiltrasi liwat layanan pinning umum. Saben temuan dibundel karo sidik jari host (jeneng panganggo@jeneng host, platform, cap wektu) lan dienkripsi nganggo kunci publik RSA-4096 sing wis di-hardcode sing dipasang ing skrip. Rekaman sing dienkripsi banjur diunggah kanthi nyemat menyang IPFS liwat api.pinata.cloud/pinning/pinJSONToIPFS, diautentikasi nganggo kredensial API Pinata sing wis di-hardcode. Ora ana server C2 khusus sing kudu disita: data sing dicolong diparkir ing panyimpenan desentralisasi umum, sing bisa dijupuk maneh dening operator nggunakake hash konten sing diasilake. Unggahan dipisahake karo sawetara detik jitter acak, lan log lokal cap wektu | jinis-kunci | hash-sing-dibalèkaké disimpen ing ~/.cache-db/.node-sync/.sl.
  • 5. Terusake lan suarake kanthi siklus 12 jam. Tahap kapindho netepake maneh persistensi dhewe — entri cron ing Linux, a com.apple.syncd launchd job ing macOS, lan tugas sing dijadwalake jenenge Sinkronisasi Node Windows ing Windows — disetel kanggo mlaku maneh saben 12 jam. Elinga iki minangka beda Jeneng tugas Windows saka sing diinstal dropper (Sinkronisasi WinNode); loro-lorone pantes diburu.

timeline

Wolung paket kasebut diterbitake kanthi ringkes tanggal 13-07-2026 lan 14-07-2026. Ana sing nggawa luwih saka siji versi; dropper-e padha ing saben versi, mung offset baris sing owah nalika ukuran kode utilitas sing ora mbebayani ing ndhuwure owah.

tanggalEvent
2026-07-13Paket pisanan ing kluster katon ing sangisore siji penerbit (solana-key-utils, eth-wallet-helpers, crypto-validate-lib lan versi awal saka liyane)
2026-07-13 → 07-14Jeneng-jeneng sing isih ana lan versi tindak lanjut diterbitake; dropper sing padha ditambahake ing saben
2026-07-14Kabeh wolung ditandhani lan dianalisis; saben paket isih bisa diinstal saka registri

Ing sadawane wektu, reputasi registri penerbit obah saka netral ing wiwitan kluster dadi negatif banget amarga deteksi nglumpuk — efek samping sing bisa diamati saka paket sing ditandhani, dudu fitur sing dirancang.

Indikator Kompromi

Kabeh indikator ing ngisor iki dikonfirmasi ana nalika analisis — sing ana ing tabel "Tahap Kapindho" kanthi dekoding tes/jadwal/pasangan kunci.dat lan maca sing wis dipulihake sinkronisasi.js.

Berkas lan jalur

indikatorRole
~/.cache-db/.node-sync/syncd.jsTahap kapindho sing didekode, ditulis nganggo mode 0o700
~/.cache-db/.node-sync/.slLog eksfiltrasi lokal (stempel wektu | jinis kunci | hash IPFS)
test/fixtures/keypairs.datPayload sing dienkode Base64 sing dipasang ing njero tarball minangka "test fixture"

Infrastruktur jaringan tahap kapindho (dipulihake saka syncd.js)

indikatorRole
gist.githubusercontent.com/juang55/b298754cb72942b1cdcf02ccd45cde2f/raw/cfg.txtAktivasi mati-matian; skrip mung mlaku yen konfigurasi diwaca active=1
Qmcqz3w8j4qFQXDAXAxnrdc2oSX3nzBT4NqtpTqL8mr1gaCadangan konfigurasi IPFS (CID)
QmdTXoqVmTHY1i4ZWLdLkoQ9YChp5TXPh5cWXwnAYZt5iFCadangan konfigurasi IPFS (CID)
QmfJkLU5gdCpqbbqEjWYC2anXW9FmuEeSLLeLiHVJKYUjpCadangan konfigurasi IPFS (CID)
gateway.pinata.cloud, ipfs.io, cloudflare-ipfs.comGerbang IPFS sing digunakake kanggo njupuk fallback konfigurasi
api.pinata.cloud/pinning/pinJSONToIPFSTitik pungkasan eksfiltrasi, data sing dicolong disematkan menyang IPFS umum
Kunci API Pinata13c766575b9270a9825d, kredensial eksfiltrasi sing dikode keras

Target pangumpulan tahap kapindho (dipulihake saka syncd.js)

indikatorRole
~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.hardhat, ~/.ssh, ~/.env, file shell rcDirektori/file sing digoleki kunci lan rahasia
AppData\Roaming\Solana, AppData\Local\ethereum\keystorePadanan Windows sing digoleki
Jinis artefak sing dipanenKunci pribadi ETH, Bitcoin WIF, frasa wiji BIP-39, pasangan kunci Solana, JSON toko kunci Ethereum, kunci SSH, vars lingkungan rahasia

Artefak kegigihan

platformindikator
Linuxpeluncuran entri cron syncd.js; diinstal liwat crontab sing disaring liwat grep -v syncd
Windowstugas sing wis dijadwalake WinNodeSync (pipet) lan WindowsNodeSync (tahap kapindho)
MacOSlabel peluncuran com.apple.syncd
KabehTahap kapindho terus maneh sajrone siklus 12 jam

Prilaku

  • Fungsi sing bisa ngundang dhewe ditambahake sawise modul.ekspor, ngatur jadwal nyetelWektu entek saka ~37,000 ms kanggo impor.
  • proses_anak ngasilake ("simpul", ) karo set pilihan sing kapisah.
  • Aktivasi idle-gated ing tahap kapindho (xprintidle / ioreg Wektu nganggur HIDIdleTime / PowerShell; ambang ~15 menit).
  • Enkripsi RSA-4096 saben-nemokake, banjur HTTPS POST menyang API pinning IPFS umum.

Paket lan versi (npm, penerbit solbuilder_io)

paketversi
base58-utils1.0.0, 1.0.1, 1.0.3
abi-encode1.0.0, 1.0.1, 1.0.2
eth-dev1.0.0, 1.0.1, 1.0.2
arb-kit1.0.0, 1.0.1
layer2-sdk1.0.0, 1.0.1
solana-key-utils1.0.0
eth-wallet-helpers1.0.0
crypto-validate-lib1.0.0

Publisher

  • solbuilder_io - angel_lopez89[@]proton[.]aku, email durung diverifikasi, ora ana akun kontrol sumber sing diverifikasi, ora ana repositori sing disambung.

Atribusi & Prilaku sing Diamati

Wolung paket kasebut nduweni siji akun penerbit lan siji payload. Saben paket kasebut prasaja — sawetara kilobyte kode utilitas nyata kanthi dropper sing padha — diterbitake tanpa repositori sing disambung lan ing sangisore email gaya sekali pakai sing durung diverifikasi. Keseragaman kasebut, jalur drop sing dienggo bareng, label persistensi sing dienggo bareng, lan sing dienggo bareng pasangan tombol.dat Berkas pementasan kuwi sing ngiket kluster kasebut.

Bungkusan-bungkusan kasebut pancen blak-blakan babagan tindak-tanduke dhewe. utils-kunci-solana nggawa komentar inline sing njlèntrèhaké blok sing dilampiraké kanthi cara sing prasaja — siji menehi label PHANTOM: kegigihan sing ora katon, liyane (ing basa Spanyol) maca Ejecutar topo en background, "jalanake mole ing latar mburi." Iki minangka anotasi kode dhewe babagan apa sing ditindakake; jeneng kampanye ing kiriman iki dijupuk saka label pisanan kasebut bebarengan karo simpul palsu "daemon sinkronisasi" (sinkronisasi) sing ditiru dening mesin kegigihan.

Kita mung njlèntrèhaké apa sing ditindakake kode kasebut kanthi cetha. Jeneng paket - kabeh istilah crypto, wallet, lan blockchain-tooling - nuduhaké pamirsa pangembang sing paling mungkin narik jeneng kasebut; ora kanthi otomatis nemtokaké sapa penerbité. Tahap kapindho bisa dipulihaké kanthi lengkap kanthi dekoding fixture base64, lan prilakuné diterangake ing ndhuwur: ngumpulake kunci wallet, frasa wiji, lan rahasia lan ngekstrak, dienkripsi RSA, menyang panyimpenan IPFS umum liwat Pinata. Pilihan desain sing penting yaiku ora anané server C2 pribadi - konfigurasi teka saka gist GitHub lan IPFS, lan data sing dicolong diparkir ing panyimpenan desentralisasi umum sing dikunci déning hash konten, sing loro-lorone luwih angel disita tinimbang host sing dikontrol penyerang tunggal. Ora ana laporan umum sadurungé sing cocog karo kluster iki sing ditemokake nalika nulis iki.

Dampak, Tren & Pandhuan kanggo Para Pembela

Sapa sing kebongkar. Sapa waé sing nambahake salah siji paket iki menyang proyèk Node banjur mbukak kode sing ngimpor. Amarga detonasi iku wektu impor tinimbang wektu instalasi, mung duwe paket sing ana ora cukup — nanging panggunaan normal sing mbukak modul tekan payload. Jeneng umpan kasebut nargetake para pangembang sing mbangun ing Ethereum, Solana, Arbitrum, Layer-2, lan piranti dompet/encoding umum — populasi sing paling mungkin duwe aset sing digoleki tahap kapindho. Sapa waé sing mbukak salah siji modul iki ing mesin sing nyekel kunci dompet, frasa wiji, keystore, kunci SSH, utawa .NS rahasia kudu nganggep kredensial kasebut minangka wis disusupi lan diputer.

Rong pola sing pantes diinternalisasi. First, muatan-minangka-perlengkapan: ngirim tahap kapindho minangka base64 ing njero file data sing jenenge masuk akal (tes/jadwal/pasangan kunci.dat) njaga sumber paket sing katon katon resik lan ndorong konten sing mbebayani menyang file sing asring dianggep minangka data inert dening alat review lan skim manungsa. Kapindho, Eksekusi wektu impor sing ditundha kanthi persistensi lintas platformMindhah pemicu saka hook instalasi, nambahake timer, banjur nerusake ing cron, tugas sing dijadwalake, lan launchd minangka langkah sing disengaja saka teknik skrip instalasi sing luwih rame sing paling diawasi kanthi rapet dening pemindaian registri otomatis.

Pandhuan kanggo para pembela lan pangreksa:

  • Nganggep kode sing ditambahake sawise modul.ekspor minangka prioritas review — logika dropper kerep ndhelik ing sangisore permukaan modul "nyata".
  • Aja nganggep file data iku ora aktif. Gumpalan base64 ing sangisore tes/jadwal/ sing diwaca nalika runtime lan didekode iku jejer karo file fixture sing bisa dieksekusi; tandhani maca runtime file fixture sing menehi feed fungsi/eval/nulis-banjur-ngendhog rantai.
  • Nggoleki dalan mudhun ~/.cache-db/.sinkronisasi-node/ lan kanggo unit persistensi Sinkronisasi WinNode (tugas sing wis dijadwalake) lan com.apple.syncd (launchd) ing mesin pangembang sing narik jeneng-jeneng iki.
  • Bebaya babagan proses Node sing nggawe entri cron, tugas sing dijadwalake, utawa proyek sing diluncurake — perpustakaan sing sah arang nindakake iki nalika impor.
  • Luwih seneng file kunci lan versi sing disemat, lan deleng bedane saka katergantungan "utilitas" cilik anyar, utamane paket tanpa ketergantungan diterbitake dening akun sing durung diverifikasi tanpa repositori sing ana gandhengane.

Kanggo para pembela registri, intine yaiku pemantauan install-hook iku perlu nanging ora cukup: dropper wektu impor sing ditundha wektu sing dipasang ing njero file data bakal lulus pamriksaan wektu instalasi wae, lan langkah persistensi asring dadi sinyal sing paling banter sing isih bisa diamati.

piranti lunak-piranti-sca-piranti-analisis-komposisi
Prioritasake, ndandani, lan amanake risiko piranti lunak sampeyan
Entuk Akun Gratismu.
Ora ana kertu kredit.

Amanake pangembangan lan pangiriman piranti lunak sampeyan

karo Suite Produk Xygeni