TL; DR
Mchapishaji mmoja wa npm alisafirisha vifurushi vidogo vinane ambavyo majina yake yanasomeka kama vizuizi vya ujenzi vya kila siku kwa ajili ya uundaji wa blockchain na pochi, base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, na crypto-validate-libKila moja ina huduma inayofanya kazi. Hata hivyo, iliyoambatanishwa baada ya huduma hiyo ni kizuizi cha msimbo kinachojivutia ambacho huendesha wakati moduli inapoingizwa.
Takriban sekunde 37 baada ya kuingiza, kizuizi hicho husimbua mzigo unaosafirishwa ndani ya kifurushi kilichojificha kama kifaa cha majaribio, hukiandika kwenye faili iliyofichwa chini ya saraka ya nyumbani ya mtumiaji, hujisajili ili kuanza upya kila baada ya muda fulani. login kwenye Windows, macOS, na Linux, na kuzindua hati iliyosimbwa kama mchakato uliotengwa. Hakuna kitu kuhusu hili kinachotokea wakati wa usakinishaji wa npm; inasubiri msimbo uingizwe na kuendeshwa, ambayo ni wakati mtulivu zaidi kuliko usakinishaji.
Mzigo wa mzigo si usio na mwanga. Husafirishwa kama msingi tupu64, kwa hivyo kubainisha "kifaa cha majaribio" hurejesha hatua ya pili kikamilifu: a mpokeaji wa pesa taslimu na mwizi wa siri ambayo husubiri mashine ikae bila kufanya kazi, huvuna funguo za kibinafsi na misemo ya mbegu, husimba kila kitu kwa njia fiche kwa ufunguo wa RSA-4096 ulio na msimbo mgumu, na kuuchuja kwa kuubandika kwenye hifadhi ya umma ya IPFS, na kuurudisha nyuma kila baada ya saa 12.
Tunafuatilia kundi kama Usawazishaji wa PhantomVifurushi vyote vinane vilikuwa moja kwa moja kwenye sajili ya npm wakati wa uchambuzi, vikiwa vimechapishwa chini ya akaunti moja.
| mazingira | npm |
| Packages | base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-lib |
| Majukwaa yanayolengwa | Windows, MacOS, Linux |
| Tabia kuu | Kiteremshi cha muda wa kuingiza kilichochelewa, kimefichwa kama kifaa cha majaribio; kinasakinisha uendelevu wa mifumo mbalimbali |
| Malipo | Mnyang'anyi wa pochi ya crypto na mwizi wa siri, usimbaji fiche wa RSA-4096, uondoaji wa data kupitia upigaji wa IPFS wa umma |
Anatomia ya mashambulizi
Kila kifurushi hakionekani cha ajabu unapokisoma kwa mara ya kwanza. vifaa vya base58Kwa mfano, ni kilobaiti chache za msimbo msaidizi wa Base58 / Bitcoin-WIF usiotegemea sifuri — hasa kile jina linachoahidi. Msimbo husika upo baada ya moduli ya moduli.usafirishaji nje, ambapo msomaji anayesoma kwa haraka juu ya faili hawezi kuangalia: kitendakazi kinachojivutia chenyewe kinachojipanga chenyewe kwa kutumia kipima muda.
Msururu wa shughuli, uliojengwa upya kutoka chanzo cha kifurushi, unaendeshwa hivi:
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 Chaguzi mbili za muundo zinajitokeza.
Mzigo husafiri kama kifaa cha majaribio. Hatua ya pili haijaandikwa kama msimbo dhahiri. Inaishi ndani majaribio/mipangilio/keypairs.dat, faili ya base64 ambayo jina lake huchanganyika katika kifurushi kinachodai kushughulikia jozi muhimu. Kwa mwanadamu anayesoma tarball kwa haraka, inaonekana kama data ya sampuli; kwa msimbo ulioambatishwa, ni hati ya kusimbua na kuendesha. Kitoneshi chenyewe hakina anwani ya mtandao — zile zinazoishi katika hatua ya pili — lakini hakuna msimbo wa ziada: kifaa ni safu moja ya base64, kwa hivyo huisimbua (msingi64 -d) hurejesha kamili syncd.js na tabia yake ya mtandao. Sehemu inayofuata inaangazia kile ambacho hatua hiyo ya kupona hufanya.
Mlipuko huchelewa na unahusishwa na uingizaji, sio usakinishaji. Kwa sababu kichocheo ni hitaji() pamoja na kipima muda cha sekunde ~ 37 badala ya ndoano ya usakinishaji, tabia hupuuza hatua za ukaguzi ambazo huangalia tu npm kufunga hatua, na ucheleweshaji hudumu zaidi ya majaribio mengi ya muda mfupi ya sanduku la mchanga na CI. Kufikia wakati kitu chochote kinapotekelezwa, usakinishaji ulioingiza kifurushi huwa umekamilika kwa muda mrefu.
Mara tu hati iliyosimbwa ikiwa kwenye diski saa ~/.cache-db/.node-sync/syncd.js — njia iliyochaguliwa kusoma kama saraka ya kawaida ya akiba — kitoneshi huifanya iendelee kuwaka upya kwenye mifumo yote mitatu mikuu:
- Linux: ingizo la cron linalozindua upya hati. Ingizo hilo linasakinishwa kwa kuchuja crontab iliyopo kupitia grep -v ilisawazishwa, ambayo ina athari ya kuacha ingizo jipya kutoka kwenye orodha wazi ambayo ina greps kwa jina moja.
- Windows: kazi iliyopangwa iliyopewa jina WinNodeSync, imewekwa ili kurudia katika kipindi cha dakika 12.
- macOS: kazi iliyozinduliwa yenye lebo com.apple.syncd, inapatikana katika vifurushi kadhaa — lebo inayoiga huduma halali ya mfumo wa Apple.
Kisha hati huanza mara moja kama mchakato uliotengwa, kwa hivyo inaendelea kufanya kazi baada ya programu inayoingiza kutoka.
Hatua ya pili hufanya nini
Kwa sababu kifaa hicho ni safu moja ya msingi64, hatua ya pili husimbuliwa kwa usahihi na inaweza kusomwa kikamilifu. Vifurushi vyote vinane vina moja kati ya aina tatu za hati moja, ambayo inajitambulisha katika maoni ya kichwa kama phantom synd v3 - topo durmiente ("Mole anayelala"). Kazi yake ni kuiba nyenzo za pochi za sarafu za kidijitali na siri za msanidi programu na kuzisafirisha kutoka kwenye mashine. Inafanya kazi katika hatua hizi:
- 1. Subiri hadi mashine iache kufanya kazi. Kabla ya kufanya chochote, syncd.js huangalia ni kwa muda gani mtumiaji amekuwa hafanyi kazi na hupita tu kizingiti (karibu dakika 15) — xprintidle kwenye Linux, ioreg HIDleTime kwenye macOS, na swali la PowerShell la muda usiotumika kwenye Windows. Kwa hivyo, uvunaji hutokea wakati hakuna mtu aliye kwenye kibodi.
- 2. Pakua swichi ya kuwasha inayodhibitiwa kwa mbaliHati huchota usanidi mdogo kutoka kwenye sehemu isiyo na mpangilio kabla ya kutenda. Chanzo kikuu ni URL ghafi ya GitHub (gist.githubusercontent.com/juang55/…/cfg.txt); hati huamilishwa tu ikiwa usanidi huo unasoma amilifu=1Ikiwa kiini hakipatikani, kinarudi nyuma kwenye vitambulisho vitatu vya maudhui vya IPFS vyenye msimbo mgumu, vinavyoletwa kupitia malango ya umma. lango.pinata.cloud, ipfs.io, na cloudflare-ipfs.comHii inampa mwendeshaji udhibiti wa mkono/kuondoa silaha baada ya tukio hilo na njia mbadala inayostahimili kuondolewa. (Lahaja ndogo zaidi, husafirishwa ndani lib ya kuthibitisha-kriptografia, wasaidizi wa pochi ya eth, na matumizi-ya-ufunguo-wa-solana, ina safu ya kiini iliyoondolewa na inategemea vitambulisho vya IPFS pekee.)
- 3. Kuvuna nyenzo na siri za pochi. Hati hutembea kwenye saraka ya nyumbani ya mtumiaji — ~/.config/solana, ~/.ethereum/duka la funguo, ~/.uvumbuzi, ~/.hardhat, ~/.ssh, na Eneo-kazi/Nyaraka/Machapisho (ikiwa ni pamoja na majina ya folda za lugha ya Kihispania), pamoja na ~/.env na faili za rc za ganda, na sawa AppData maeneo kwenye Windows. Inalenga funguo za kibinafsi za Ethereum, funguo za Bitcoin WIF, misemo ya mbegu ya BIP-39, jozi za funguo za Solana, duka la funguo la Ethereum JSON, funguo za SSH, na vigezo vya mazingira vyenye siri. Lahaja kubwa zaidi (katika msimbo wa abi, vifaa vya base58, eth-dev) ina kamusi kamili ya BIP-39 yenye maneno 2048 na hutumia misemo ya kawaida dondoo funguo za kibinafsi na vifungu vya maneno vilivyothibitishwa kutoka kwa maandishi yoyote yanayosomwa; badala yake aina mbili ndogo hulinganisha faili kwa neno muhimu (mbegu, mnemonic, mkoba, metamask, phantom, kitabu, salama, …) na upakie faili zote.
- 4. Simba na uiondoe kupitia huduma ya kubandika data ya umma. Kila ugunduzi umeunganishwa na alama ya kidole ya mwenyeji (jina la mtumiaji@jina la mwenyeji, jukwaa, muhuri wa muda) na kufichwa kwa kutumia ufunguo wa umma wa RSA-4096 uliowekwa kwenye hati. Rekodi iliyofichwa kisha hupakiwa kwa kuibandika kwenye IPFS kupitia api.pinata.cloud/pinning/pinJSONToIPFS, imethibitishwa na vitambulisho vya Pinata API vilivyo na msimbo mgumu. Hakuna seva maalum ya C2 ya kunasa: data iliyoibiwa imeegeshwa katika hifadhi ya umma iliyotengwa, inayoweza kupatikana na opereta kwa kutumia hashes za maudhui zinazotokana. Upakiaji umepangwa kwa sekunde chache za msisimko wa nasibu, na kumbukumbu ya ndani ya muhuri wa muda | aina ya ufunguo | hash-iliyorejeshwa huhifadhiwa katika ~/.cache-db/.node-sync/.sl.
- 5. Endelea na uendelee kwenye mzunguko wa saa 12. Hatua ya pili huanzisha tena uthabiti wake - ingizo la cron kwenye Linux, a com.apple.syncd kazi iliyozinduliwa kwenye macOS, na kazi iliyopangwa iliyopewa jina Usawazishaji wa WindowsNode kwenye Windows — imewekwa ili ifanye kazi tena kila baada ya saa 12. Kumbuka hii ni mbalimbali Jina la kazi ya Windows kutoka kwa ile ambayo kichujio husakinisha (WinNodeSync); zote mbili zinafaa kuwindwa.
Timeline
Vifurushi hivyo vinane vilichapishwa kwa ufupi mnamo 2026-07-13 na 2026-07-14. Vifurushi kadhaa vina zaidi ya toleo moja; kitoneshi kinafanana katika matoleo yote, huku masafa ya mstari pekee yakibadilika kadri ukubwa wa msimbo wa matumizi usio na madhara hapo juu unavyobadilika.
| tarehe | tukio |
|---|---|
| 2026-07-13 | Vifurushi vya kwanza katika kundi vinaonekana chini ya mchapishaji mmoja (solana-key-utils, eth-wallet-helpers, crypto-validate-lib na matoleo ya awali ya mengine) |
| 2026-07-13 → 07-14 | Majina na matoleo ya ufuatiliaji yaliyobaki yamechapishwa; kipeperushi kile kile kilichoambatanishwa kinasafirishwa katika kila moja |
| 2026-07-14 | Zote nane zimetiwa alama na kuchambuliwa; kila kifurushi bado kinaweza kusakinishwa kutoka kwa sajili |
Katika mlipuko huo, sifa ya usajili wa mchapishaji ilibadilika kutoka kutokuwa na upande wowote mwanzoni mwa kundi hadi kuwa hasi sana kadri ugunduzi ulivyoongezeka — athari inayoonekana ya vifurushi kuripotiwa, si kipengele kilichobuniwa.
Viashiria vya Maelewano
Viashiria vyote vilivyo hapa chini vilithibitishwa kuwepo wakati wa uchambuzi — vile vilivyo kwenye jedwali la "Hatua ya Pili" kwa kusimbua msimbo majaribio/mipangilio/keypairs.dat na kusoma yaliyopatikana syncd.js.
Faili na njia
| Kiashiria | Wajibu |
|---|---|
~/.cache-db/.node-sync/syncd.js | Hatua ya pili iliyosimbwa, iliyoandikwa kwa kutumia hali ya 0o700 |
~/.cache-db/.node-sync/.sl | Kumbukumbu ya uondoaji wa ndani (muhuri wa muda | aina ya ufunguo | hashi ya IPFS) |
test/fixtures/keypairs.dat | Mzigo wa malipo uliosimbwa kwa Base64 umewekwa ndani ya tarball kama "mchezo wa majaribio" |
Miundombinu ya mtandao ya hatua ya pili (iliyorejeshwa kutoka kwa syncd.js)
| Kiashiria | Wajibu |
|---|---|
gist.githubusercontent.com/juang55/b298754cb72942b1cdcf02ccd45cde2f/raw/cfg.txt | Uanzishaji haujakamilika; hati inaendeshwa tu ikiwa usanidi unasoma active=1 |
Qmcqz3w8j4qFQXDAXAxnrdc2oSX3nzBT4NqtpTqL8mr1ga | Usanidi mbadala wa IPFS (CID) |
QmdTXoqVmTHY1i4ZWLdLkoQ9YChp5TXPh5cWXwnAYZt5iF | Usanidi mbadala wa IPFS (CID) |
QmfJkLU5gdCpqbbqEjWYC2anXW9FmuEeSLLeLiHVJKYUjp | Usanidi mbadala wa IPFS (CID) |
gateway.pinata.cloud, ipfs.io, cloudflare-ipfs.com | Milango ya IPFS inayotumika kupata sehemu mbadala ya usanidi |
api.pinata.cloud/pinning/pinJSONToIPFS | Sehemu ya mwisho ya kuchuja, data iliyoibiwa imebandikwa kwenye IPFS ya umma |
| Ufunguo wa API ya Pinata | 13c766575b9270a9825d, kitambulisho cha uchujaji kilicho na msimbo mgumu |
Malengo ya ukusanyaji wa hatua ya pili (yaliyopatikana kutoka kwa syncd.js)
| Kiashiria | Wajibu |
|---|---|
~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.hardhat, ~/.ssh, ~/.env, faili za rc za ganda | Saraka/faili zilizotafutwa kwa funguo na siri |
AppData\Roaming\Solana, AppData\Local\ethereum\keystore | Vipimo sawa vya Windows vilitafutwa |
| Aina za vitu vya kale vilivyovunwa | Funguo za kibinafsi za ETH, Bitcoin WIF, misemo ya mbegu ya BIP-39, jozi za funguo za Solana, duka la funguo la Ethereum JSON, funguo za SSH, vars za siri za env |
Mabaki ya kudumu
| Jukwaa | Kiashiria |
|---|---|
| Linux | uzinduzi wa ingizo la cron syncd.js; imewekwa kupitia crontab iliyochujwa kupitia grep -v syncd |
| Windows | kazi iliyopangwa WinNodeSync (kitoneshi) na WindowsNodeSync (hatua ya pili) |
| MacOS | lebo iliyozinduliwa com.apple.syncd |
| Vyote | Hatua ya pili hujirudia yenyewe kwa mzunguko wa saa 12 |
Tabia
- Kitendakazi cha kujiita kimeongezwa baada ya moduli.usafirishaji nje, kupanga a seti ya MudaImekwisha ya ~37,000 ms wakati wa kuingiza.
- mtoto_mchakato spawn ("kifundo", ) na seti ya chaguo zilizotengwa.
- Uanzishaji usio na shughuli katika hatua ya pili (xprintidle / ioreg Muda wa HIDdleTime / PowerShell bila kufanya kazi; ~kizingiti cha dakika 15).
- Usimbaji fiche wa RSA-4096 kwa kila utafutaji, kisha HTTPS POST kwa API ya ubanaji wa IPFS ya umma.
Vifurushi na matoleo (npm, mchapishaji solbuilder_io)
| mfuko | matoleo |
|---|---|
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 |
Mchapishaji
- solbuilder_io - angel_lopez89[@]protoni[.]mimi, barua pepe haijathibitishwa, hakuna akaunti ya udhibiti chanzo iliyothibitishwa, hakuna hazina iliyounganishwa.
Tabia ya Sifa na Uangalizi
Vifurushi vinane vina akaunti moja ya mchapishaji na mzigo mmoja wa malipo. Kila kimoja ni kifurushi kidogo — kilobaiti chache za msimbo halisi wa matumizi na kichujio hicho hicho kimeambatishwa — kilichochapishwa bila hazina iliyounganishwa na chini ya barua pepe ya mtindo wa kutupwa ambayo haijathibitishwa. Usawa huo, njia ya kushuka iliyoshirikiwa, lebo za uvumilivu zilizoshirikiwa, na kichujio kilichoshirikiwa keypairs.dat Faili za upangaji ndizo zinazounganisha kundi pamoja.
Vifurushi hivyo vinasema waziwazi kuhusu tabia zao wenyewe. matumizi-ya-ufunguo-wa-solana hubeba maoni ya ndani yanayoelezea kizuizi kilichoambatishwa kwa maneno rahisi - mtu hukipa lebo MIZUNGUMZO: uvumilivu usioonekana, nyingine (kwa Kihispania) inasomeka Ejecutar topo kwenye mandharinyuma, “endesha mole nyuma.” Hizi ni maelezo ya msimbo yenyewe kuhusu kile kinachofanya; jina la kampeni katika chapisho hili limetolewa kutoka kwa lebo hiyo ya kwanza pamoja na nodi bandia "sync daemon" (iliyosawazishwa) kwamba mashine ya uvumilivu huiga.
Tunaelezea tu kile ambacho msimbo hufanya kwa urahisi. Utambuzi wa vifurushi - maneno yote ya crypto, pochi, na blockchain - unaonyesha hadhira ya msanidi programu ambayo ina uwezekano mkubwa wa kuvitoa kwa majina; yenyewe haibainishi mchapishaji ni nani. Hatua ya pili iliweza kurejeshwa kikamilifu kwa kutafsiri muundo wa base64, na tabia yake imeelezewa hapo juu: hukusanya funguo za pochi, misemo ya mbegu, na siri na kuziondoa, zikiwa zimesimbwa kwa RSA, hadi kwenye hifadhi ya umma ya IPFS kupitia Pinata. Chaguo muhimu la muundo ni kutokuwepo kwa seva ya kibinafsi ya C2 - usanidi hutoka kwa gist ya GitHub na IPFS, na data iliyoibiwa imeegeshwa katika hifadhi ya umma iliyotengwa na hash ya maudhui, ambayo yote ni magumu kukamata kuliko seva moja inayodhibitiwa na mshambuliaji. Hakuna ripoti za umma zilizotangulia zinazolingana na kundi hili zilizopatikana wakati wa kuandika.
Athari, Mitindo na Mwongozo kwa Watetezi
Nani amefichuliwa. Mtu yeyote aliyeongeza moja ya vifurushi hivi kwenye mradi wa Node na kisha akaendesha msimbo unaoingiza. Kwa sababu mlipuko ni wakati wa kuingiza badala ya wakati wa kusakinisha, kuwa na kifurushi tu haitoshi - lakini matumizi yoyote ya kawaida yanayopakia moduli hufikia mzigo wa malipo. Majina ya chambo yanalenga watengenezaji wanaojenga Ethereum, Solana, Arbitrum, Layer-2, na vifaa vya jumla vya pochi/usimbaji - idadi ya watu ina uwezekano mkubwa wa kuwa na mali ambazo hatua ya pili inazitafuta. Mtu yeyote aliyeendesha moja ya moduli hizi kwenye mashine yenye funguo za pochi, misemo ya mbegu, maduka ya funguo, funguo za SSH, au .a siri zinapaswa kuchukulia sifa hizo kama zilizoathiriwa na kuzibadilisha.
Mifumo miwili yenye thamani ya kuiga ndani. Kwanza, mzigo-kama-malipo: kusafirisha hatua ya pili kama base64 ndani ya faili ya data yenye jina linalowezekana (majaribio/mipangilio/keypairs.dat) huweka chanzo kinachoonekana cha kifurushi kikiwa safi na kusukuma maudhui hasidi kwenye faili ambayo zana za ukaguzi na skimu za kibinadamu mara nyingi huchukulia kama data isiyo na data. Pili, utekelezaji uliocheleweshwa wa muda wa kuingiza na kuendelea kwa mfumo mtambuka: kusogeza kichocheo kutoka kwenye ndoano ya usakinishaji, kuongeza kipima muda, na kisha kuendelea kwenye cron, kazi zilizopangwa, na launchd ni hatua ya makusudi mbali na mbinu za usakinishaji-hati zenye kelele zaidi ambazo uchanganuzi wa kiotomatiki wa usajili huangalia kwa karibu zaidi.
Mwongozo kwa watetezi na walezi:
- Tibu msimbo ulioongezwa baada ya moduli.usafirishaji nje kama kipaumbele cha mapitio — mantiki ya kushuka mara nyingi hujificha chini ya uso wa moduli "halisi".
- Usidhani faili za data hazijakamilika. Kipande cha msingi 64 chini ya majaribio/michezo/ ambayo husomwa wakati wa utekelezaji na kusimbuliwa ni karibu na utekelezaji; tia alama usomaji wa faili za usanidi zinazolisha a kazi/eval/andika-kisha-kuzaa mnyororo.
- Tafuta njia ya kushuka ~/.cache-db/.node-sync/ na kwa vitengo vya uvumilivu WinNodeSync (kazi iliyopangwa) na com.apple.syncd (ilizinduliwa) kwenye mashine za wasanidi programu zilizotoa majina haya.
- Tahadhari kuhusu michakato ya Node inayounda maingizo ya cron, kazi zilizopangwa, au kazi zilizozinduliwa — maktaba halali mara chache hufanya hivi zinapoingizwa.
- Pendelea faili za kufuli na matoleo yaliyobandikwa, na uhakiki tofauti ya utegemezi wowote mpya mdogo wa "matumizi", haswa vifurushi vya utegemezi sifuri vimechapishwa na akaunti ambazo hazijathibitishwa bila hazina iliyounganishwa.
Kwa watetezi wa usajili, jambo la kuzingatia ni kwamba ufuatiliaji wa ndoano ya usakinishaji ni muhimu lakini haitoshi: kichujio cha muda wa kuingiza na kuchelewesha muda kilichowekwa ndani ya faili ya data kitapita ukaguzi wa muda wa usakinishaji pekee, na hatua ya kuendelea mara nyingi ndiyo ishara kubwa inayoonekana iliyobaki kukamatwa.



