PhantomSync: npm kripto paketi skrivaju kradljivca novčanika

PhantomSync: osam npm paketa za kripto-razvoj skriva odloženi, samoodrživi dropper

TL; DR

Jedan NPM izdavač isporučio je osam malih paketa čija imena izgledaju kao svakodnevni gradivni blokovi za razvoj blockchaina i novčanika, base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, I crypto-validate-libSvaki od njih sadrži funkcionalni uslužni program. Međutim, nakon tog uslužnog programa dodaje se blok koda koji se sam poziva i pokreće u trenutku kada se modul uveze.

Otprilike 37 sekundi nakon uvoza, taj blok dekodira korisni teret koji se isporučuje unutar paketa prerušen u testnu opremu, zapisuje ga u skrivenu datoteku u korisničkom početnom direktoriju, registruje se za ponovno pokretanje svakih login na Windowsu, macOS-u i Linuxu, i pokreće dekodirani skript kao odvojeni proces. Ništa u vezi s ovim se ne aktivira tokom instalacije npm-a; čeka da se kod uveze i pokrene, što je tiši trenutak od instalacije.

Korisni teret nije neproziran. Isporučuje se kao obična base64, tako da dekodiranje "testne opreme" u potpunosti oporavlja drugu fazu: a kripto-novčanik i kradljivac tajni koji čeka da mašina miruje, prikuplja privatne ključeve i početne fraze, šifrira svaki pronađeni podatak fiksno kodiranim RSA-4096 ključem i izvlači ga tako što ga zakači na javnu IPFS pohranu, šaljući signal nazad svakih 12 sati.

Pratimo klaster kao PhantomSyncSvih osam paketa je bilo aktivno u npm registru u vrijeme analize, objavljeno pod jednim računom.

Ekosistemnpm
paketibase58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-lib
Ciljane platformeWindows, macOS, Linux
Osnovno ponašanjeOdloženi, skriveni dropper za vrijeme uvoza kao testna konfiguracija; instalira višeplatformsku perzistenciju
Koristan teretKradljivac kripto novčanika i tajni, RSA-4096 enkripcija, krađa putem javnog IPFS pinninga

Anatomija napada

Svaki paket na prvi pogled izgleda neupadljivo. base58-utility, na primjer, je nekoliko kilobajta pomoćnog koda Base58 / Bitcoin-WIF bez ovisnosti - upravo ono što ime obećava. Relevantni kod se nalazi nakon modula modul.izvozi, gdje čitalac koji prelistava vrh datoteke vjerovatno neće pogledati: samopozivajuća funkcija koja sama sebe zakazuje pomoću tajmera.

Lanac operacija, rekonstruisan iz izvornog koda paketa, funkcioniše ovako:

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

Ističu se dva dizajnerska izbora.

Korisni teret se kreće kao testna naprava. Druga faza nije napisana kao očigledan kod. Ona se nalazi u test/fikse/parovi ključeva.dat, base64 datoteku čije se ime uklapa u paket koji tvrdi da obrađuje parove ključeva. Čovjeku koji pregleda tarball, izgleda kao uzorak podataka; za dodani kod, to je skripta koju treba dekodirati i pokrenuti. Sam dropper ne sadrži mrežnu adresu - one se nalaze u drugoj fazi - ali nema dodatnog zamagljivanja: fiksment je jedan sloj base64, tako da njegovo dekodiranje (base64 -d) oporavlja puni iznos syncd.js i njegovo ponašanje na mreži. Sljedeći odjeljak objašnjava šta ta oporavljena faza radi.

Detonacija je odgođena i vezana za uvoz, a ne za instalaciju. Jer okidač je zahtijevati() plus tajmer od ~37 sekundi umjesto instalacijske kuke, ponašanje zaobilazi provjere koje samo prate npm install korak, a kašnjenje traje duže od mnogih kratkotrajnih sandbox i CI pokretanja. Dok se išta izvrši, instalacija koja je povukla paket je odavno završena.

