TL; DR
Pubblikatur wieħed tal-npm bagħat tmien pakketti żgħar li isimhom jinqara bħal blokki tal-bini ta' kuljum għall-iżvilupp tal-blockchain u l-kartieri, base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, u crypto-validate-libKull waħda fiha utilità li taħdem. Madankollu, wara dik l-utilità, hemm imwaħħal blokk ta' kodiċi li jinvoka lilu nnifsu u li jaħdem fil-mument li l-modulu jiġi importat.
Madwar 37 sekonda wara l-importazzjoni, dak il-blokk jiddekodifika payload li jintbagħat ġewwa l-pakkett moħbi bħala apparat tat-test, jiktebha f'fajl moħbi fid-direttorju tad-dar tal-utent, jirreġistra lilu nnifsu biex jerġa' jibda kull darba login madwar Windows, macOS, u Linux, u jniedi l-iskritt dekodifikat bħala proċess separat. Xejn dwar dan ma jattiva waqt l-installazzjoni tal-npm; jistenna li l-kodiċi jiġi importat u mħaddem, li huwa mument aktar kwiet mill-installazzjoni.
Il-payload mhuwiex opak. Jintbagħat bħala base64 sempliċi, għalhekk id-dekodifikazzjoni tal-"apparat tat-test" tirkupra t-tieni stadju kollu kemm hu: a kripto-kartiera u ħalliel ta' sigrieti li jistenna li l-magna tibqa' wieqfa, jiġbor ċwievet privati u frażijiet taż-żerriegħa, jikkripta kull sejba b'ċavetta RSA-4096 hardcoded, u jesfiltraha billi jwaħħalha ma' ħażna IPFS pubblika, u jagħmel beaconing lura kull 12-il siegħa.
Aħna nsegwu l-grupp bħala PhantomSyncIt-tmien pakketti kollha kienu ħajjin fir-reġistru tal-npm fil-ħin tal-analiżi, ippubblikati taħt kont wieħed.
| Ekosistema | npm |
| Pakketti | base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-lib |
| Pjattaformi mmirati | Windows, macOS, Linux |
| Imġieba ewlenija | Dropper imdewwem fil-ħin tal-importazzjoni moħbi bħala apparat tat-test; jinstalla persistenza bejn il-pjattaformi |
| Tagħbija | Kartiera kripto u ħalliel ta' sigrieti, encryption RSA-4096, esfiltrazzjoni permezz ta' pinning IPFS pubbliku |
Anatomija tal-attakk
Kull pakkett jidher li ma jispikkax mal-ewwel qari. base58-utils, pereżempju, huwa ftit kilobytes ta' kodiċi ta' għajnuna Base58 / Bitcoin-WIF mingħajr dipendenza — eżattament dak li jwiegħed l-isem. Il-kodiċi rilevanti jinsab wara tal-modulu modulu.esportazzjonijiet, fejn qarrej li jħares lejn il-parti ta' fuq tal-fajl x'aktarx ma jħarisx: funzjoni li tinvoka lilha nnifisha li tiskeda lilha nnifisha b'tajmer.
Il-katina ta' operazzjonijiet, rikostruwita mis-sors tal-pakkett, taħdem hekk:
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 Żewġ għażliet ta' disinn jispikkaw.
Il-piż utli jivvjaġġa bħala apparat tat-test. It-tieni stadju mhuwiex miktub bħala kodiċi ovvju. Jgħix fi test/fixtures/keypairs.dat, fajl base64 li ismu jitħallat ma' pakkett li jiddikjara li jimmaniġġja pari ta' ċwievet. Għal bniedem li jħares lejn it-tarball, jidher qisu dejta kampjun; għall-kodiċi mehmuż, huwa skript biex jiddekodifika u jħaddem. Id-dropper innifsu ma fih l-ebda indirizz tan-netwerk — dawk jinsabu fit-tieni stadju — iżda m'hemm l-ebda offuskazzjoni addizzjonali: l-apparat huwa saff wieħed ta' base64, għalhekk id-dekodifikazzjoni tiegħu (bażi64 -d) jirkupra l-ammont sħiħ syncd.js u l-imġiba tan-netwerk tagħha. It-taqsima li jmiss tispjega x'jagħmel dak l-istadju rkuprat.
Id-detonazzjoni hija ttardjata u marbuta mal-importazzjoni, mhux mal-installazzjoni. Għax il-grillu huwa teħtieġ() flimkien ma' timer ta' ~37 sekonda minflok hook ta' installazzjoni, l-imġiba tevita kontrolli li jaraw biss il- npm jinstallaw pass, u d-dewmien idum aktar minn ħafna ġirjiet qosra ta' sandbox u CI. Sakemm xi ħaġa tiġi esegwita, l-installazzjoni li ġibdet il-pakkett tkun ilha lesta.
Ladarba l-iskritt dekodifikat ikun fuq id-diska f' ~/.cache-db/.node-sync/syncd.js — mogħdija magħżula biex tinqara bħal direttorju ta' cache ta' rutina — id-dropper jagħmilha tibqa' ħajja wara reboots fuq it-tliet pjattaformi ewlenin kollha:
- Linux: entrata cron li terġa' tniedi l-iskritt. L-entrata tiġi installata billi jiġi ffiltrat il-crontab eżistenti permezz ta' grep -v syncd, li għandu l-effett sekondarju li jħalli l-entrata l-ġdida barra minn lista sempliċi li tagħmel grep għall-istess isem.
- Windows: kompitu skedat bl-isem WinNodeSync, issettjat biex jerġa' jaħdem f'intervall ta' 12-il minuta.
- macOS: xogħol launchd immarkat com.apple.syncd, preżenti f'bosta mill-pakketti — tikketta li timita servizz leġittimu tas-sistema tal-Apple.
L-iskritt imbagħad jinbeda immedjatament bħala proċess separat, u għalhekk ikompli jaħdem wara li jintemm il-programm ta' importazzjoni.
X'jagħmel it-tieni stadju
Minħabba li l-apparat huwa saff wieħed base64, it-tieni stadju jiddekodifika b'mod nadif u jista' jinqara kollu kemm hu. It-tmien pakketti kollha jġorru waħda minn tliet varjanti tal-istess skript, li jidentifika lilu nnifsu f'kumment tal-intestatura bħala phantom syncd v3 — topo durmiente (“talpa rieqda”). Xogħolha hu li tisraq materjal tal-kartiera tal-kriptomunita u sigrieti tal-iżviluppaturi u tibgħathom 'il barra mill-magna. Taħdem f'dawn il-passi:
- 1. Stenna sakemm il-magna tkun wieqfa. Qabel ma tagħmel xejn, syncd.js jiċċekkja kemm ilu inattiv l-utent u jipproċedi biss lil hinn minn ċertu limitu (madwar 15-il minuta) — xprintidle fuq Linux, ioreg HIDIdleTime fuq macOS, u query ta' PowerShell idle-time fuq Windows. Għalhekk, il-ħsad għandu t-tendenza li jseħħ meta ħadd ma jkun fuq it-tastiera.
- 2. Ġib swiċċ ta' attivazzjoni kkontrollat mill-bogħodL-iskritt jiġbed konfigurazzjoni żgħira minn dead-drop qabel ma jaġixxi. Is-sors primarju huwa URL mhux ipproċessat ta' GitHub gist (gist.githubusercontent.com/juang55/…/cfg.txt); l-iskritt jiġi attivat biss jekk dik il-konfigurazzjoni taqra attiv=1Jekk il-gist ma jkunx disponibbli, dan jirrikorri għal tliet identifikaturi tal-kontenut IPFS hardcoded, miġbura permezz tal-gateways pubbliċi. gateway.pinata.cloud, ipfs.io, u cloudflare-ipfs.comDan jagħti lill-operatur kontroll tal-arm/diżarm wara l-fatt u fallback reżistenti għat-twaqqigħ. (L-iżgħar varjant, mibgħut fi kripto-valida-lib, Għajnuna għall-kartiera eth, u solana-key-utils, tneħħa s-saff tal-qofol u jiddependi biss fuq l-identifikaturi tal-IPFS.)
- 3. Iġbor materjal u sigrieti tal-kartiera. L-iskritt jimxi fid-direttorju tad-dar tal-utent — ~/.config/solana, ~/.ethereum/maħżen taċ-ċwievet, ~/.funderija, ~/.kappell iebes, ~ / .ssh, u desktop/dokumenti/downloads (inklużi ismijiet ta' folders bil-lingwa Spanjola), flimkien ma' ~/.env u fajls shell rc, u l-ekwivalenti AppData postijiet fuq il-Windows. Jimmira lejn ċwievet privati tal-Ethereum, ċwievet Bitcoin WIF, frażijiet taż-żerriegħa BIP-39, pari ta' ċwievet Solana, Ethereum keystore JSON, ċwievet SSH, u varjabbli tal-ambjent li jġorru sigrieti. Il-varjant akbar (fi abi-encode, base58-utils, eth-dev) iġorr id-dizzjunarju BIP-39 sħiħ ta' 2048 kelma u juża espressjonijiet regolari biex estratt ċwievet individwali u frażijiet taż-żerriegħa vvalidati minn kwalunkwe test li jaqra; iż-żewġ varjanti iżgħar minflok jaqblu l-fajls permezz ta' kelma prinċipali (żerriegħa, mnemoniku, kartiera, metamask, fantażma, ktieb, trezor, …) u ittella’ fajls sħaħ.
- 4. Ikkripta u eżfiltra permezz ta' servizz pubbliku ta' pinning. Kull sejba hija marbuta ma' marka tas-swaba' tal-ospitant (isem tal-utent@isem tal-host, pjattaforma, timestamp) u kriptat b'ċavetta pubblika RSA-4096 hardcoded inkorporata fl-iskritt. Ir-rekord kriptat imbagħad jiġi mtella' billi jiġi ppinjat mal-IPFS permezz ta' api.pinata.cloud/pinning/pinJSONToIPFS, awtentikat bil-kredenzjali tal-API Pinata hardcoded. M'hemm l-ebda server C2 magħmul apposta biex jiġi kkonfiskat: id-dejta misruqa hija pparkjata f'ħażna pubblika deċentralizzata, li tista' tiġi rkuprata mill-operatur bl-użu tal-hashes tal-kontenut li jirriżultaw. It-tlugħ huwa spazjat bi ftit sekondi ta' jitter każwali, u log lokali ta' timestamp | tip ta' ċavetta | hash irritornat jinżamm fi ~/.cache-db/.node-sync/.sl.
- 5. Ippersisti u ixgħel is-sinjal fuq ċiklu ta' 12-il siegħa. It-tieni stadju jerġa' jistabbilixxi l-persistenza tiegħu stess — entrata cron fuq Linux, a com.apple.syncd xogħol launchd fuq macOS, u kompitu skedat bl-isem WindowsNodeSync fuq Windows — issettjat biex jerġa' jaħdem kull 12-il siegħa. Innota li dan huwa differenti Isem tal-kompitu tal-Windows minn dak li jinstalla d-dropper (WinNodeSync); it-tnejn li huma ta’ min ifittex għalihom.
Kronoloġija
It-tmien pakketti ġew ippubblikati f'daqqa fl-2026-07-13 u l-2026-07-14. Diversi minnhom għandhom aktar minn verżjoni waħda; id-dropper huwa identiku fil-verżjonijiet kollha, bl-uniċi linji li jinbidlu hekk kif jinbidel id-daqs tal-kodiċi tal-utilità beninni fuqu.
| data | avveniment |
|---|---|
| 2026-07-13 | L-ewwel pakketti fil-grupp jidhru taħt pubblikatur wieħed (solana-key-utils, eth-wallet-helpers, crypto-validate-lib u verżjonijiet bikrija tal-bqija) |
| 2026-07-13 → 07-14 | L-ismijiet li fadal u l-verżjonijiet ta' segwitu ppubblikati; l-istess vapuri dropper miżjuda f'kull wieħed |
| 2026-07-14 | It-tmienja kollha mmarkati u analizzati; kull pakkett għadu jista' jiġi installat mir-reġistru |
Matul it-tifqigħa, ir-reputazzjoni tar-reġistru tal-pubblikatur inbidel minn bejn wieħed u ieħor newtrali fil-bidu tal-grupp għal negattiva ħafna hekk kif akkumulaw is-sejbiet — effett sekondarju osservabbli tal-pakketti li ġew immarkati, mhux karatteristika ddisinjata.
Indikaturi ta' Kompromess
L-indikaturi kollha hawn taħt ġew ikkonfermati preżenti fil-ħin tal-analiżi — dawk fit-tabelli tat-“Tieni stadju” permezz tad-dekodifikazzjoni test/fixtures/keypairs.dat u l-qari tal-irkuprat syncd.js.
Fajls u mogħdijiet
| Indikatur | Rwol |
|---|---|
~/.cache-db/.node-sync/syncd.js | It-tieni stadju dekodifikat, miktub bil-modalità 0o700 |
~/.cache-db/.node-sync/.sl | Reġistru lokali tal-esfiltrazzjoni (timestamp | tip ta' ċavetta | hash tal-IPFS) |
test/fixtures/keypairs.dat | Payload kodifikat bil-Base64 imqiegħed ġewwa t-tarball bħala "apparat tat-test" |
Infrastruttura tan-netwerk tat-tieni stadju (irkuprata minn syncd.js)
| Indikatur | Rwol |
|---|---|
gist.githubusercontent.com/juang55/b298754cb72942b1cdcf02ccd45cde2f/raw/cfg.txt | L-attivazzjoni titlef il-kontroll; l-iskritt jaħdem biss jekk il-konfigurazzjoni taqra active=1 |
Qmcqz3w8j4qFQXDAXAxnrdc2oSX3nzBT4NqtpTqL8mr1ga | Konfigurazzjoni ta' riserva tal-IPFS (CID) |
QmdTXoqVmTHY1i4ZWLdLkoQ9YChp5TXPh5cWXwnAYZt5iF | Konfigurazzjoni ta' riserva tal-IPFS (CID) |
QmfJkLU5gdCpqbbqEjWYC2anXW9FmuEeSLLeLiHVJKYUjp | Konfigurazzjoni ta' riserva tal-IPFS (CID) |
gateway.pinata.cloud, ipfs.io, cloudflare-ipfs.com | Il-gateways tal-IPFS użati biex iġibu l-konfigurazzjoni ta' riserva |
api.pinata.cloud/pinning/pinJSONToIPFS | Endpoint ta' esfiltrazzjoni, dejta misruqa mwaħħla ma' IPFS pubbliku |
| Ċavetta tal-API tal-Pinata | 13c766575b9270a9825d, kredenzjali ta' esfiltrazzjoni hardcoded |
Miri tal-ġbir tat-tieni stadju (irkuprati minn syncd.js)
| Indikatur | Rwol |
|---|---|
~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.hardhat, ~/.ssh, ~/.env, fajls rc tal-qoxra | Direttorji/fajls imfittxija għal ċwievet u sigrieti |
AppData\Roaming\Solana, AppData\Local\ethereum\keystore | Ekwivalenti tal-Windows imfittxija |
| Tipi ta' artefatti miġbura | Ċwievet privati tal-ETH, Bitcoin WIF, frażijiet taż-żerriegħa BIP-39, pari taċ-ċwievet Solana, JSON tal-maħżen taċ-ċwievet tal-Ethereum, ċwievet SSH, varjabbli tal-ambjent sigriet |
Artefatti tal-persistenza
| Pjattaforma | Indikatur |
|---|---|
| Linux | tnedija tad-dħul tal-cron syncd.js; installat permezz ta' crontab iffiltrat minn grep -v syncd |
| twieqi | kompitu skedat WinNodeSync (qattara) u WindowsNodeSync (it-tieni stadju) |
| MacOS | tikketta launchd com.apple.syncd |
| kollha. | It-tieni stadju jerġa' jippersisti f'ċiklu ta' 12-il siegħa |
Komportamentali
- Funzjoni li tinvoka lilha nnifisha miżjuda wara modulu.esportazzjonijiet, skedar a setTimeout ta' ~37,000 ms fuq l-importazzjoni.
- child_process spawn("nodu", ) bl-għażla separata ssettjata.
- Attivazzjoni idle-gated fit-tieni stadju (xprintidle / ioreg Ħin ta' inattività ta' HIDIdleTime / PowerShell; ~limitu ta' 15-il minuta).
- Kriptaġġ RSA-4096 għal kull sejba, imbagħad HTTPS POST għal API pubblika ta' pinning tal-IPFS.
Pakketti u verżjonijiet (npm, pubblikatur solbuilder_io)
| Pakkett | verżjonijiet |
|---|---|
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 |
Yayımcı,en
- solbuilder_io - angel_lopez89[@]proton[.]me, email mhux verifikata, l-ebda kont tal-kontroll tas-sors verifikat, l-ebda repożitorju marbut.
Attribuzzjoni u Imġieba Osservata
It-tmien pakketti jaqsmu kont wieħed ta' pubblikatur u payload wieħed. Kull wieħed huwa pakkett trivijali — ftit kilobytes ta' kodiċi ta' utilità reali bl-istess dropper miżjud — ippubblikat mingħajr repożitorju marbut u taħt email mhux verifikat ta' stil disposable. Dik l-uniformità, il-mogħdija kondiviża tad-drop, it-tikketti kondiviżi tal-persistenza, u l-kondiviżjoni... pari taċ-ċwievet.dat Il-fajl tal-istadjar huwa dak li jgħaqqad il-cluster flimkien.
Il-pakketti huma mhux tas-soltu sinċieri dwar l-imġieba tagħhom stess. solana-key-utils iġorr kummenti inline li jiddeskrivu l-blokk miżjud f'termini sempliċi — wieħed jittikkettah PHANTOM: persistenza inviżibbli, ieħor (bl-Ispanjol) jgħid Agħmel top fl-isfond, “mexxi l-mole fl-isfond.” Dawn huma l-annotazzjonijiet tal-kodiċi stess ta’ dak li jagħmel; l-isem tal-kampanja f’din il-kariga huwa meħud minn dik l-ewwel tikketta flimkien man-nodu falz “sync daemon” (sinkronizzazzjoni) li l-makkinarju tal-persistenza jimita.
Aħna niddeskrivu biss dak li l-kodiċi jagħmel b'mod osservabbli. L-ismijiet tal-pakketti — it-termini kollha tal-kripto, tal-kartieri, u tal-għodda tal-blockchain — jindikaw l-udjenza tal-iżviluppaturi li x'aktarx tiġbidhom b'isimhom; ma jistabbilixxux waħedhom min hu l-pubblikatur. It-tieni stadju kien kompletament irkuprabbli billi ġie dekodifikat l-apparat base64, u l-imġieba tiegħu hija deskritta hawn fuq: jiġbor iċ-ċwievet tal-kartieri, il-frażijiet taż-żerriegħa, u s-sigrieti u jesfiltrahom, kriptati bl-RSA, għal ħażna pubblika IPFS permezz ta' Pinata. Għażla ta' disinn notevoli hija n-nuqqas ta' server C2 privat — il-konfigurazzjoni tasal minn gist GitHub u IPFS, u d-dejta misruqa hija pparkjata f'ħażna pubblika deċentralizzata mdaħħla permezz ta' hash tal-kontenut, li t-tnejn huma aktar diffiċli biex jinħatfu minn host wieħed ikkontrollat minn attakkant. Ma nstab l-ebda rappurtar pubbliku preċedenti li jaqbel ma' dan il-cluster fil-ħin tal-kitba.
Impatt, Xejriet u Gwida għad-Difensuri
Min hu espost. Kull min żied wieħed minn dawn il-pakketti ma' proġett Node u mbagħad mexxa kodiċi li jimportah. Minħabba li d-detonazzjoni hija fil-ħin tal-importazzjoni aktar milli fil-ħin tal-installazzjoni, sempliċement li jkollok il-pakkett preżenti mhuwiex biżżejjed - iżda kwalunkwe użu normali li jgħabbi l-modulu jilħaq il-payload. L-ismijiet tal-lixka jimmiraw lejn żviluppaturi li jibnu fuq Ethereum, Solana, Arbitrum, Layer-2, u għodda ġenerali tal-kartiera/kodifikazzjoni - il-popolazzjoni li x'aktarx ikollha eżattament l-assi li t-tieni stadju jfittex. Kull min mexxa wieħed minn dawn il-moduli fuq magna li żżomm ċwievet tal-kartiera, frażijiet taż-żerriegħa, keystores, ċwievet SSH, jew .a V Is-sigrieti għandhom jittrattaw dawk il-kredenzjali bħala kompromessi u jdawruhom.
Żewġ mudelli li ta’ min jinternalizzawhom. L-ewwel, tagħbija utli bħala apparat: tibgħat it-tieni stadju bħala base64 ġewwa fajl tad-dejta b'isem plawżibbli (test/fixtures/keypairs.dat) iżomm is-sors viżibbli tal-pakkett jidher nadif u jimbotta l-kontenut malizzjuż f'fajl li l-għodod tar-reviżjoni u l-iskims umani spiss jittrattawh bħala dejta inerti. It-tieni, eżekuzzjoni mdewma fil-ħin tal-importazzjoni b'persistenza bejn il-pjattaformiIt-tneħħija tat-trigger mill-ganċ tal-installazzjoni, iż-żieda ta' timer, u mbagħad il-persistenza fil-cron, il-kompiti skedati, u launchd huwa pass intenzjonat 'il bogħod mit-tekniki aktar storbjużi tal-iskript tal-installazzjoni li l-iskannjar awtomatizzat tar-reġistru josserva l-aktar mill-qrib.
Gwida għad-difensuri u l-mantenimenturi:
- Ittratta l-kodiċi miżjud wara modulu.esportazzjonijiet bħala prijorità ta' reviżjoni — il-loġika tad-dropper ta' spiss tinħeba taħt il-wiċċ "reali" tal-modulu.
- Tassumix li l-fajls tad-dejta huma inerti. Blob base64 taħt test/attrezzaturi/ li jinqara waqt l-eżekuzzjoni u jiġi dekodifikat huwa biswit l-eżekutibbli; immarka l-qari waqt l-eżekuzzjoni ta' fajls ta' fixtures li jitimgħu funzjoni/eval/ikteb-imbagħad-ibidu katina.
- Kaċċa għat-triq tal-waqgħa ~/.cache-db/.node-sync/ u għall-unitajiet ta' persistenza WinNodeSync (kompitu skedat) u com.apple.syncd (launchd) fuq magni tal-iżviluppaturi li ġibdu dawn l-ismijiet.
- Twissija dwar proċessi tan-Node li joħolqu entrati cron, kompiti skedati, jew xogħlijiet launchd — libreriji leġittimi rarament jagħmlu dan waqt l-importazzjoni.
- Ippreferi lockfiles u verżjonijiet imwaħħlin, u rrevedi d-differenza ta' kwalunkwe dipendenza żgħira ġdida ta' "utilità", speċjalment pakketti ta' dipendenza żero ppubblikati minn kontijiet mhux verifikati mingħajr repożitorju marbut.
Għad-difensuri tar-reġistru, il-konklużjoni hija li l-monitoraġġ tal-install-hook huwa neċessarju iżda mhux biżżejjed: dropper tal-importazzjoni b'dewmien fit-tajmer imqiegħed ġewwa fajl tad-dejta jgħaddi minn kontroll tal-installazzjoni biss, u l-pass tal-persistenza ħafna drabi huwa l-aktar sinjal osservabbli qawwi li jkun fadal biex jinqabad.



