TL; DR
npm argitaratzaile bakar batek zortzi pakete txiki bidali zituen, eta haien izenak blockchain eta zorro elektronikoen garapenerako eguneroko eraikuntza-blokeen antzekoak dira. base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, eta crypto-validate-libBakoitzak utilitate funtzional bat dauka. Utilitate horren ondoren, ordea, modulua inportatzen den unean exekutatzen den kode bloke bat gehitzen zaio bere buruari deitzen diona.
Inportazioaren ondoren 37 segundo inguru, bloke horrek proba-gailu gisa mozorrotutako paketearen barruan datorren karga bat deskodetzen du, erabiltzailearen etxeko direktorioaren azpian dagoen fitxategi ezkutu batean idazten du, eta berrabiarazteko erregistratzen du bere burua behin eta berriz. login Windows, macOS eta Linuxen zehar, eta deskodetutako script-a prozesu bereizi gisa abiarazten du. Honi buruzko ezer ez da npm instalazioan zehar abiarazten; kodea inportatu eta exekutatzeko zain dago, eta hori instalazioa baino une lasaiagoa da.
Karga ez da opakoa. Base64 soil gisa bidaltzen da, beraz, "proba-gailuaren" deskodetzeak bigarren etapa osorik berreskuratzen du: a kripto-zorroa eta sekretuen lapurra makina geldirik egon arte itxaroten duena, gako pribatuak eta hazi-esaldiak biltzen dituena, aurkikuntza bakoitza RSA-4096 gako gogor batekin enkriptatzen duena eta IPFS biltegiratze publiko batean finkatuz kanporatzen duena, 12 orduro itzultzen dena.
Klusterra honela jarraitzen dugu PhantomSyncZortzi pakete guztiak npm erregistroan zeuden analisi unean, kontu bakar baten pean argitaratuta.
| ekosistema | NPM |
| Paketeak | base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-lib |
| Helburu diren plataformak | Windows, macOS, Linux |
| Oinarrizko portaera | Atzeratutako inportazio-denbora duen dropperra proba-elementu gisa ezkutatuta dago; plataforma anitzeko iraunkortasuna instalatzen du |
| karga | Kripto-zorroa eta sekretuen lapurra, RSA-4096 enkriptatzea, IPFS pinning publikoaren bidezko esfiltrazioa |
Erasoaren anatomia
Pakete bakoitza ez da apartekoa lehenengo irakurketan. base58-utils, adibidez, kilobyte gutxi batzuk dira zero menpekotasuneko Base58 / Bitcoin-WIF laguntzaile kodean — izenak berak agintzen duena, hain zuzen ere. Kode garrantzitsua dago ondoren moduluaren modulua.esportazioak, non irakurle batek fitxategiaren goialdea azaletik begiratzen ez duen: tenporizadore batekin bere burua programatzen duen funtzio bat.
Paketearen iturburutik berreraikitako eragiketa-katea honela doa:
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 Bi diseinu aukera nabarmentzen dira.
Karga erabilgarria proba-elementu gisa bidaiatzen du. Bigarren etapa ez dago kode ageriko gisa idatzita. Bertan bizi da test/fixtures/keypairs.dat, base64 fitxategi bat, zeinaren izena gako bikoteak kudeatzen dituela dioen pakete batean nahasten den. Tarball-a gainbegiratzen duen gizaki batentzat, datu-lagin bat dirudi; erantsitako kodearentzat, deskodetu eta exekutatzeko script bat da. Dropper-ak berak ez du sare-helbiderik — horiek bigarren fasean daude —, baina ez dago nahasmendu gehigarririk: fixture-a base64 geruza bakarra da, beraz, deskodetzea (base64 -d) osoa berreskuratzen du syncd.js eta bere sarearen portaera. Hurrengo atalak berreskuratutako etapa horrek zer egiten duen azaltzen du.
Leherketa atzeratu eta inportazioari lotuta dago, ez instalazioari. Pizgarria delako behar() instalazio-hook baten ordez ~37 segundoko tenporizadorea gehi, portaerak bakarrik ikusten duten egiaztapenak saihesten ditu npm instalatu urratsa, eta atzerapenak sandbox eta CI exekuzio labur asko baino gehiago irauten du. Zerbait exekutatzen denerako, paketea atera duen instalazioa aspaldi amaituta dago.
Behin deskodetutako gidoia diskoan dagoenean ~/.cache-db/.node-sync/syncd.js — ohiko cache direktorio bat bezala irakurtzeko aukeratutako bide bat — dropper-ak hiru plataforma nagusietan berrabiarazteari eutsi diezaioke:
- Linux: Script-a berrabiarazten duen cron sarrera bat. Sarrera instalatzen da dagoen crontab-a iragaziz grep -v sinkronizatu, eta horrek albo-ondorioa du sarrera berria izen berarentzat grep egiten duen zerrenda soil batetik kanpo uztea.
- Windows: izeneko zeregin programatu bat WinNodeSync, 12 minutuko tartean berriro exekutatzeko ezarrita.
- MacOS: etiketa duen launchd lan bat com.apple.syncd, hainbat paketetan dagoena — Apple sistema-zerbitzu legitimo bat imitatzen duen etiketa bat.
Scripta berehala abiarazten da prozesu bereizi gisa, beraz, inportazio programa amaitu ondoren exekutatzen jarraitzen du.
Zer egiten du bigarren etapak
Fixture-a base64 geruza bakarra denez, bigarren etapak garbi deskodetzen du eta osorik irakur daiteke. Zortzi paketeek script beraren hiru aldaeretako bat daramate, eta goiburuko iruzkin batean honela identifikatzen da: phantom syncd v3 — topo durmiente (“sator loti”). Bere lana kriptografia-zorroaren materiala eta garatzaileen sekretuak lapurtzea eta makinatik kanpora bidaltzea da. Urrats hauek jarraitzen ditu:
- 1. Itxaron makina geldirik egon arte. Ezer egin aurretik, syncd.js erabiltzailea zenbat denbora egon den inaktibo egiaztatzen du eta atalase bat (15 minutu inguru) gainditzen du soilik — xprintidle Linuxen, ioreg HIDidleTime macOS-en, eta PowerShell inaktibo-denbora kontsulta bat Windows-en. Beraz, bilketa teklatuan inor ez dagoenean gertatzen da.
- 2. Eskuratu urrutitik kontrolatutako aktibazio-etengailu batScript-ak konfigurazio txiki bat ateratzen du deaddrop batetik jardun aurretik. Iturri nagusia GitHub-eko gist URL gordina da (gist.githubusercontent.com/juang55/…/cfg.txt); skripta konfigurazio horrek irakurtzen badu bakarrik aktibatzen da aktibo=1Gist-a eskuragarri ez badago, hiru IPFS eduki-identifikatzaile finkotara jotzen du, atebide publikoen bidez lortuak. atebidea.pinata.hodeia, ipfs.io, eta cloudflare-ipfs.comHorri esker, operadoreak armatu/desarmatu ondoren kontrola dezake, eta baita lurrera botatzearen aurkako babes-sistema ere. (Aldaera txikiena, bidaltzen da...) kripto-balioztatu-liburutegia, eth-zorro-laguntzaileak, eta solana-gako-erabilgarriak, funtsezko geruza kendu du eta IPFS identifikatzaileetan bakarrik oinarritzen da.)
- 3. Uzta zorroaren materiala eta sekretuak. Script-ak erabiltzailearen etxeko direktorioa zeharkatzen du — ~/.config/solana, ~/.ethereum/giltza-denda, ~/.foundry, ~/.kasko gogorra, ~ / .ssh, eta Desktop/Dokumentuak/Downloads (gaztelaniazko karpeta izenak barne), gehi ~/.ingurunea eta shell rc fitxategiak, eta baliokidea Aplikazio datuak Windows-eko kokapenak. Ethereum-eko gako pribatuak, Bitcoin WIF gakoak, BIP-39 hazi-esaldiak, Solana gako-pareak, Ethereum keystore JSON, SSH gakoak eta sekretuak dituzten ingurune-aldagaiak ditu helburu. Aldaera handiagoa (-n abi-kodeketa, base58-utils, eth-dev) 2048 hitzeko BIP-39 hiztegi osoa dauka eta adierazpen erregularrak erabiltzen ditu ateratzeko banakako gakoak eta irakurtzen dituen edozein testutatik balioztatutako hazi-esaldiak; bi aldaera txikiagoek, horren ordez, fitxategiak gako-hitzaren bidez lotzen dituzte (hazia, mnemoteknia, zorro, metamask, phantom, Ledger, Box, …) eta fitxategi osoak igo.
- 4. Zifratu eta kanporatu pinning zerbitzu publiko baten bidez. Aurkikuntza bakoitza ostalariaren hatz-marka batekin batera dator (erabiltzaile-izena@hostname, plataforma, denbora-zigilua) eta script-ean txertatutako RSA-4096 gako publiko batekin enkriptatuta. Ondoren, enkriptatutako erregistroa IPFS-ra finkatuz igotzen da bidez api.pinata.cloud/pinning/pinJSONToIPFS, Pinata API kredentzial gogor kodetuekin autentifikatuta. Ez dago C2 zerbitzari pertsonalizaturik bahitzeko: lapurtutako datuak biltegi publiko deszentralizatuan gordeta daude, eta operadoreak berreskura ditzake edukien hash-ak erabiliz. Igoerak ausazko dardara segundo batzuekin tartekatzen dira, eta tokiko erregistro batekin. denbora-zigilua | gako-mota | itzulitako hash-a mantentzen da ~/.cache-db/.node-sync/.sl.
- 5. Iraun eta baliza jarri 12 orduko ziklo batean. Bigarren etapak bere iraunkortasuna berrezartzen du — cron sarrera bat Linuxen, com.apple.syncd macOS-en abiarazitako lana, eta izeneko programatutako zeregin bat WindowsNodeSync Windows-en — 12 orduro berriro exekutatzeko konfiguratuta. Kontuan izan hau dela ezberdinak Windows ataza-izena tantakagailuak instalatzen duenetik (WinNodeSync); biak merezi dute bilatzea.
Timeline
Zortzi paketeak 2026-07-13an eta 2026-07-14an argitaratu ziren segida estu batean. Batzuek bertsio bat baino gehiago dute; dropper-a berdina da bertsio guztietan, lerro-desplazamenduak bakarrik aldatzen dira gaineko utilitate-kode onberaren tamaina aldatzen den heinean.
| data | Gertaera |
|---|---|
| 2026-07-13 | Klusterreko lehen paketeak argitaratzaile baten pean agertzen dira (solana-key-utils, eth-wallet-helpers, crypto-validate-lib eta gainerakoen lehen bertsioak) |
| 2026-07-13 → 07-14 | Gainerako izenak eta ondorengo bertsioak argitaratu dira; bakoitzean erantsitako dropper ontzi berdinak |
| 2026-07-14 | Zortzi guztiak markatu eta aztertu dira; pakete guztiak erregistrotik instala daitezke oraindik |
Eztanda osoan zehar, argitaratzailearen erregistroko ospea klusteraren hasieran nahiko neutroa izatetik detekzioak metatu ahala oso negatiboa izatera igaro zen — paketeak markatzearen albo-ondorio ikusgarria, ez diseinatutako funtzio bat.
Konpromisoaren adierazleak
Beheko adierazle guztiak analisi-garaian zeudela baieztatu zen — "Bigarren faseko" tauletan daudenak deskodetuz test/fixtures/keypairs.dat eta berreskuratutakoa irakurtzen syncd.js.
Fitxategiak eta bideak
| Adierazlea | Role |
|---|---|
~/.cache-db/.node-sync/syncd.js | Bigarren etapa deskodetua, 0o700 moduarekin idatzia |
~/.cache-db/.node-sync/.sl | Tokiko exfiltrazio erregistroa (denbora-zigilua | gako-mota | IPFS hash-a) |
test/fixtures/keypairs.dat | Base64 kodeketa duen karga tarball-aren barruan "proba-elementu" gisa eskegita |
Bigarren faseko sare-azpiegitura (syncd.js-tik berreskuratua)
| Adierazlea | Role |
|---|---|
gist.githubusercontent.com/juang55/b298754cb72942b1cdcf02ccd45cde2f/raw/cfg.txt | Aktibazio hilda; skripta konfigurazioak irakurtzen badu bakarrik exekutatzen da active=1 |
Qmcqz3w8j4qFQXDAXAxnrdc2oSX3nzBT4NqtpTqL8mr1ga | IPFS konfigurazioaren ordezko (CID) |
QmdTXoqVmTHY1i4ZWLdLkoQ9YChp5TXPh5cWXwnAYZt5iF | IPFS konfigurazioaren ordezko (CID) |
QmfJkLU5gdCpqbbqEjWYC2anXW9FmuEeSLLeLiHVJKYUjp | IPFS konfigurazioaren ordezko (CID) |
gateway.pinata.cloud, ipfs.io, cloudflare-ipfs.com | Konfigurazio-erreserbak lortzeko erabiltzen diren IPFS atebideak |
api.pinata.cloud/pinning/pinJSONToIPFS | Exfiltrazio-puntuko puntua, lapurtutako datuak IPFS publikoan finkatuta |
| Pinata API gakoa | 13c766575b9270a9825d, kanporatze-kredentzial kodetu gabea |
Bigarren faseko bilduma-helburuak (syncd.js-tik berreskuratuak)
| Adierazlea | Role |
|---|---|
~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.hardhat, ~/.ssh, ~/.env, shell rc fitxategiak | Gakoak eta sekretuak bilatzeko direktorioak/fitxategiak |
AppData\Roaming\Solana, AppData\Local\ethereum\keystore | Windows baliokideak bilatu dira |
| Bildutako artefaktu motak | ETH gako pribatuak, Bitcoin WIF, BIP-39 hazi esaldiak, Solana gako bikoteak, Ethereum giltza-biltegi JSON, SSH gakoak, ingurune sekretuen aldagaiak |
Iraunkortasun-artefaktuak
| Plataforma | Adierazlea |
|---|---|
| Linux | cron sarrera abiarazten syncd.js; crontab bidez instalatuta iragazita grep -v syncd |
| Windows | programatutako zeregina WinNodeSync (tantagailua) eta WindowsNodeSync (bigarren etapa) |
| MacOS | abiarazitako etiketa com.apple.syncd |
| guztiak | Bigarren etapa 12 orduko ziklo batean errepikatzen da |
Jokabidearen
- Bere buruari deitzen dion funtzioa ondoren erantsi da modulua.esportazioak, programazioa eginez ezarriDenbora-muga ~37,000 ms-koa inportatzean.
- haur_prozesua sortu ("nodoa", ) aukera bereizia ezarrita.
- Bigarren fasean aktibazio inaktiboa (xprintidle / ioreg HIDIdleTime / PowerShell inaktibo denbora; ~15 minutuko atalasea).
- Aurkikuntza bakoitzeko RSA-4096 enkriptazioa, eta ondoren HTTPS POST IPFS pinning API publiko batera.
Paketeak eta bertsioak (npm, solbuilder_io argitaratzailea)
| Package | Bertsioak |
|---|---|
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 |
Argitaratzailea
- solbuilder_io - angel_lopez89[@]proton[.]ni, posta elektronikoa egiaztatu gabe, ez dago iturburu-kontrol kontu egiaztaturik, ez dago biltegi estekaturik.
Aitortza eta Behatutako Portaera
Zortzi paketeek argitaratzaile kontu bat eta karga bat partekatzen dituzte. Bakoitza pakete hutsala da — dropper berarekin erantsitako benetako erabilgarritasun kodearen kilobyte batzuk — estekatutako biltegirik gabe eta egiaztatu gabeko botatzeko estiloko posta elektroniko baten pean argitaratua. Uniformitate horrek, partekatutako deskargatzeko bidea, partekatutako iraunkortasun etiketak eta partekatutako... gako-pareak.dat staging fitxategiak dira klusterra elkarrekin lotzen dutenak.
Paketeak ezohiko zintzoak dira beren portaerari buruz. solana-gako-erabilgarriak erantsitako blokea modu arruntean deskribatzen duten lerroko iruzkinak daramatza — batek etiketatzen du MAMUA: iraunkortasun ikusezina, beste batek (gaztelaniaz) dio Atzeko planoan topoa exekutatu, “exekutatu satorra atzeko planoan”. Hauek dira kodearen oharpenak egiten dituenari buruz; mezu honetako kanpainaren izena lehenengo etiketa horretatik ateratzen da, “sinkronizazio daemon” nodo faltsuarekin batera (sinkronizatu) iraunkortasun-makinariak imitatzen duela.
Kodeak behagarri egiten duena bakarrik deskribatzen dugu. Paketeen izendapenak —kriptografia, zorro eta blockchain tresnen termino guztiak— garatzaileen audientzia adierazten du, izenez ateratzeko aukera gehien duena; ez du berez zehazten nor den argitaratzailea. Bigarren etapa guztiz berreskuragarria izan zen base64 fixture-a deskodetuz, eta bere portaera goian deskribatuta dago: zorroaren giltzak, hazi-esaldiak eta sekretuak biltzen ditu eta RSA-z enkriptatuta IPFS biltegiratze publikora kanporatzen ditu Pinataren bidez. Diseinu-aukera aipagarri bat C2 zerbitzari pribatu baten falta da —konfigurazioa GitHub-eko gist eta IPFS batetik iristen da, eta lapurtutako datuak edukiaren hash bidez giltzatutako biltegiratze deszentralizatu publikoan gordetzen dira, eta biak zailagoak dira erasotzaile batek kontrolatutako ostalari bakar bat baino bahitzen. Idazteko unean ez zen aurkitu kluster honekin bat datorren aurreko txosten publikorik.
Eragina, joerak eta defendatzaileentzako orientabideak
Nor dago agerian. Pakete hauetakoren bat Node proiektu bati gehitu eta gero inportatzen duen kodea exekutatu duen edonor. Detonazioa inportazio-garaian gertatzen denez, instalazio-garaian baino, paketea bertan izatea ez da nahikoa, baina modulua kargatzen duen edozein erabilera normalak zama-kargara iristen da. Amu-izenak Ethereum, Solana, Arbitrum, Layer-2 eta zorro/kodeketa tresna orokorretan oinarritutako garatzaileei zuzenduta daude, hau da, bigarren etapak bilatzen dituen aktiboak izateko aukera gehien duen populazioari. Modulu hauetakoren bat zorro-giltzak, hazi-esaldiak, gako-biltegiak, SSH giltzak edo dituen makina batean exekutatu duen edonor... .env sekretuek kredentzial horiek arriskuan jarrita bezala tratatu eta txandakatu beharko lituzkete.
Barneratzeko moduko bi eredu. Lehenik eta behin, karga-elementu gisabigarren etapa base64 gisa bidaltzea izen sinesgarriko datu-fitxategi baten barruan (test/fixtures/keypairs.dat) paketearen iturburu ikusgaia garbi mantentzen du eta eduki gaiztoa berrikuspen tresnek eta gizakien gainbegiratzaileek datu geldo gisa tratatzen duten fitxategi batera sartzen du. Bigarrenik, inportazio-denbora atzeratutako exekuzioa plataforma anitzeko iraunkortasunarekinInstalazio-abiarazlea instalazio-amutik kentzea, tenporizadore bat gehitzea eta gero cron, programatutako zeregin eta launchd-en zehar irautea nahita urruntzen da erregistroko eskaneatzea automatizatuak arretaz kontrolatzen dituen instalazio-script teknika zaratatsuagoetatik.
Defendatzaile eta mantentzaileentzako jarraibideak:
- Tratatu erantsitako kodea ondoren modulua.esportazioak berrikuspen lehentasun gisa — dropper logika maiz ezkutatzen da "benetako" moduluaren gainazalaren azpian.
- Ez eman datu-fitxategiak geldoak direnik. Base64 blob bat azpian proba/egutegiak/ exekuzio-garaian irakurtzen eta deskodetzen dena exekutagarriaren ondokoa da; elikatzen duten fixture fitxategien exekuzio-garaiko irakurketak markatu Funtzio/ebaluatu/idatzi-orduan-abiarazi katean.
- Bilatu jaitsiera bidea ~/.cache-db/.node-sync/ eta iraunkortasun unitateetarako WinNodeSync (programatutako zeregina) eta com.apple.syncd (launchd) izen hauek atera dituzten garatzaile makinetan.
- Cron sarrerak, programatutako zereginak edo launchd lanak sortzen dituzten Node prozesuei buruzko alerta — liburutegi legitimoek gutxitan egiten dute hau inportazioan.
- Blokeo-fitxategiak eta bertsio finkoak nahiago izan, eta berrikusi edozein "erabilgarritasun" menpekotasun txiki berriren aldea, batez ere zero menpekotasuneko paketeak argitaratu dira estekatutako biltegirik gabeko egiaztatu gabeko kontuek.
Erregistroaren defendatzaileentzat, ondorioa da instalazio-hook-aren monitorizazioa beharrezkoa dela baina ez dela nahikoa: datu-fitxategi baten barruan inportazio-denborako eta tenporizadore-atzerapeneko dropper batek instalazio-denborako egiaztapena gaindituko du, eta iraunkortasun-urratsa da askotan harrapatzeko geratzen den seinale ozenena.




