TL; DR
Je la 21-a de majo de 2026, la eldonisto de npm jaggle publikigis naŭ versiojn (1.0.0 tra 1.0.8) de @jaggle/resizeobserves en proksimume duhora fenestro.
La pakaĵo estas tajperaro de la legitima @juggle/resize-observer polyfill — vaste uzata pakaĵo kun milionoj da ĉiusemajnaj elŝutoj — sed ne liveras veran ResizeObserver-implementon.
Anstataŭe, la pakaĵo postinstala hoko instalas faskigitan Python-utilŝarĝon, registras persistecon kiel platform-denaskeaspektantan rultempan peranton, kaj deplojas transplatforman poŝtabapilon celantan kriptomonecajn transakciojn.
linux persisto aperas kiel python3-dbus-helper, MacOS as com.apple.python.runtimeKaj fenestroj as PyRuntimeBroker.
La utila ŝarĝo kontinue monitoras la tondejon por monujadresoj tra pli ol 40 blokĉenoj kaj silente anstataŭigas kopiitajn adresojn per atakanto-kontrolitaj monujoj.
La malica programaro funkcias tute loke sen elira C2-infrastrukturo, igante la anstataŭigon de la tondujo mem la elfiltrada mekanismo.
La ĉefa IOC estas la pakaĵnomo mem: @jaggle/resizeobserves — notu la faligitan vokalon en “jaggle” kaj la aldonitan “s” en “resizeobserves”.
Severeco: alta.
La Atako: Kiel Ĝi Funkcias
npm:@jaggle/resizeobserves ne aspektas kiel malica programaro hazarde npm-vido. Lia LEGUMIN.md estas la laŭvorta README de npm:@juggle/resize-observer — samaj kodaj ekzemploj, samaj uzinstrukcioj, sama importi { ResizeObserver } el '@juggle/resize-observer' referencoj tra la tuta teksto. La plagiato estas tiel kompleta, ke ĉiu, kiu ekrigardas la dokumentaron, supozus, ke ili legas la dokumentojn de la legitima pakaĵo.
la pako.json, kontraste, estas maldensa: ne repositorio kampo, unuopa am eniro montrante al bin/clipboard-guardian.jsKaj postinstalo skripto kiu funkcias nodo npm-install.jsLa ekzemploj "Baza uzado" de la README-dosiero referencas JavaScript-implementon, kiu ne ekzistas ie ajn en la tar-dosiero. La sola JavaScript en la pakaĵo estas la instala skripto.
Etapo 1 — npm postinstala ekfunkciigas Python-utilŝarĝon
npm-install.js estas platform-konscia. Ĝi lokalizas pip plenumebla laŭ fiksa serĉpado (/usr/bin/pip3, /usr/loka/ujo/pip, refalante al python3 -m pip), instalas la pakaĵon de Python el la dosierujo tarball, kaj — en Linukso — tiras xclip or xsel tra kapabla akiri, Pacmanoaŭ dnf se nek unu nek la alia jam ĉeestas:
La uzo de –rompo-sistemo-pakaĵoj estas intenca: modernaj Linuksaj distribuaĵoj liveras Python kun la ebligita markilo "ekstere-administrita-medio" de PEP 668, kiu defaŭlte blokas tutretejajn pip-instalaĵojn. La instala skripto devigas la instaladon fini.
La skripto ankaŭ konscias pri sudo. Kiam la kuranta uid-dosiero estas la rezulto de sudo npm instali, la manuskripto legas SUDO_UZANTO kaj elspezas por getent pasvorto trovi la reala la hejman dosierujon de la uzanto, poste skribas siajn persistajn dosierojn tie anstataŭ en / radikoPersisto estas por uzanto, ne por tuta sistemo.
Ŝtupo 2 — Persisto inter diversaj operaciumoj sub nomoj de rultempaj perantoj
Post la instalado de la Python-pakaĵo, la skripto registras aŭtomatan startan eniron sub malsama nomo en ĉiu operaciumo:
- linux — sistemd-uzanta unuo ĉe ~/.config/systemd/user/python3-dbus-helper.serviceLa unuo Priskribo is Python D-Bus Rultempa HelpiloLa skripto ankaŭ provas ebligi ĝin per sistemctl –uzanto ebligi, revenante al mana simbolligilo sub defaŭlta.celo.volas/ kiam systemctl malsukcesas. Se ĝi funkcias per sudo, la skripto ŝanĝas al sudo -u sistemctl –uzantokun XDG_RUNTIME_DIR agordita por ke la uzanto-busa voko funkciu.
- MacOS — listo de Lanĉagentoj ĉe ~/Biblioteko/Lanĉagentoj/com.apple.python.runtime.plist kun RunAtLoad=vera kaj KonservuViva=vera, poste ŝarĝita per lanĉi ŝarĝon.
- fenestroj — Planita Tasko nomita PyRuntimeBroker, ekigita AtLogOn, kun plenumtempolimo de nulo (t.e., sen tempolimo), registrita per PowerShell.
Ĉiuj tri nomoj estas kredindaj je unua ekrigardo. python3-dbus-helpanto sekvas la nomregularon de legitima Python-D-Bus integriĝo sur Linuksaj labortabloj. com.apple.python.rultempo imitas la inversan DNS-etikedadon de Apple por siaj propraj servoj. PyRuntimeBroker ripetas la Vindozon RuntimeBroker.exe — vera, subskribita servo de Microsoft, kiu peras permespetojn por UWP-aplikaĵoj. Neniu el ĉi tiuj estas veraj servoj de Apple/Microsoft/Python en ĉi tiu kunteksto, sed defendanto faranta rapidan vidan skanon de sistemctl –uzantlisto-unuoj or Akiri-Planitan Taskon estas verŝajne, ke ĝi ektremos.
Ŝtupo 3 — La poŝtbutera ŝtelkaptisto
La Python-utila ŝarĝo, instalita ĉe clipboard_guardian/guardian.py, kuras senfinan buklon prienketante la sisteman tondejon ĉiujn 400 milisekundojn. Ĉe ĉiu tiktako, ĝi tiras la nunan enhavon de la tondejo per pyperclip.paste() kaj komparas ilin kun listo de pli ol kvardek antaŭkompilitaj regulaj esprimoj kovrantaj monuj-adresformatojn por Ethereum, Bitcoin, Monero, Solana, TRON, TON, Ripple, Litecoin, Dogecoin, Polkadot, NEAR, Cosmos, Algorand, Stellar, Cardano, Bitcoin Cash, Dash, Zcash, Aptos, Sui, Tezos, MultiversX, Harmony, Terra, Injective, Osmosis, Kava, Celestia, Nano, Filecoin, Ronin, Ergo, DigiByte, Hedera, BNB Smart Chain, kaj pluraj aliaj malplenaj sed enhavitaj en la defaŭlta agordo (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin).
Kiam kongruo okazas, la skripto legas la adreson de la atakanto por tiu ĉeno de ~/.config/clipboard-guardian/config.json (aŭ ĝiaj platformaj ekvivalentoj) kaj anstataŭigas la tondejon per la anstataŭigita teksto:
Ne ekzistas retsignalo. La tondilo ne telefonas hejmen, ne registras infektitajn komputilojn, ne elfiltras ion ajn. La elfiltrado estas la anstataŭigo mem: kiam uzanto kopias ricevantan adreson el la uzulinterfaco de sia monujo kaj algluas ĝin en sendan dialogon, la algluita adreso apartenas al la funkciigisto. La mono perdiĝas ene de la bendo, travideble por la uzanto.
Kio estas nova ĉi tie
Kelkaj detaloj elstaras kompare kun la ĝenerala ŝablono por kripto-tondilo:
1. npm → Python-kruciĝo. Plej multaj kripto-tondiloj, kiujn ni vidas en npm, estas pura JavaScript, ofte malklarigitaj per _0x rotacio de tabelo aŭ eval(atob(…)) stakoj. Ĉi tiu ekzemplo uzas la npm-tar-pakon kiel nenion pli ol liver-envolvaĵon por Python-pakaĵo — pura Python — kaj lasas pip pritrakti dependecan instaladon (piperklipo, psutil, nedeviga agordiproktitolon) deklarita en la faskigita pyproject.tomlNe estas JavaScript-malklarigado por venki. La tondilo mem estas simpla, legebla Python.
2. Tri-OS-persistaj etikedoj elektitaj por kredindeco. Multaj transplatformaj instaliloj registras persistecon sub ĝeneralaj nomoj (ĝisdatigilo.servo, helpanto.plist). Ĉi tiu ekzemplo penigas elekti etikedojn, kiuj similas al platform-denaskaj rultempaj perantoj en ĉiu operaciumo. La nomado estas la sola provo pri kaŝado — ne estas rudkompleto, ne estas kaŝejo de uzantolando, ne estas vojmalklariĝo. La veto estas, ke defendantoj malofte kontrolas ~/.config/systemd/uzanto/ kaj ke servo nomita python3-dbus-helpanto ne elstaros en neformala recenzo.
3. Kaŝiĝo de proceztitolo estas reala, sed kontraŭanalizo estas dormanta. La Python-utila ŝarĝo difinas _kaŝi_procezo() funkcio kiu agordas la procezan titolon per agordiproktitolon (Linukso/macOS) aŭ AgordiKonzolanTitolonW (Vindozo) — kaj ĉefa () ĝi ja nomas ĝin. Do ps al montros python3-dbus-helpanto anstataŭ python3 …/gardanto.pyTamen, la sama modulo difinas ĉu_monitoro_funkcias() funkcio kiu listigas konatajn procez-monitorajn ilojn (htop, btop, Taskadministrilo, Aktiveca Monitorilo, Proceza Retpirato, Rimeda Monitorilo, GNOME / KDE / Xfce / MATE sistemaj monitoriloj, kaj tiel plu) — kaj ĉefa () neniam vokas ĝin. La anstataŭiga buklo funkcias senkondiĉe, ĉu la uzanto havas malfermitan procezmonitoron aŭ ne. La funkcio estas morta kodo en la liverita versio. Ĝi plej verŝajne estas restaĵo de pli frua iteracio, aŭ skafaldaro por trajto ankoraŭ ne konektita. Ĉiuokaze, la kontraŭanaliza surfaco de la publikigita utila ŝarĝo estas unu proceztitola renomigo, ne aktiva monitora evitado.
4. La kunligita agord-kunfanda konduto. npm-install.js skribas la defaŭltan monujliston al ~/.config/clipboard-guardian/config.json kaj, se jam ekzistas agordodosiero, kunfandas iujn ajn ŝlosilojn kies ekzistanta valoro estas malplena. Tio signifas uzanton, kiu antaŭe estis infektita kaj parte purigis la agordon — ekzemple, malplenigante la ethereum valoro — replenigos ĝin ĉiu posta instalado de malica pakaĵo. Ne estas purigo de la persista dosiero en iu ajn kodpado.
| Dato / Tempo (UTC) | okazaĵo |
|---|---|
2026-05-21 18:50:32 | @jaggle/resizeobserves@1.0.0 eldonita. |
2026-05-21 19:55:55 | 1.0.1 publikigita — unua versio markita per ekstera skanado. |
2026-05-21 19:58:10 | 1.0.2 eldonita. |
2026-05-21 20:05:03 | 1.0.3 eldonita. |
2026-05-21 20:09:24 | 1.0.4 eldonita. |
2026-05-21 20:13:48 | 1.0.5 eldonita. |
2026-05-21 20:41:52 | 1.0.6 eldonita. |
2026-05-21 20:43:56 | 1.0.7 publikigita — aldonas try/catch envolvaĵo ĉirkaŭ la skribpaŝo de monujo-agordo npm-install.js. |
2026-05-21 20:46:15 | 1.0.8 publikigita — instalilo renomita npm-install.js → npm-install.cjs (bajt-identa enhavo). |
2026-05-22 | Verdiktoj kaj IOC-oj publikigitaj. Versioj ankoraŭ troviĝas en la registro dum la publikigo (daŭrante). |
Naŭ versioj en unu horo kaj kvindek ses minutoj estas rapidaj eĉ por tajperaro. La ŝablono kongruas kun publikigu-kaj-bruligu kampanjon — inundi la registron sub unu tenilo, lasi detekton sekvi sian kurson, kaj moviĝi al nova tenilo post kiam unuopa versio estas forigita. La videblaj deltoj tra la kuro estas kosmetikaj: 1.0.1 aldonis eksplicitan /usr/bin/pip3-stilaj vojoj al la pip-serĉlisto (sudo-kongrueco), 1.0.7 envolvis la skribon de wallet-config en try/catch, kaj 1.0.8 renomis la instalilon de .js al .cjs konservante ĝian enhavon bajto-identa. La .cjs renomu trakojn per npm-avertoj pri ambigua modula rezolucio en pakaĵoj sen eksplicita "tipo" kampo, kaj eble estas provo subpremi bruon dum instalado, kiu povus atentigi. La ŝarĝo de Python — la sola parto, kiu efektive ŝtelas — restas senŝanĝa en ĉiuj naŭ versioj.
Indikiloj de Kompromiso
pakaĵoj
| Ekosistemo | pakaĵo | versioj | Statuso |
|---|---|---|---|
| npm | @jaggle/resizeobserves | 1.0.0 tra 1.0.8 | Reklamebla je publikigo; forigo petita. |
Dosieroj kaj Haŝoj
| vojo | Notoj |
|---|---|
clipboard_guardian/guardian.py(md5 f7935c2c82bc881288611ab6cd634f17) | Identa en ĉiuj naŭ publikigitaj versioj (1.0.0 tra 1.0.8La ŝarĝo de la tondilo. |
npm-install.js (1.0.0 – 1.0.7)npm-install.cjs (1.0.8) | Persista instalilo; sama fin-al-fina konduto. 1.0.7's .js kaj 1.0.8's .cjs estas bajt-identaj. |
~/.config/clipboard-guardian/config.json | Linuksa persista agordo kaj monujo-pakaĵo. |
~/Library/Application Support/clipboard-guardian/config.json | macOS-persista agordo kaj monujpakaĵo. |
%APPDATA%\clipboard-guardian\config.json | Vindoza persista agordo kaj monujo-pakaĵo. |
~/.config/systemd/user/python3-dbus-helper.service | Linuksa aŭtomata starta persisto. |
~/Library/LaunchAgents/com.apple.python.runtime.plist | macOS LaunchAgent-persisto. |
~/Library/Logs/com.apple.python.runtime.log | macOS stdout/stderr-protokolo por la agento. |
Scheduled Task PyRuntimeBroker | Aŭtomata starta tasko de Vindozo (AtLogOn, sen paŭzo). |
Kondutaj Indikiloj
| signalo | Priskribo |
|---|---|
pip install --break-system-packages de npm postinstalo | Devigas tutretejan Python-instalaĵon preterirante PEP 668-protektojn. |
apt-get install -y xclip (aŭ pacman/dnf) | Instalas tondilajn ilojn en Linukso dum pakaĵa instalado. |
python3-dbus-helper.service systemd uzanto-unuo | Persisto registrita sub kredindaspekta rultempa helpnomo. |
com.apple.python.runtime LaunchAgent | Persista etikedo ekster legitimaj Apple-sistemaj vojoj. |
PyRuntimeBroker Planita Tasko | Falsa persisto de la rultempa peranto de Vindozo sen legitima instalilfonto. |
Python-procezo titolita python3-dbus-helper importanta pyperclip kaj psutil | Kondutisma miskongruo inter la montrata proceznomo kaj la importitaj bibliotekoj. |
| Ŝanĝoj de la poŝtabulo ~0.4s post kopio de la monujo-adreso | Subskriba konduto de kriptovaluta adresanstataŭigo. |
Pakaĵo de monujoj por atakantoj (listo por ĉasado de defendantoj)
La monujolisto estas sendata fikskodita en npm-install.js kaj clipboard_guardian/guardian.pyDefendantoj povas uzi la liston kaj kiel blokliston (trakti ajnan translokigon al ĉi tiuj adresoj de entreprenaj monujoj kiel suspektindan) kaj kiel ĉasŝlosilon (trakti la ĉeeston de iu ajn el ĉi tiuj ĉenoj en neaŭtentikita agordodosiero, konstruartefakto aŭ programista maŝino kiel infektindikilon).
Pakaĵo de Atakanto-Monujo
| ĉeno | Adreso |
|---|---|
| Ethereum / BSC | 0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Ronin (EVM) | ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| bitcoin | bc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y |
| Bitcoin Cash | bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt |
| Litecoin | ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe |
| Hundo | DNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy |
| paŭzostreko | XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS |
| Zcash | t1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M |
| DigiByte | DPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH |
| Monero | 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf |
| Solana | DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5 |
| TRONO | TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2 |
| TON | UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr |
| Ripple | r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H |
| polkadot | 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG |
| PROKSIME | 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364 |
| kosmo | cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e |
| osmosis | osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t |
| Celestia | celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5 |
| injektiva | inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh |
| Kava | kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux |
| harmonio | one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a |
| terra | terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x |
| Algorand | XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI |
| Estelar | GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE |
| Cardano | addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f |
| MultiversX | erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0 |
| taŭga | 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e |
| sui | 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78 |
| nano | nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn |
| Filecoin | f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui |
| Tezos | tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk |
| tial | 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA |
| Kapa | 0.0.10488092 |
Ĉenoj kun regula esprimo-kovrado sed malplenaj monujaj fendoj en la defaŭlta agordo — Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB — ne estas aktive anstataŭigitaj en ĉi tiu konstruo sed estas detektitaj. Traktu ilin kiel monitoran amplekson anstataŭ anstataŭan amplekson.
Atribuo kaj Motivo
La kampanjo ofertas maldikan atribuan surfacon. Ni ne povis konfirmi la identecon de la funkciigisto. Kion ni povas registri:
- Metadatenoj de eldonisto. La npm-konto skui listigas sian retpoŝtadreson kiel olgascarlet@deltajohnsons.comLa domajno deltajohnsons.com ne rezulte al entreprena identeco, kiun ni povas kontroli. La npm-konto montras neniun retpoŝtan konfirmon kaj neniun SCM konfirmo. Ne ekzistas asociita publika ĉeesto en GitHub.
- Deponeja kampo. la pako.json portas ne repositorio kampo. La legitima npm:@juggle/resize-observer montras al reala GitHub-deponejo kun miloj da steloj kaj aktivaj problemoj. La foresto de ligilo al deponejo estas la plej rapida vida indiko en la npm-interfaco.
- README-dosiero pri plagiato. La pakaĵo README estas la legitima @juggle/resize-observer README bajto-post-bajto, inkluzive de importado ekzemploj kiuj referencas @juggle/resize-observer sin (ne la publikigan pakaĵon). La funkciigisto eĉ ne provis reskribi la importaĵojn — ofta signalo, ke la legaĵo estis forigita, ne adaptita.
- Neniu infrastrukturo sur kiu pivoti. Ne ekzistas C2-finpunkto, nek DNS-serĉo, nek IP-adreso. La malica konduto estas plene enkapsuligita en la loka tondilo plus la fikse kodita monuja pakaĵo. Tio malutiligas domajn- aŭ ASN-bazitan pivotadon. Defendantoj pivotantaj trans kampanjoj devus haŝ-kongruigi la monujojn kun iu ajn antaŭa tondilo, kiun ili havas registrita; reuzo de monujo trans pakaĵoj estas la plej traktebla interkampanja ligo.
- Nomelekto. @jaggle/resizeobserves estas unu signon malsimila al @ĵongli kaj unu fleksio for de la konata regrandigi-observantoLa kombinita redaktodistanco estas du ideogramoj. Ĉi tio estas konscia vida kolizio, ne ĝenerala kaŭriĝo.
Motivado, bazita sur la konduto de la utila ŝarĝo: pura monetigo per oportunisma anstataŭigo de la tondujo. Ne okazas rikoltado de akreditaĵoj, nek fingrospurado de la gastiganto, nek legado de ĉirkaŭaj variabloj. La funkciigisto ne zorgas, kiu estas la viktimo — ili zorgas, ke la sekva translokigo de la viktimo montru al unu el la listigitaj adresoj. La kvardek-ĉena kovrado estas la loteria modelo en ago: ĵetita larĝe, esperi, ke ununura altvalora pasto alteriĝos unufoje por N instaladoj.
La funkciigisto ŝajnas nezorgita pri forigo. Publikigi naŭ versiojn ene de du horoj sub la sama amplekso legiĝas kiel publikigi-kaj-bruligi tenilon: maksimumigi la registrospuron antaŭ ol la foriga latenteco atingas, poste daŭrigi. Ni ne observis @ĵaglu reeldonante sub nova amplekso dum la verkado, sed ni atendus similajn ampleksojn (@jaggie, @ĵongli-, @joggle) aperos dum la venontaj tagoj se la funkciigisto ankoraŭ estas aktiva.
Efiko, Tendencoj & Kion Defendantoj Devus Fari
efiko
Kvantigi efikon en reala mono ne eblas el la nuna datumbazo. La tondilo ne skribas telemetrion kaj la monujoj ankoraŭ ne estas observitaj ricevante anstataŭigitajn translokigojn je la limo de la analizo (sekva traserĉo de la listigitaj ĉenoj estas en nia listo). La legitima npm:@juggle/resize-observer averaĝas bone en sepciferajn semajnajn elŝutojn — celo de alt-trafika tajperaro — kaj la malica pakaĵo estis aktiva dum malpli ol 24 horoj dum la malkaŝo, kio limigas la eksponitan populacion sed ne nuligas ĝin.
La radiuso de la eksplodo, kiun valoras spuri, ne estas rektaj elŝutoj de @jaggle/resizeobserves — tiuj estas verŝajne malgrandaj. Temas pri **transiraj instaladoj**: programisto aldonanta la pakaĵon al sablokestprojekto, funkcianta npaga instali, kaj poste forgesante ke la instala hoko iam funkciis. Ĉiu maŝino kiu prilaboris la postinstalan nun havas poŝtabul-kaptilon por ĉiu uzanto dum aŭtomata starto, sendepende de ĉu la projekto ankoraŭ estas sur la disko. Forigante la pakaĵdosierujon de nodo_moduloj **ne** forigas la persistecon.
Emerĝantaj ŝablonoj
Du tendencojn ekzempligas ĉi tiu kampanjo.
npm kiel Python-ŝarĝliverenvolvaĵo. La npm tarball estas 4-linia instalilo; la efektiva ŝtelisto estas Python, instalita sistem-kovranta de pip el la pakaĵigita dosierujo. Ĉi tio ne estas nova — ni jam vidis npm-pakaĵojn forigi Python antaŭe — sed ĝi fariĝas mezureble pli ofta formo tra kripto-tondilaj kampanjoj. La avantaĝo por la funkciigisto estas duobla: Python-tondilaj bibliotekoj (piperklipo unua inter ili) estas pli puraj kaj pli transplatformaj ol la JavaScript-ekvivalentoj, kaj plej multaj aŭtomataj npm-skaniloj pezigas JavaScript-dosierojn kaj Python .py faskoj malpeze. La kosto estas, ke la instala spuro estas multe pli laŭta — freŝa pip instali estas malfacile kaŝi sur programista maŝino, kiu normale ne pip instali dum npaga instali.
Platformo-denaskaj nomoj kiel la sola sekreto. Pluraj lastatempaj tondiloj kaj ŝtelistoj de malgrandŝarĝaj programoj tute forlasis kodnivelan malklarigadon favore al legitimaspektaj persistetikedoj. python3-dbus-helpanto, com.apple.python.rultempoKaj PyRuntimeBroker estas lernolibraj ekzemploj — nomoj, kiujn la okulo de defendanto preterlasos en listo de kvardek uzantoservoj. Ĉi tio estas malmultekosta, daŭra formo de sekreto: la malaktivigo estas laŭpaka, sed la persistaj dosieroj postvivas la malaktivigon, kaj servo nomita laŭ realaspekta platforma komponanto ne estos purigita per io ajn krom eksplicita revizio.
Kion defendantoj devus fari
- Kontroli ~/.config/systemd/user/, ~/Library/LaunchAgents/, kaj Get-ScheduledTask produktado sur programistaj maŝinoj por la enskriboj listigitaj en IOC-oj. Forigo de la npm-pakaĵo lasas ĉi tiujn en la sama loko; ili devas esti forigitaj permane.
- Bloki translokigojn al la listigitaj monujadresoj ĉe la limoj inter entreprena trezorejo kaj DeFi-monujo, kie permeslisto de adresoj estas havebla.
- Serĉu ~/.config/clipboard-guardian/config.json (kaj platformaj ekvivalentoj) tra la programisto-maŝina aro. Ĉeesto de la dosiero estas alt-fida infekto sendepende de kiu pakaĵversio liveris ĝin.
- Serĉu node_modules/ por clipboard_guardian/guardian.py en momentfotoj de la konstruo-kaŝmemoro, kiuj eble datas de antaŭ la forigo. La md5 de la dosiero estas stabila tra ĉiuj reviziitaj versioj.
- Ŝlosdosier-pinglo @juggle/resize-observer (la legitima pakaĵo) do estontaj instaloj ne povas solvi al io alia sub unu-signa mistajpo, precipe en senŝlosdosieraj laborfluoj kiel npx.
- Traktu ajnan npm-postinstalan alvokantan pip-instalon kiel alt-severeco en konstruado-pipeline politiko. Ne ekzistas legitima kialo por ke npm-pakaĵo bezonu pip dum instalado — Python-iloj distribuas Python-ilojn.
- Serĉu per process_iter()-kompareblajn monitoradajn datumojn por procezoj nomitaj python3-dbus-helper kiuj importas pyperclip — la misagordo de kaŝvestiĝo (D-Bus-helpanto tenanta bibliotekon de tondujoj) estas la plej pura konduta indikilo, kiun ni havas.
- Turnu monujadresojn algluitajn de infektitaj maŝinoj. Poŝbreta ŝtelo kompromitas la vojon inter monujo-interfaco kaj algluo-celo; adresoj kopiitaj dum infekto povas esti silente ŝanĝitaj. Ĉio sendita dum la infekto-fenestro estu traktata kiel eble misdirektita.
La konkludo: persisteco supervivas forigon. La registro poste forigos @jaggle/resizeobserves en ĉiuj naŭ versioj; la systemd-unuo, la Lanĉagento, kaj la Planita tasko ne forigos sin mem.
Referencoj
- @juggle/resize-observer ĉe npm — la legitima pakaĵo, kiun ĉi tiu tajperaro imitas; utila kiel bazlinio por la bajto-post-bajta README-dosiero.
- @jaggle/resizeobserves registro metadatenoj — publikigu tempstampojn por la naŭ malicaj versioj, utilaj por krimmedicina templinio.





