TL; DR
Usa ka npm publisher ang nagpadala og walo ka gagmay nga mga pakete kansang mga ngalan daw sama sa adlaw-adlaw nga mga bloke sa pagtukod alang sa blockchain ug pagpalambo sa wallet, base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, Ug crypto-validate-libAng matag usa adunay sulod nga naglihok nga utility. Apan, gilakip human niana nga utility ang usa ka self-invoking block sa code nga modagan sa higayon nga ang module ma-import.
Mga 37 segundos human sa pag-import, kanang block mo-decode og payload nga ipadala sulod sa package nga gitago isip test fixture, isulat kini sa usa ka tinago nga file ubos sa home directory sa user, ug i-register ang kaugalingon aron mag-restart sa matag login sa Windows, macOS, ug Linux, ug ilunsad ang na-decode nga script isip usa ka detached nga proseso. Walay mahitabo niini atol sa npm install; maghulat kini nga ma-import ug mapadagan ang code, nga mas hilom nga higayon kaysa sa installation.
Ang payload dili opaque. Kini ipadala isip plain base64, busa ang pag-decode sa "test fixture" makabawi sa ikaduhang yugto sa hingpit: a crypto-wallet ug kawatan og mga sekreto nga maghulat nga ang makina moandar nga walay gamit, mokuha sa mga pribadong yawe ug mga seed phrase, mo-encrypt sa matag nakaplagan gamit ang hardcoded RSA-4096 key, ug mo-exfiltrate niini pinaagi sa pag-pin niini sa publikong IPFS storage, nga mo-beacon balik matag 12 ka oras.
Gisubay namo ang cluster isip PhantomSyncAng tanang walo ka pakete anaa sa npm registry sa panahon sa pag-analisar, nga gipatik ubos sa usa ka account.
| Ecosystem | npm |
| packages | base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-lib |
| Mga plataporma nga gitarget | Windows, macOS, Linux |
| Kinauyokan nga pamatasan | Nalangan, ang import-time dropper gitago isip test fixture; nag-install sa cross-platform persistence |
| Baybay | Mangawat og crypto-wallet ug mga sekreto, RSA-4096 encryption, exfiltration pinaagi sa public IPFS pinning |
Anatomiya sa pag-atake
Ang matag pakete morag dili kaayo talagsaon sa unang pagbasa. base58-utils, pananglitan, kay pipila ka kilobytes sa zero-dependency Base58 / Bitcoin-WIF helper code — eksakto kung unsa ang gisaad sa ngalan. Ang may kalabutan nga code anaa human sa ang modyul module.exports, diin ang usa ka magbabasa nga nag-skim sa ibabaw sa file dili lagmit nga motan-aw: usa ka self-invoking function nga nag-iskedyul sa iyang kaugalingon gamit ang usa ka timer.
Ang kadena sa mga operasyon, nga gi-reconstruct gikan sa package source, nagdagan sama niini:
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 Duha ka mga kapilian sa disenyo ang talagsaon.
Ang payload mobiyahe isip usa ka test fixture. Ang ikaduhang yugto wala gisulat isip klaro nga kodigo. Nagpuyo kini sa test/fixtures/keypairs.dat, usa ka base64 file kansang ngalan gisagol sa usa ka pakete nga nag-angkon nga nagdumala sa mga pares sa yawe. Para sa usa ka tawo nga nag-skim sa tarball, kini morag sample data; para sa gilakip nga code, kini usa ka script nga i-decode ug ipadagan. Ang dropper mismo walay network address — kadtong anaa sa ikaduhang yugto — apan walay dugang nga obfuscation: ang fixture usa ka single layer sa base64, busa ang pag-decode niini (base64 -d) mabawi ang hingpit syncd.js ug ang pamatasan sa network niini. Ang sunod nga seksyon maghisgot kung unsa ang gibuhat sa nabawi nga yugto.
Ang pagbuto nalangan ug nalambigit sa pag-import, dili sa pag-instalar. Kay ang hinungdan mao ang kinahanglan() dugang usa ka ~37-segundos nga timer imbes nga usa ka install hook, ang pamatasan molikay sa mga pagsusi nga nagtan-aw lang sa npm pag-instalar lakang, ug ang pagkalangan molungtad og dugay kay sa daghang mubo nga sandbox ug CI runs. Sa panahon nga mapatuman na ang bisan unsa, ang install nga nagbira sa package dugay nang nahuman.
Sa higayon nga ang na-decode nga script anaa na sa disk sa ~/.cache-db/.node-sync/syncd.js — usa ka agianan nga gipili aron mabasa sama sa usa ka routine cache directory — ang dropper mopahimo niini nga mabuhi bisan sa mga pag-reboot sa tanang tulo ka dagkong plataporma:
- Linux: usa ka cron entry nga mo-relaunch sa script. Ang entry gi-install pinaagi sa pagsala sa kasamtangang crontab pinaagi sa grep -v syncd, nga adunay side effect sa pagtangtang sa bag-ong entry gikan sa usa ka plain listing nga mokuha sa parehas nga ngalan.
- tamboanan; usa ka naka-eskedyul nga buluhaton nga ginganlan og WinNodeSync, gikatakda nga modagan pag-usab sulod sa 12 minutos nga pahulay.
- macOS: usa ka trabaho nga gilunsad nga gimarkahan og com.apple.syncd, nga anaa sa pipila ka mga pakete — usa ka label nga nagsundog sa usa ka lehitimong serbisyo sa sistema sa Apple.
Ang script dayon sugdan isip usa ka bulag nga proseso, aron kini magpadayon sa pagdagan human matapos ang programa sa pag-import.
Unsa ang gibuhat sa ikaduhang yugto
Tungod kay ang fixture usa ka single base64 layer, ang ikaduhang yugto limpyo nga nag-decode ug mabasa sa hingpit. Ang tanang walo ka pakete adunay usa sa tulo ka variant sa parehas nga script, nga nagpaila sa kaugalingon sa usa ka header comment isip phantom syncd v3 — topo durmiente (“sleeping nunal”). Ang trabaho niini mao ang pagkawat sa mga materyal sa cryptocurrency-wallet ug mga sekreto sa developer ug ipadala kini gikan sa makina. Kini modagan sa mosunod nga mga lakang:
- 1. Paghulat hangtod nga ang makina dili na moandar. Sa dili pa mobuhat ug bisan unsa, syncd.js nagsusi kon unsa ka dugay nga wala aktibo ang tiggamit ug milapas lang sa usa ka sukdanan (mga 15 minutos) — xprintidle sa Linux, ioreg HIDIdleTime sa macOS, ug usa ka PowerShell idle-time query sa Windows. Busa, ang pag-ani kasagarang mahitabo kung walay tawo sa keyboard.
- 2. Kuhaa ang remote-controlled nga activation switchAng script mokuha og gamay nga config gikan sa usa ka dead-drop sa dili pa molihok. Ang pangunang tinubdan kay usa ka GitHub gist raw URL (gist.githubusercontent.com/juang55/…/cfg.txt); ang script mo-activate lang kon mabasa sa maong config aktibo=1Kon ang gist dili magamit, kini mobalik sa tulo ka hardcoded IPFS content identifiers, nga gikuha pinaagi sa public gateways. gateway.pinata.cloud, ipfs.io, Ug cloudflare-ipfs.com. Kini naghatag sa operator og after-the-fact arm/disarm control ug takedown-resistant fallback. (Ang pinakagamay nga variant, gipadala sa crypto-validate-lib, mga katabang sa eth wallet, Ug solana-key-utils, gikuha na ang gist layer ug nagsalig lamang sa mga IPFS identifier.)
- 3. Pag-ani og mga materyales ug mga sekreto para sa pitaka. Ang script moagi sa home directory sa user — ~/.config/solana, ~/.ethereum/keystore, ~/.pandayan, ~/.hardhat, ~ / .ssh, Ug desktop/Dokumento/Downloads (lakip ang mga ngalan sa folder sa Kinatsila nga pinulongan), dugang pa ~/.env ug mga shell rc file, ug ang katumbas niini AppData mga lokasyon sa Windows. Gitarget niini ang mga pribadong yawe sa Ethereum, mga yawe sa Bitcoin WIF, mga hugpong sa binhi sa BIP-39, mga keypairs sa Solana, JSON sa keystore sa Ethereum, mga yawe sa SSH, ug mga variable sa palibot nga adunay sekreto. Ang mas dako nga variant (sa abi-encode, base58-utils, eth-dev) nagdala sa kompletong 2048-ka-pulong nga BIP-39 nga diksyonaryo ug naggamit og mga regular nga ekspresyon aron kinuha indibidwal nga mga yawe ug gi-validate nga mga hugpong sa mga pulong gikan sa bisan unsang teksto nga gibasa niini; ang duha ka gagmay nga mga variant sa baylo nagpares sa mga file pinaagi sa keyword (binhi, mnemonic, pitaka, metamask, kalag, ledger, trezor, …) ug i-upload ang tibuok nga mga file.
- 4. I-encrypt ug i-exfiltrate pinaagi sa usa ka pampublikong serbisyo sa pinning. Ang matag nakaplagan giubanan sa usa ka fingerprint sa host (ngalan sa tiggamit@ngalan sa host, plataporma, timestamp) ug gi-encrypt gamit ang hardcoded RSA-4096 public key nga gi-embed sa script. Ang naka-encrypt nga rekord gi-upload dayon pinaagi sa pag-pin niini sa IPFS pinaagi sa api.pinata.cloud/pinning/pinJSONToIPFS, gi-authenticate gamit ang hardcoded Pinata API credentials. Walay bespoke C2 server nga kuhaon: ang gikawat nga datos gi-parking sa publikong desentralisadong storage, nga makuha sa operator gamit ang resulta nga content hashes. Ang mga upload gi-spaced nga adunay pipila ka segundos nga random jitter, ug usa ka lokal nga log sa timestamp | tipo sa yawe | gibalik nga hash gitipigan sa ~/.cache-db/.node-sync/.sl.
- 5. Padayon ug pasigaa sa 12-oras nga siklo. Ang ikaduhang yugto nag-establisar pag-usab sa kaugalingon niining persistence — usa ka cron entry sa Linux, usa ka com.apple.syncd gilunsad ang trabaho sa macOS, ug usa ka naka-eskedyul nga buluhaton nga ginganlan og WindowsNodeSync sa Windows — gitakda nga modagan pag-usab matag 12 ka oras. Timan-i nga kini usa ka lainlaig Ngalan sa buluhaton sa Windows gikan sa usa nga gi-install sa dropper (WinNodeSync); pareho silang angay pangitaon.
Timeline
Ang walo ka pakete gipatik nga sunod-sunod niadtong 2026-07-13 ug 2026-07-14. Daghan ang adunay labaw sa usa ka bersyon; ang dropper parehas sa lain-laing mga bersyon, nga ang mga line offset lang ang nag-usab-usab samtang ang gidak-on sa dili makadaot nga utility code sa ibabaw niini mausab.
| Petsa | Hitabo |
|---|---|
| 2026-07-13 | Ang unang mga pakete sa cluster makita ubos sa usa ka publisher (solana-key-utils, eth-wallet-helpers, crypto-validate-lib ug mga unang bersyon sa nahabilin) |
| 2026-07-13 → 07-14 | Ang nahibiling mga ngalan ug mga sunod nga bersyon gipatik; ang parehas nga gilakip nga dropper ipadala sa matag usa |
| 2026-07-14 | Ang tanang walo gimarkahan ug gisusi; ang matag pakete ma-install pa gikan sa registry |
Sa pikas bahin, ang reputasyon sa registry sa publisher mibalhin gikan sa halos neyutral sa pagsugod sa cluster ngadto sa kusganong negatibo samtang natipon ang mga detection — usa ka makita nga side effect sa mga package nga gi-flag, dili usa ka gidisenyo nga feature.
Mga Timailhan sa Kompromiso
Ang tanang mga timailhan sa ubos gikumpirma nga anaa sa panahon sa pag-analisar — kadtong anaa sa mga lamesa sa "Ikaduhang yugto" pinaagi sa pag-decode test/fixtures/keypairs.dat ug pagbasa sa nabawi syncd.js.
Mga file ug mga agianan
| timailhan | papel |
|---|---|
~/.cache-db/.node-sync/syncd.js | Gi-decode ang ikaduhang yugto, gisulat gamit ang mode nga 0o700 |
~/.cache-db/.node-sync/.sl | Lokal nga talaan sa pag-exfiltration (timestamp | key-type | IPFS hash) |
test/fixtures/keypairs.dat | Ang Base64-encoded payload gi-stage sulod sa tarball isip usa ka "test fixture" |
Ikaduhang ang-ang sa imprastraktura sa network (gikuha gikan sa syncd.js)
| timailhan | papel |
|---|---|
gist.githubusercontent.com/juang55/b298754cb72942b1cdcf02ccd45cde2f/raw/cfg.txt | Dead-drop ang pagpaaktibo; modagan lang ang script kon mabasa ang config active=1 |
Qmcqz3w8j4qFQXDAXAxnrdc2oSX3nzBT4NqtpTqL8mr1ga | Pag-fallback sa pag-configure sa IPFS (CID) |
QmdTXoqVmTHY1i4ZWLdLkoQ9YChp5TXPh5cWXwnAYZt5iF | Pag-fallback sa pag-configure sa IPFS (CID) |
QmfJkLU5gdCpqbbqEjWYC2anXW9FmuEeSLLeLiHVJKYUjp | Pag-fallback sa pag-configure sa IPFS (CID) |
gateway.pinata.cloud, ipfs.io, cloudflare-ipfs.com | Mga IPFS gateway nga gigamit sa pagkuha sa config fallback |
api.pinata.cloud/pinning/pinJSONToIPFS | Endpoint sa exfiltration, gikawat nga datos nga gi-pin sa publikong IPFS |
| Pinata API key | 13c766575b9270a9825d, gi-hardcode nga kredensyal sa exfiltration |
Mga target sa koleksyon sa ikaduhang yugto (gikuha gikan sa syncd.js)
| timailhan | papel |
|---|---|
~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.hardhat, ~/.ssh, ~/.env, mga file sa shell rc | Mga direktoryo/file nga gipangita para sa mga yawe ug mga sekreto |
AppData\Roaming\Solana, AppData\Local\ethereum\keystore | Mga katumbas sa Windows nga gipangita |
| Mga klase sa artifact nga giani | Mga pribadong yawe sa ETH, Bitcoin WIF, mga hugpong sa binhi sa BIP-39, mga pares sa yawe sa Solana, Ethereum keystore JSON, mga yawe sa SSH, mga sekreto nga env vars |
Mga artifact sa pagpadayon
| Platform | timailhan |
|---|---|
| Linux | paglusad sa cron entry syncd.js; gi-install pinaagi sa crontab nga gisala grep -v syncd |
| Windows | naka-eskedyul nga buluhaton WinNodeSync (tulo sa tubo) ug WindowsNodeSync (ikaduhang yugto) |
| macOS | label sa paglansad com.apple.syncd |
| Ang tanan nga | Ang ikaduhang yugto nagpadayon pag-usab sa usa ka 12-oras nga siklo |
Paggawi
- Ang function sa pagtawag sa kaugalingon gidugang pagkahuman module.exports, pag-iskedyul og setTimeout nga ~37,000 ms sa import.
- proseso sa bata spawn("node", ) uban sa gibulag nga opsyon set.
- Idle-gated nga pagpaaktibo sa ikaduhang yugto (xprintidle / ioreg HIDIdleTime / PowerShell nga walay gamit nga oras; ~15-minutos nga sukdanan).
- Per-finding RSA-4096 encryption, dayon HTTPS POST ngadto sa usa ka publikong IPFS pinning API.
Mga pakete ug mga bersyon (npm, publisher solbuilder_io)
| package | Mga bersikulo |
|---|---|
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 |
Tagmantala
- solbuilder_io - angel_lopez89[@]proton[.]me, email nga wala mapamatud-i, walay napamatud-an nga source-control account, walay nalambigit nga repository.
Pag-ila ug Naobserbahan nga Kinaiya
Ang walo ka pakete nag-ambit og usa ka publisher account ug usa ka payload. Ang matag usa usa ka gamay nga pakete — pipila ka kilobytes sa tinuod nga utility code nga adunay parehas nga dropper — gimantala nga walay nalambigit nga repository ug ubos sa usa ka wala mapamatud-i nga disposable-style nga email. Kana nga uniformity, ang shared drop path, ang shared persistence labels, ug ang shared mga pares sa key.dat Ang staging file mao ang naghiusa sa cluster.
Ang mga pakete talagsaon nga prangka bahin sa ilang kaugalingong pamatasan. solana-key-utils nagdala og mga inline nga komento nga naghulagway sa gidugang nga bloke sa yano nga mga termino — usa ang nag-label niini PHANTOM: dili makita nga pagpadayon, ang lain (sa Kinatsila) mabasa Ejecutar topo en background, “ipadagan ang nunal sa background.” Kini ang kaugalingong mga anotasyon sa code sa kung unsa ang gibuhat niini; ang ngalan sa kampanya niini nga post gikuha gikan sa unang label uban sa peke nga node nga "sync daemon" (gi-sync) nga gisundog sa makinarya sa paglahutay.
Among gihulagway lamang kung unsa ang makita nga gibuhat sa code. Ang pagngalan sa mga pakete — tanan crypto, wallet, ug blockchain-tooling nga mga termino — nagpakita sa developer audience nga lagmit mokuha sa ilang ngalan; dili kini mismo ang magtino kung kinsa ang publisher. Ang ikaduhang yugto hingpit nga mabawi pinaagi sa pag-decode sa base64 fixture, ug ang pamatasan niini gihulagway sa ibabaw: kini nagkolekta sa mga yawe sa wallet, mga seed phrase, ug mga sekreto ug gi-exfiltrate kini, nga gi-encrypt sa RSA, ngadto sa publikong IPFS storage pinaagi sa Pinata. Usa ka talagsaong pagpili sa disenyo mao ang pagkawala sa usa ka pribado nga C2 server — ang configuration gikan sa usa ka GitHub gist ug IPFS, ug ang gikawat nga datos giparking sa publikong desentralisadong storage nga gi-key sa content hash, nga parehong mas lisud kuhaon kaysa usa ka attacker-controlled host. Walay naunang publikong report nga nahiuyon niini nga cluster ang nakit-an sa panahon sa pagsulat.
Epekto, Mga Uso ug Giya para sa mga Tigpanalipod
Kinsa ang nabuyagyag. Bisan kinsa nga nagdugang og usa niini nga mga pakete sa usa ka proyekto sa Node ug dayon nagpadagan sa code nga nag-import niini. Tungod kay ang detonation kay oras sa pag-import imbes nga oras sa pag-install, ang pagbaton lang sa pakete dili igo — apan ang bisan unsang normal nga paggamit nga nag-load sa module makaabot sa payload. Ang mga ngalan sa pangdani nagtumong sa mga developer nga nagtukod sa Ethereum, Solana, Arbitrum, Layer-2, ug kinatibuk-ang wallet/encoding tooling — ang populasyon nga lagmit adunay eksakto nga mga asset nga gipangita sa ikaduhang yugto. Bisan kinsa nga nagpadagan sa usa niini nga mga module sa usa ka makina nga adunay mga yawe sa wallet, mga seed phrase, mga keystore, mga yawe sa SSH, o .env ang mga sekreto kinahanglan nga isipon kadtong mga kredensyal isip nakompromiso ug ibalhin kini.
Duha ka sumbanan nga angay i-internalize. Una, kargamento-isip-fixture: pagpadala sa ikaduhang yugto isip base64 sulod sa usa ka data file nga adunay makatarunganong ngalan (test/fixtures/keypairs.dat) nagpabilin nga limpyo tan-awon ang makita nga tinubdan sa pakete ug giduso ang malisyosong sulod ngadto sa usa ka file nga kasagarang giisip sa mga himan sa pagrepaso ug mga skim sa tawo nga dili aktibo nga datos. Ikaduha, paglangan sa pag-import sa oras nga adunay pagpadayon sa cross-platformAng pagbalhin sa trigger gikan sa install hook, pagdugang og timer, ug dayon pagpadayon sa cron, naka-iskedyul nga mga buluhaton, ug launchd usa ka tinuyo nga lakang gikan sa mas saba nga mga teknik sa install-script nga labing gibantayan sa automated registry scanning.
Giya para sa mga tigpanalipod ug tigmentinar:
- Trataha ang gidugang nga code pagkahuman module.exports isip prayoridad sa pagrepaso — ang dropper logic kanunay nga nagtago sa ilalom sa "tinuod" nga nawong sa module.
- Ayaw hunahunaa nga ang mga data file dili aktibo. Usa ka base64 blob ubos sa pagsulay/mga dula/ nga gibasa sa runtime ug gi-decode kay executable-adjacent; i-flag ang runtime reads sa fixture files nga nagpakaon og function/ebalwasyon/sulat-unya-mikuha kadena.
- Pangitaa ang agianan sa pag-ubos ~/.cache-db/.node-sync/ ug para sa mga yunit sa paglahutay WinNodeSync (gikatakdang buluhaton) ug com.apple.syncd (launchd) sa mga makina sa developer nga nakakuha niining mga ngalan.
- Alerto sa mga proseso sa Node nga naghimo og mga cron entries, naka-iskedyul nga mga buluhaton, o mga trabaho nga gilunsad — ang mga lehitimong librarya talagsa ra mobuhat niini sa pag-import.
- Mas gusto ang mga lockfile ug mga naka-pin nga bersyon, ug ribyuha ang kalainan sa bisan unsang bag-o ug gamay nga "utility" dependency, labi na mga pakete nga walay pagsalig nga gipatik pinaagi sa wala napamatud-i nga mga account nga walay nalambigit nga repository.
Para sa mga tigpanalipod sa registry, ang punto mao nga ang install-hook monitoring gikinahanglan apan dili igo: ang import-time, timer-delayed dropper nga gibutang sulod sa data file mopasar sa install-time-only check, ug ang persistence step kasagaran mao ang pinakakusog nga makita nga signal nga kinahanglan masalo.



