TL; DR
En sam založnik npm je izdal osem majhnih paketov, katerih imena se berejo kot vsakdanji gradniki za razvoj veriženja blokov in denarnic. base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpersin crypto-validate-libVsak od njih vsebuje delujoč pripomoček. Vendar pa je za tem pripomočkom dodan samodejni blok kode, ki se zažene v trenutku, ko je modul uvožen.
Približno 37 sekund po uvozu, ta blok dekodira koristni tovor, ki je dostavljen znotraj paketa, prikritega kot testna vpenjalna enota, ga zapiše v skrito datoteko v domačem imeniku uporabnika in se registrira za ponovni zagon ob vsakem login v sistemih Windows, macOS in Linux ter zažene dekodiran skript kot ločen proces. Med namestitvijo npm se nič od tega ne sproži; čaka, da se koda uvozi in zažene, kar je tišji trenutek kot namestitev.
Tovor ni neprozoren. Pošilja se kot navaden base64, zato dekodiranje "testne vpenjalne naprave" v celoti obnovi drugo stopnjo: a kripto denarnica in kradljivac skrivnosti ki čaka, da stroj miruje, zbira zasebne ključe in semenske fraze, vsako najdbo šifrira s trdo kodiranim ključem RSA-4096 in jo izvleče tako, da jo pripne v javno shrambo IPFS, pri čemer se vsakih 12 ur odzove.
Grozd spremljamo kot PhantomSyncVseh osem paketov je bilo v času analize aktivnih v registru npm, objavljenih pod enim samim računom.
| Ekosistem | npm |
| Paketi | base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-lib |
| Ciljne platforme | Windows, macOS, Linux |
| Osnovno vedenje | Zakasnjena, med uvozom skrit dropper kot testna napeljava; namesti vztrajnost na več platformah |
| Obremenitev | Kraja kripto denarnice in skrivnosti, šifriranje RSA-4096, izbruh prek javnega pripenjanja IPFS |
Anatomija napada
Vsak paket je na prvi pogled videti neopazen. base58-utilitiesje na primer nekaj kilobajtov pomožne kode Base58 / Bitcoin-WIF brez odvisnosti – točno to, kar obljublja ime. Ustrezna koda se nahaja po modula modul.izvozi, kjer bralec, ki preleti vrh datoteke, verjetno ne bo pogledal: samoiniciativna funkcija, ki se sama načrtuje s časovnikom.
Veriga operacij, rekonstruirana iz izvorne kode paketa, poteka takole:
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 Izstopata dve možnosti oblikovanja.
Tovor potuje kot testna naprava. Druga faza ni napisana kot očitna koda. Živi v test/fixtures/keypairs.dat, datoteka base64, katere ime se zlije s paketom, ki trdi, da obravnava pare ključev. Za človeka, ki pregleduje tarball, je videti kot vzorčni podatki; za dodano kodo je to skript, ki ga je treba dekodirati in zagnati. Sam dropper ne vsebuje omrežnega naslova – ti se nahajajo v drugi fazi – vendar ni dodatnega zakrivanja: vpenjalo je ena plast base64, zato ga dekodiranje (base64 -d) povrne celotno syncd.js in njegovo omrežno delovanje. Naslednji razdelek prikazuje, kaj počne ta obnovljena faza.
Detonacija je zakasnjena in vezana na uvoz, ne na namestitev. Ker je sprožilec zahteva() plus ~37-sekundni časovnik namesto namestitvenega kljuka, se vedenje izogne preverjanjem, ki samo opazujejo namestite npm korak, zakasnitev pa traja dlje kot mnoga kratkotrajna izvajanja v peskovniku in nekonvencionalni okolici. Ko se karkoli izvede, je namestitev, ki je prenesla paket, že zdavnaj končana.
Ko je dekodiran scenarij na disku na ~/.cache-db/.node-sync/syncd.js — pot, izbrana za branje kot rutinski imenik predpomnilnika — spuščalnik omogoča, da preživi ponovne zagone na vseh treh glavnih platformah:
- Linux: vnos v cron, ki ponovno zažene skript. Vnos se namesti s filtriranjem obstoječega crontaba skozi grep -v sinhronizirano, kar ima stranski učinek, da nov vnos izpusti iz navadnega seznama, ki grepira za isto ime.
- Windows: načrtovano opravilo z imenom WinNodeSync, nastavljeno na ponovitev v 12-minutnih intervalih.
- MacOS: opravilo launchd z oznako com.apple.syncd, prisotna v več paketih – oznaka, ki posnema legitimno sistemsko storitev Apple.
Skript se nato takoj zažene kot ločen proces, zato se po zaključku programa za uvoz nadaljuje.
Kaj počne druga faza
Ker je vpenjalo enojna plast base64, se druga stopnja dekodira čisto in jo je mogoče v celoti prebrati. Vseh osem paketov vsebuje eno od treh različic istega skripta, ki se v komentarju glave identificira kot phantom syncd v3 — topo durmiente („speči krt“). Njegova naloga je ukrasti gradivo kriptovalutnih denarnic in razvijalske skrivnosti ter jih poslati iz naprave. Deluje v teh korakih:
- 1. Počakajte, da naprava miruje. Preden karkoli storite, syncd.js preveri, kako dolgo je bil uporabnik neaktiven, in nadaljuje šele po določenem pragu (približno 15 minut) – xprintidle na Linuxu, ioreg HIDIdleTime v sistemu macOS in poizvedba PowerShell v času mirovanja v sistemu Windows. Zbiranje se zato običajno zgodi, ko nihče ni za tipkovnico.
- 2. Pridobite daljinsko upravljano aktivacijsko stikaloSkripta pred dejanjem potegne majhno konfiguracijo iz slepe mape. Primarni vir je surov URL datoteke GitHub (gist.githubusercontent.com/juang55/…/cfg.txt); skript se aktivira le, če se ta konfiguracija glasi aktivno=1Če jedro ni na voljo, se uporabijo trije trdo kodirani identifikatorji vsebine IPFS, pridobljeni prek javnih prehodov. gateway.pinata.cloud, ipfs.ioin cloudflare-ipfs.comTo daje operaterju naknadni nadzor nad vklopom/izklopom in možnost umika, ki je odporna na morebitno odstranitev. (Najmanjša različica, dobavljena v kripto-validate-lib, pomočniki pri eth-denarnicahin pripomočki-za-ključe-solana, ima odstranjeno plast gist in se zanaša samo na identifikatorje IPFS.)
- 3. Zberite material za denarnico in skrivnosti. Skripta se sprehodi po domačem imeniku uporabnika — ~/.config/solana, ~/.ethereum/shramba ključev, ~/.foundry, ~/.trdna kapa, ~ / .sshin desktop/dokumenti/Moji Prenosi (vključno z imeni map v španskem jeziku) ter ~/.env in datoteke lupine rc ter enakovredne datoteke AppData lokacije v sistemu Windows. Cilja na zasebne ključe Ethereuma, ključe Bitcoin WIF, semenske fraze BIP-39, pare ključev Solana, JSON shrambe ključev Ethereuma, ključe SSH in okoljske spremenljivke, ki vsebujejo skrivnosti. Večja različica (v abi-kodiranje, base58-utilities, eth-dev) vsebuje celoten slovar BIP-39 z 2048 besedami in uporablja regularne izraze za ekstrakt posamezne ključe in potrjene semenske fraze iz katerega koli besedila, ki ga prebere; dve manjši različici namesto tega ujemata datoteke po ključni besedi (seme, Mnemonik, denarnica, metamask, phantom, knjiga, trezor, …) in naložite celotne datoteke.
- 4. Šifrirajte in izbrišite prek javne storitve pripenjanja. Vsaka ugotovitev je povezana z gostiteljevim prstnim odtisom (uporabniško ime@imegostitelja, platforma, časovni žig) in šifriran s trdo kodiranim javnim ključem RSA-4096, vdelanim v skript. Šifrirani zapis se nato naloži tako, da se pripne na IPFS prek api.pinata.cloud/pinning/pinJSONToIPFS, overjeno s trdo kodiranimi poverilnicami Pinata API. Ni posebnega strežnika C2, ki bi ga bilo mogoče zaseči: ukradeni podatki so parkirani v javnem decentraliziranem shrambi, ki ga lahko operater pridobi z uporabo nastalih zgoščevalnih vrednosti vsebine. Nalaganja so razporejena z nekaj sekundami naključnega tresenja in lokalnim dnevnikom časovni-žig | tip-ključa | vrnjena-zgoščena-vrednost se hrani pri ~/.cache-db/.node-sync/.sl.
- 5. Vztrajajte in uporabljajte signal v 12-urnem ciklu. Druga faza ponovno vzpostavi lastno obstojnost – vnos v cron v Linuxu, com.apple.syncd opravilo launchd v sistemu macOS in načrtovano opravilo z imenom Sinhronizacija vozlišč sistema Windows v sistemu Windows – nastavljeno na ponovni zagon vsakih 12 ur. Upoštevajte, da je to drugačen Ime opravila sistema Windows iz tistega, ki ga namesti snemalnik (WinNodeSync); oboje je vredno poiskati.
Timeline
Osem paketov je bilo objavljenih v kratkem času, 13. in 14. julija 2026. Več jih ima več kot eno različico; kapljalnik je v vseh različicah enak, le odmiki vrstic se spreminjajo, ko se spreminja velikost neškodljive uporabne kode nad njim.
| Datum | Event |
|---|---|
| 2026-07-13 | Prvi paketi v gruči se pojavijo pod enim založnikom (solana-key-utils, eth-wallet-helpers, crypto-validate-lib in zgodnje različice ostalih) |
| 2026-07-13 → 07-14 | Objavljena preostala imena in nadaljnje različice; v vsaki so bile dodane iste ladje za odlaganje. |
| 2026-07-14 | Vseh osem označenih in analiziranih; vsak paket je še vedno mogoče namestiti iz registra |
Med izbruhom se je ugled založnika v registru premaknil iz približno nevtralnega na začetku grozda v močno negativen, ko so se zaznave kopičile – opazen stranski učinek označenih paketov, ne pa načrtovana funkcija.
Kazalci kompromisa
Vsi spodnji kazalniki so bili potrjeni kot prisotni v času analize – tisti v tabelah »Druga faza« z dekodiranjem test/fixtures/keypairs.dat in branje obnovljenega syncd.js.
Datoteke in poti
| Kazalec | vloga |
|---|---|
~/.cache-db/.node-sync/syncd.js | Dekodirana druga stopnja, zapisana z načinom 0o700 |
~/.cache-db/.node-sync/.sl | Lokalni dnevnik izbruha (časovni žig | tip ključa | zgoščena vrednost IPFS) |
test/fixtures/keypairs.dat | Koristni tovor, kodiran v Base64, je bil shranjen v tarballu kot "testna naprava" |
Omrežna infrastruktura druge stopnje (obnovljeno iz syncd.js)
| Kazalec | vloga |
|---|---|
gist.githubusercontent.com/juang55/b298754cb72942b1cdcf02ccd45cde2f/raw/cfg.txt | Aktivacijska slepa točka; skript se zažene le, če konfiguracija prebere active=1 |
Qmcqz3w8j4qFQXDAXAxnrdc2oSX3nzBT4NqtpTqL8mr1ga | Rezervna konfiguracija IPFS (CID) |
QmdTXoqVmTHY1i4ZWLdLkoQ9YChp5TXPh5cWXwnAYZt5iF | Rezervna konfiguracija IPFS (CID) |
QmfJkLU5gdCpqbbqEjWYC2anXW9FmuEeSLLeLiHVJKYUjp | Rezervna konfiguracija IPFS (CID) |
gateway.pinata.cloud, ipfs.io, cloudflare-ipfs.com | Prehodi IPFS, ki se uporabljajo za pridobivanje rezervne konfiguracije |
api.pinata.cloud/pinning/pinJSONToIPFS | Končna točka izkrcanja, ukradeni podatki pripeti na javni IPFS |
| Ključ API-ja Pinata | 13c766575b9270a9825d, trdo kodirana poverilnica za izhod |
Cilji zbiranja druge stopnje (obnovljeni iz syncd.js)
| Kazalec | vloga |
|---|---|
~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.hardhat, ~/.ssh, ~/.env, datoteke lupine rc | Iskanje ključev in skrivnosti v imenikih/datotekah |
AppData\Roaming\Solana, AppData\Local\ethereum\keystore | Iskanje ustreznikov sistema Windows |
| Vrste artefaktov, pridobljenih | Zasebni ključi ETH, Bitcoin WIF, semenske fraze BIP-39, pari ključev Solana, shramba ključev Ethereum JSON, ključi SSH, spremenljivke skrivnega okolja |
Artefakti vztrajnosti
| Platforma | Kazalec |
|---|---|
| Linux | zagon vnosa cron syncd.jsnameščeno prek crontaba, filtrirano skozi grep -v syncd |
| Windows | načrtovana naloga WinNodeSync (kapalka) in WindowsNodeSync (druga faza) |
| macOS | oznaka launchd com.apple.syncd |
| vsi | Druga faza se ponavlja v 12-urnem ciklu |
Vedenjsko
- Samodejno klicna funkcija, dodana za modul.izvozi, razporejanje a setTimeout ~37,000 ms pri uvozu.
- podrejeni_proces drstenje("vozlišče", ) z ločenim naborom možnosti.
- Aktivacija v prostem teku v drugi fazi (xprintidle / ioreg Čas nedejavnosti HIDIdleTime / PowerShell; prag ~15 minut).
- Šifriranje RSA-4096 na podlagi ugotovitve, nato HTTPS POST v javni API za pripenjanje IPFS.
Paketi in različice (npm, založnik solbuilder_io)
| paket | različice |
|---|---|
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 |
Založba
- solbuilder_io - angel_lopez89[@]proton[.]me, e-pošta ni preverjena, ni preverjenega računa za nadzor izvorne kode, ni povezanega repozitorija.
Pripisovanje in opazovano vedenje
Osem paketov si deli en račun založnika in en koristni nanos. Vsak je trivialen paket – nekaj kilobajtov prave uporabne kode z istim dodanim spuščalnikom – objavljen brez povezanega repozitorija in pod nepreverjenim e-poštnim naslovom za enkratno uporabo. Ta enotnost, skupna pot spuščanja, skupne oznake vztrajnosti in skupni pari ključev.dat Pripravna datoteka je tisto, kar povezuje gručo skupaj.
Paketi so nenavadno odkriti glede svojega vedenja. pripomočki-za-ključe-solana vsebuje vgrajene komentarje, ki opisujejo dodani blok na preprost način – označimo ga FANTOM: nevidna vztrajnost, drugo (v španščini) se glasi Izbriši topografijo v ozadju, »zaženi krta v ozadju.« To so lastne opombe kode o tem, kaj počne; ime kampanje v tej objavi je vzeto iz te prve oznake skupaj s ponarejenim vozliščem »sync daemon« (sinhronizirano), ki ga posnema stroj za vztrajnost.
Opisujemo le tisto, kar koda počne opazno. Poimenovanje paketov – vsi izrazi so kripto, denarnice in orodja za veriženje blokov – nakazuje na razvijalsko občinstvo, ki jih bo najverjetneje poiskalo po imenu; samo po sebi ne določa, kdo je založnik. Drugo fazo je bilo mogoče v celoti obnoviti z dekodiranjem nastavka base64, njegovo vedenje pa je opisano zgoraj: zbira ključe denarnice, semenske fraze in skrivnosti ter jih, šifrirane z RSA, prek Pinate izvleče v javno shrambo IPFS. Pomembna izbira zasnove je odsotnost zasebnega strežnika C2 – konfiguracija prihaja iz GitHub gista in IPFS-ja, ukradeni podatki pa so parkirani v javni decentralizirani shrambi, zaščiteni z zgoščeno vrednostjo vsebine, ki ju je težje zaseči kot en sam gostitelj, ki ga nadzoruje napadalec. V času pisanja tega besedila ni bilo najdenih nobenih predhodnih javnih poročil, ki bi se ujemala s to gručo.
Vpliv, trendi in smernice za zagovornike
Kdo je izpostavljen. Vsakdo, ki je enega od teh paketov dodal projektu Node in nato zagnal kodo, ki ga uvozi. Ker detonacija poteka v času uvoza in ne v času namestitve, sama prisotnost paketa ni dovolj – ampak vsaka običajna uporaba, ki naloži modul, doseže koristni tovor. Imena vab ciljajo na razvijalce, ki gradijo na Ethereumu, Solani, Arbitrumu, Layer-2 in splošnih orodjih za denarnice/kodiranje – populacijo, ki ima najverjetneje natanko tista sredstva, ki jih išče druga faza. Vsakdo, ki je enega od teh modulov zagnal na računalniku, ki ima ključe denarnice, semenske fraze, shrambe ključev, ključe SSH ali .env Skrivnosti bi morale te poverilnice obravnavati kot ogrožene in jih zamenjati.
Dva vzorca, ki ju je vredno ponotranjiti. Prvič, koristni tovor kot vpenjalo: pošiljanje druge faze kot base64 znotraj verodostojno poimenovane podatkovne datoteke (test/fixtures/keypairs.dat) ohranja vidni vir paketa čist in potisne zlonamerno vsebino v datoteko, ki jo orodja za pregledovanje in človeški pregledovalniki pogosto obravnavajo kot inertne podatke. Drugič, Izvajanje z zakasnitvijo uvoza in medplatformsko vztrajnostjoPremik sprožilca z namestitvenega kavlja, dodajanje časovnika in nato ohranjanje delovanja v cronu, načrtovanih opravilih in launchd je nameren korak stran od hrupnejših tehnik namestitvenih skriptov, ki jih avtomatizirano skeniranje registra najbolj natančno spremlja.
Navodila za branilce in vzdrževalce:
- Obravnavaj dodano kodo po modul.izvozi kot prednostna naloga pregleda – logika kapalke se pogosto skriva pod »pravo« površino modula.
- Ne predvidevajte, da so podatkovne datoteke inertne. Bazni blob pod test/priprave/ ki se bere med izvajanjem in dekodira, je sosednja izvedljivi datoteki; označi branje datotek vpenjala med izvajanjem, ki dovajajo funkcija/eval/napiši-potem-spawn veriga.
- Lov na pot padca ~/.cache-db/.node-sync/ in za enote za obstojnost WinNodeSync (načrtovana naloga) in com.apple.syncd (launchd) na razvijalskih računalnikih, ki so potegnili ta imena.
- Opozorilo o procesih vozlišča, ki ustvarjajo vnose cron, načrtovana opravila ali opravila launchd – legitimne knjižnice to redko storijo pri uvozu.
- Dajte prednost datotekam zaklepanja in pripetim različicam ter preglejte razliko vseh novih majhnih odvisnosti od "uporabnih programov", zlasti objavljeni paketi brez odvisnosti z nepreverjenimi računi brez povezanega repozitorija.
Za zagovornike registra je ključna ugotovitev, da je spremljanje namestitvenih kavljev nujno, vendar ne zadostno: odlagalnik z zakasnitvijo med uvozom, nameščen znotraj podatkovne datoteke, bo prestal preverjanje samo med namestitvijo, korak vztrajnosti pa je pogosto najglasnejši opazen signal, ki ga je še treba ujeti.