Nakon što se dekodirani scenarij nalazi na disku na ~/.cache-db/.node-sync/syncd.js — putanja odabrana da se čita kao rutinski direktorij keša — dropper omogućava da preživi ponovna pokretanja na sve tri glavne platforme:

  • Linux: cron unos koji ponovo pokreće skriptu. Unos se instalira filtriranjem postojećeg crontab-a kroz grep -v syncd, što ima nuspojavu izostavljanja novog unosa iz običnog popisa koji grepuje za isto ime.
  • Windows: zakazani zadatak pod nazivom WinNodeSync, postavljeno za reprizu u intervalu od 12 minuta.
  • macOS: označeni zadatak lansiranja com.apple.syncd, prisutna u nekoliko paketa - oznaka koja imitira legitimnu Appleovu sistemsku uslugu.

Skripta se zatim odmah pokreće kao odvojeni proces, tako da nastavlja s radom nakon što se program za uvoz završi.

Šta radi druga faza

Budući da je fiksator jednoslojni base64, druga faza se dekodira čisto i može se pročitati u cijelosti. Svih osam paketa sadrži jednu od tri varijante istog skripta, koji se u komentaru zaglavlja identificira kao phantom syncd v3 — topo durmiente („uspavana krtica“). Njegov posao je krađa materijala kripto-novčanika i tajni programera te njihovo uklanjanje s mašine. Izvodi se u ovim koracima:

  • 1. Sačekajte dok mašina ne prestane raditi. prije nego bilo šta uradiš, syncd.js provjerava koliko dugo je korisnik bio neaktivan i nastavlja tek nakon određenog praga (oko 15 minuta) — xprintidle na Linuxu, ioreg HIDIdleTime na macOS-u i PowerShell upit za vrijeme neaktivnosti na Windowsu. Stoga se prikupljanje podataka obično događa kada niko nije za tastaturom.
  • 2. Nabavite daljinski upravljani prekidač za aktivacijuSkripta povlači malu konfiguraciju iz dead-dropa prije nego što reaguje. Primarni izvor je sirovi URL GitHub gist-a (gist.githubusercontent.com/juang55/…/cfg.txt); skripta se aktivira samo ako ta konfiguracija glasi aktivno=1Ako suština nije dostupna, vraća se na tri fiksno kodirana IPFS identifikatora sadržaja, dohvaćena putem javnih gateway-a. gateway.pinata.cloud, ipfs.io, I cloudflare-ipfs.comOvo operateru daje naknadnu kontrolu aktiviranja/deaktiviranja i mogućnost vraćanja u prvobitno stanje. (Najmanja varijanta, isporučuje se u crypto-validate-lib, eth-wallet-helpers, I solana-key-utils, uklanja gist sloj i oslanja se samo na IPFS identifikatore.)
  • 3. Prikupite materijal za novčanik i tajne. Skripta obilazi korisnikov početni direktorij — ~/.config/solana, ~/.ethereum/skladište ključeva, ~/.foundry, ~/.zaštitna kapa, ~ / .ssh, I desktop/dokumenti/Preuzimanja (uključujući nazive foldera na španskom jeziku), plus ~/.env i shell rc datoteke, i ekvivalent AppData lokacije na Windowsu. Cilja privatne ključeve Ethereuma, Bitcoin WIF ključeve, BIP-39 sjemenske fraze, Solana parove ključeva, JSON spremišta ključeva Ethereuma, SSH ključeve i varijable okruženja koje nose tajne podatke. Veća varijanta (u abi-kodiranje, base58-utility, eth-dev) sadrži puni BIP-39 rječnik od 2048 riječi i koristi regularne izraze za ekstrakt pojedinačni ključevi i validirane početne fraze iz bilo kojeg teksta koji pročita; dvije manje varijante umjesto toga uparuju datoteke po ključnoj riječi (sjeme, mnemotehnički, novčanik, metamask, fantom, glavna knjiga, kutija, ...) i otpremite cijele datoteke.
  • 4. Šifrirajte i eksfiltrirajte putem javne usluge za pinovanje. Svaki nalaz je povezan s otiskom prsta domaćina (korisničko ime@nazivhosta, platforma, vremenska oznaka) i šifriran s fiksno kodiranim javnim ključem RSA-4096 ugrađenim u skriptu. Šifrirani zapis se zatim prenosi pričvršćivanjem na IPFS putem api.pinata.cloud/pinning/pinJSONToIPFS, autentificiran s fiksno kodiranim Pinata API vjerodajnicama. Ne postoji posebno dizajniran C2 server za preuzimanje: ukradeni podaci su parkirani u javnoj decentraliziranoj pohrani, koju operater može preuzeti koristeći rezultirajuće heševe sadržaja. Otpremanja su razmaknuta s nekoliko sekundi nasumičnog podrhtavanja i lokalnim zapisnikom vremenska oznaka | tip-ključa | vraćeni-hash se čuva na ~/.cache-db/.node-sync/.sl.
  • 5. Istrajte i koristite signal u ciklusu od 12 sati. Druga faza ponovo uspostavlja vlastitu perzistenciju - cron unos na Linuxu, com.apple.syncd launchd zadatak na macOS-u i planirani zadatak pod nazivom WindowsNodeSync na Windowsu — postavljeno da se ponovo pokreće svakih 12 sati. Imajte na umu da je ovo drugačiji Naziv Windows zadatka iz onog koji instalira droper (WinNodeSync); oboje vrijedi tražiti.

