PhantomSync: Pakketti tal-Kripto npm Jaħbu l-Ħalliel tal-Kartiera

PhantomSync: tmien pakketti npm ta' żviluppaturi tal-kripto jaħbu dropper ittardjat u awto-persistenti

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.

Ekosistemanpm
Pakkettibase58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-lib
Pjattaformi mmiratiWindows, macOS, Linux
Imġieba ewlenijaDropper imdewwem fil-ħin tal-importazzjoni moħbi bħala apparat tat-test; jinstalla persistenza bejn il-pjattaformi
TagħbijaKartiera 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.

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.

sca-tools-software-composition-analysis-tools
Prijoritizza, irranġa, u assigura r-riskji tas-softwer tiegħek
Ikseb il-Kont B'Xejn tiegħek.
Mhix meħtieġa karta ta 'kreditu.

Assigura l-Iżvilupp u l-Kunsinna tas-Softwer tiegħek

bis-Suite tal-Prodotti Xygeni