Timeline

Osam paketa je objavljeno u kratkom roku 13. i 14. jula 2026. Nekoliko njih ima više od jedne verzije; dropper je identičan u svim verzijama, s tim da se mijenjaju samo pomaci linije kako se mijenja veličina benignog uslužnog koda iznad njega.

Datumdogađaj
2026-07-13Prvi paketi u klasteru se pojavljuju pod jednim izdavačem (solana-key-utils, eth-wallet-helpers, crypto-validate-lib i rane verzije ostalih)
2026-07-13 → 07-14Objavljena preostala imena i naknadne verzije; isti dodani brodovi za spuštanje u svakom
2026-07-14Svih osam je označeno i analizirano; svaki paket se i dalje može instalirati iz registra

Tokom perioda naglog porasta, reputacija izdavača u registru se promijenila od otprilike neutralne na početku klastera do izrazito negativne kako su se detekcije akumulirale - što je uočljiva nuspojava označavanja paketa, a ne dizajnirana funkcija.

Indikatori kompromisa

Svi dolje navedeni indikatori su potvrđeni kao prisutni u vrijeme analize - oni u tabelama "Druge faze" dekodiranjem test/fikse/parovi ključeva.dat i čitanje oporavljenog syncd.js.

Datoteke i putanje

pokazateljuloga
~/.cache-db/.node-sync/syncd.jsDekodirana druga faza, napisana s modom 0o700
~/.cache-db/.node-sync/.slLokalni zapisnik o eksfiltraciji (vremenska oznaka | tip ključa | IPFS hash)
test/fixtures/keypairs.datBase64-kodirani korisni teret smješten unutar tarballa kao "testna jedinica"

Mrežna infrastruktura druge faze (oporavljena iz syncd.js)

pokazateljuloga
gist.githubusercontent.com/juang55/b298754cb72942b1cdcf02ccd45cde2f/raw/cfg.txtAktivacija skrivenog mjesta; skripta se pokreće samo ako je konfiguracija pročitana active=1
Qmcqz3w8j4qFQXDAXAxnrdc2oSX3nzBT4NqtpTqL8mr1gaRezervna konfiguracija IPFS-a (CID)
QmdTXoqVmTHY1i4ZWLdLkoQ9YChp5TXPh5cWXwnAYZt5iFRezervna konfiguracija IPFS-a (CID)
QmfJkLU5gdCpqbbqEjWYC2anXW9FmuEeSLLeLiHVJKYUjpRezervna konfiguracija IPFS-a (CID)
gateway.pinata.cloud, ipfs.io, cloudflare-ipfs.comIPFS gateway-i koji se koriste za preuzimanje rezervne konfiguracije
api.pinata.cloud/pinning/pinJSONToIPFSKrajnja tačka eksfiltracije, ukradeni podaci zakačeni na javni IPFS
API ključ za Pinata13c766575b9270a9825d, fiksno kodirana akreditacija za eksfiltraciju

Ciljevi kolekcije druge faze (oporavljeni iz syncd.js)

pokazateljuloga
~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.hardhat, ~/.ssh, ~/.env, rc datoteke ljuskePretraženi direktoriji/datoteke za ključeve i tajne
AppData\Roaming\Solana, AppData\Local\ethereum\keystoreTraženi ekvivalenti u Windowsu
Vrste artefakata prikupljenihETH privatni ključevi, Bitcoin WIF, BIP-39 početne fraze, Solana parovi ključeva, Ethereum spremište ključeva JSON, SSH ključevi, tajne env varijable

Artefakti perzistencije

platformapokazatelj
Linuxpokretanje cron unosa syncd.jsinstalirano putem crontaba filtrirano kroz grep -v syncd
Windowszakazani zadatak WinNodeSync (kapaljku) i WindowsNodeSync (druga faza)
MacOSlansirana oznaka com.apple.syncd
SveDruga faza se ponavlja u ciklusu od 12 sati.

Behavioral

  • Samopozivajuća funkcija dodana nakon modul.izvozi, zakazivanje a setTimeout od ~37,000 ms pri uvozu.
  • podređeni_proces spawn("čvor", ) sa odvojenim skupom opcija.
  • Aktivacija u praznom hodu u drugoj fazi (xprintidle / ioreg HIDIdleTime / vrijeme neaktivnosti PowerShella; prag od ~15 minuta).
  • Po pronalaženju RSA-4096 enkripcija, zatim HTTPS POST na javni IPFS API za prikačivanje.

Paketi i verzije (npm, izdavač solbuilder_io)

paketverzije
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

izdavač

  • solbuilder_io - angel_lopez89[@]proton[.]me, email nije verifikovan, nema verifikovanog naloga za kontrolu izvora, nema povezanog repozitorija.

Atribucija i uočeno ponašanje

Osam paketa dijeli jedan izdavački račun i jedan korisni teret. Svaki je trivijalni paket - nekoliko kilobajta pravog korisnog koda s istim dodanim droperom - objavljen bez povezanog repozitorija i pod neprovjerenom e-mail adresom za jednokratnu upotrebu. Ta uniformnost, zajednička putanja drop-a, zajednička oznaka perzistencije i zajednička... keypairs.dat Datoteke za pripremu su ono što povezuje klaster.

Paketi su neobično iskreni u vezi sa svojim ponašanjem. solana-key-utils sadrži inline komentare koji opisuju dodani blok jednostavnim riječima — označava se FANTOM: nevidljiva upornost, drugi (na španskom) glasi Izbaci topografiju u pozadini, „pokreni krticu u pozadini.“ Ovo su vlastite napomene koda o tome šta radi; naziv kampanje u ovom postu je preuzet iz te prve oznake zajedno s lažnim čvorom „sync daemon“ (sinhronizirano) koju mašinerija za perzistenciju imitira.

Opisujemo samo ono što kod vidljivo radi. Imenovanje paketa - svi termini koji se odnose na kriptovalute, novčanike i blockchain alate - ukazuje na publiku programera koja će ih najvjerovatnije preuzeti po imenu; samo po sebi ne utvrđuje ko je izdavač. Druga faza je bila u potpunosti oporavljiva dekodiranjem base64 fiksmenta, a njegovo ponašanje je opisano gore: prikuplja ključeve novčanika, sjemenske fraze i tajne i izvlači ih, RSA-šifrirane, u javnu IPFS pohranu putem Pinate. Značajan izbor dizajna je odsustvo privatnog C2 servera - konfiguracija stiže sa GitHub gista i IPFS-a, a ukradeni podaci se parkiraju u javnoj decentraliziranoj pohrani označenoj hashom sadržaja, a oba je teže preuzeti nego jedan host kojim upravlja napadač. U vrijeme pisanja ovog teksta nisu pronađeni prethodni javni izvještaji koji odgovaraju ovom klasteru.

Uticaj, trendovi i smjernice za branitelje

Ko je izložen. Svako ko je dodao jedan od ovih paketa u Node projekat, a zatim pokrenuo kod koji ga uvozi. Budući da se detonacija dešava tokom uvoza, a ne tokom instalacije, samo prisustvo paketa nije dovoljno - ali svaka normalna upotreba koja učitava modul dostiže korisni teret. Nazivi mamaca ciljaju programere koji grade na Ethereumu, Solani, Arbitrumu, Layer-2 i općim alatima za novčanike/kodiranje - populaciji koja najvjerovatnije ima upravo onu imovinu koju druga faza traži. Svako ko je pokrenuo jedan od ovih modula na mašini koja drži ključeve novčanika, sjemenske fraze, spremišta ključeva, SSH ključeve ili .NS tajne bi trebale tretirati te akreditive kao kompromitirane i rotirati ih.

Dva obrasca koja vrijedi internalizirati. prvo, korisni teret kao učvršćenje: slanje druge faze kao base64 unutar datoteke s uvjerljivim nazivom (test/fikse/parovi ključeva.dat) održava vidljivi izvor paketa čistim i potiskuje zlonamjerni sadržaj u datoteku koju alati za pregled i ljudski pregledi često tretiraju kao inertne podatke. Drugo, Izvršavanje sa kašnjenjem pri uvozu i perzistencijom na više platformiPremještanje okidača sa instalacijske udice, dodavanje tajmera, a zatim njegovo zadržavanje u cronu, zakazanim zadacima i launchd-u je namjeran korak udaljavanja od bučnijih tehnika instalacijskih skripti koje automatizirano skeniranje registra najpažljivije prati.

Smjernice za branitelje i održavatelje:

  • Tretiraj dodani kod nakon modul.izvozi kao prioritet pregleda — logika dropera se često skriva ispod „prave“ površine modula.
  • Ne pretpostavljajte da su datoteke s podacima inertne. Base64 blob pod test/pribor/ koji se čita za vrijeme izvođenja i dekodira je susjedni izvršnoj datoteki; označi čitanja datoteka fixture za vrijeme izvođenja koje šalju podatke a funkcija/eval/napiši-zatim-mrijesti se lanac.
  • Potraga za stazom za pad ~/.cache-db/.node-sync/ i za jedinice perzistencije WinNodeSync (planirani zadatak) i com.apple.syncd (launchd) na mašinama programera koje su povukle ova imena.
  • Upozorenje na Node procese koji kreiraju cron unose, zakazane zadatke ili launchd poslove — legitimne biblioteke rijetko to rade pri uvozu.
  • Preferirajte lockfiles i pinne verzije, te pregledajte razliku bilo koje nove male "uslužne" ovisnosti, posebno objavljeni paketi bez ovisnosti od strane neprovjerenih računa bez povezanog repozitorija.

Za branitelje registra, zaključak je da je praćenje instalacijskih hook-ova neophodno, ali ne i dovoljno: dropper sa vremenskim kašnjenjem tokom uvoza, postavljen unutar datoteke sa podacima, proći će provjeru samo tokom instalacije, a korak perzistencije je često najglasniji vidljivi signal koji preostaje za uhvatiti.

sca-tools-software-alati-za-analizu-sastava
Prioritizirajte, sanirajte i osigurajte softverske rizike
Nabavite svoj besplatni račun.
Nije potrebna kreditna kartica.

Osigurajte svoj razvoj i isporuku softvera

sa Xygeni paketom proizvoda