RuntimeBroker npm Typosquat Plants Crypto Clipper

RuntimeBroker: një npm Typosquat mbjell një Crypto-Clipper me 40 Zinxhirë si një Cross-OS \"Ndihmës i Runtime-it të Sistemit"\

TL; DR

Më 21-05-2026, botuesi i npm jaggle lëshuar nëntë versione (1.0.0 përmes 1.0.8) të @jaggle/resizeobserves në një dritare prej afërsisht dy orësh.

Paketa është një gabim shtypi i së drejtës legjitime. @juggle/resize-observer polyfill — një paketë e përdorur gjerësisht me miliona shkarkime javore — por nuk ofron asnjë implementim aktual të ResizeObserver.

Në vend të kësaj, paketa grep pas instalimit instalon një ngarkesë të integruar Python, regjistron persistencën si një ndërmjetësues në kohë ekzekutimi me pamje të platformës vendase dhe vendos një rrëmbyes të clipboard-it ndërplatformor që synon transaksionet e kriptomonedhave.

Linux Qëndrueshmëria shfaqet si python3-dbus-helper, MacOS as com.apple.python.runtimedhe Dritaret as PyRuntimeBroker.

Ngarkesa monitoron vazhdimisht kujtesën për adresat e portofoleve në të gjithë më shumë se 40 blockchain-e dhe zëvendëson në heshtje adresat e kopjuara me portofolet e kontrolluara nga sulmuesit.

Malware vepron tërësisht në nivel lokal pa asnjë infrastrukturë C2 dalëse, duke e bërë vetë zëvendësimin e clipboard-it mekanizmin e nxjerrjes.

IOC-ja kryesore është vetë emri i paketës: @jaggle/resizeobserves — vini re zanoren e hequr në “jaggle” dhe “s”-në e shtuar në “resizeobserves”.

Ashpërsia: e lartë.

Sulmi: Si funksionon

npm:@jaggle/resizeobserves nuk duket si program i dëmshëm në një ekran të zakonshëm pamje npm. I saj LEXONI.md është README fjalë për fjalë e npm:@juggle/resize-observer — të njëjtat shembuj kodi, të njëjtat udhëzime përdorimi, të njëjtat importo { ResizeObserver } nga '@juggle/resize-observer' referenca në të gjithë dokumentacionin. Plagjiatura është aq e plotë sa kushdo që i hedh një vështrim dokumentacionit do të supozonte se po lexon dokumentet e paketës legjitime.

La package.json, në të kundërt, është i rrallë: jo depo fushë, një e vetme bin hyrje që tregon drejt bin/clipboard-guardian.jsDhe a post-instalim skript që ekzekutohet nyja npm-install.jsShembujt e "Përdorimit Bazë" të README i referohen një implementimi të JavaScript që nuk ekziston askund në tarball. I vetmi JavaScript në paketë është skripti i instalimit.

Faza 1 — npm postinstall bootstraps një ngarkesë Python

npm-install.js është i vetëdijshëm për platformën. Ai lokalizon një cicërin ekzekutueshëm përgjatë një shtegu të fiksuar kërkimi (/usr/bin/pip3, /usr/local/bin/pip, duke u kthyer në python3 -m pip), instalon paketën Python të përfshirë nga direktoria tarball, dhe — në Linux — e tërheq klip x or xsell nga apt-get, Pacmanose DNF nëse asnjëra nuk është tashmë e pranishme:

Përdorimi i –paketa-të-sistemit-të-break-ut është e qëllimshme: shpërndarjet moderne të Linux-it ofrojnë Python me shënuesin e mjedisit të menaxhuar nga jashtë të PEP 668 të aktivizuar, i cili bllokon instalimet e pip-it në të gjithë faqen si parazgjedhje. Skripti i instalimit e detyron instalimin të kryhet.

Skripti është gjithashtu i vetëdijshëm për sudo-n. Kur uid-i që ekzekutohet është rezultat i një instalimi i sudo npm, skripti lexon SUDO_USER dhe shpërblehet për të fjalëkalimi getent për të gjetur real direktoria kryesore e përdoruesit, pastaj shkruan skedarët e tij të vazhdueshëm atje në vend që të futet në të. / RootQëndrueshmëria është për secilin përdorues, jo për të gjithë sistemin.

Faza 2 — Përhershmëria ndër-sistem operativ nën emrat e ndërmjetësve të kohës së ekzekutimit

Pasi të instalohet paketa Python, skripti regjistron një hyrje të nisjes automatike nën një emër të ndryshëm në secilin sistem operativ:

  • Linux — një njësi përdoruesi e sistemuar në ~/.config/systemd/user/python3-dbus-helper.serviceNjësia Përshkrim is Ndihmësi i Python D-Bus RuntimeSkripti gjithashtu përpiqet ta aktivizojë atë nëpërmjet systemctl – aktivizimi i përdoruesit, duke u kthyer te një lidhje simbolike manuale nën default.target.wants/ kur systemctl dështon. Nëse ekzekutohet nën sudo, skripti kalon në sudo -u systemctl –përdorues, Me XDG_RUNTIME_DIR caktojeni në mënyrë që thirrja e autobusit të përdoruesit të funksionojë.
  • MacOS — një listë e LaunchAgent në ~/Library/LaunchAgents/com.apple.python.runtime.plist me RunAtLoad=e vërtetë Mbaj gjallë = e vërtetë, pastaj u ngarkua nëpërmjet ngarkimi i launchctl.
  • Dritaret — një Detyrë e Planifikuar e quajtur PyRuntimeBroker, e aktivizuar AtLogOn, me një limit kohor ekzekutimi prej zero (domethënë, pa skadim kohe), e regjistruar nëpërmjet PowerShell.

Të tre emrat janë të besueshëm në një shikim. ndihmësi-python3-dbus ndjek konventën e emërtimit të integrimit legjitim Python-D-Bus në desktopët Linux. com.apple.python.runtime imiton etiketimin e kundërt të DNS të Apple për shërbimet e veta. PyRuntimeBroker i bën jehonë Windows-it RuntimeBroker.exe — një shërbim i vërtetë dhe i nënshkruar nga Microsoft që ndërmjetëson kërkesat për leje për aplikacionet UWP. Asnjë nga këto nuk është shërbim i vërtetë i Apple/Microsoft/Python në këtë kontekst, por një mbrojtës që bën një skanim të shpejtë vizual të systemctl –njësitë e listës së përdoruesve or Get-ScheduledTask nuk ka gjasa të tërhiqet.

Faza 3 — Rrëmbyesi i kujtesës së të dhënave

Ngarkesa e Python, e instaluar në clipboard_guardian/guardian.py, ekzekuton një cikël të pafund duke pyetur për clipboard-in e sistemit çdo 400 milisekonda. Me çdo shenjë, ai tërheq përmbajtjen aktuale të clipboard-it nëpërmjet pyperclip.paste() dhe i ekzekuton ato në një listë me mbi dyzet shprehje të rregullta të parapërgatitura që mbulojnë formatet e adresave të portofoleve për 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 dhe disa të tjera të bllokuara por bosh në konfigurimin e parazgjedhur (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin).

Kur ndodh një përputhje, skripti lexon adresën e sulmuesit për atë zinxhir nga ~/.config/kujdestari-i-clipboard-it/config.json (ose ekuivalentët e saj të platformës) dhe mbishkruan kujtesën e përkohshme me tekstin e zëvendësuar:

Nuk ka sinjalizues rrjeti. Pajisja për prerjen e të dhënave nuk telefonon në shtëpi, nuk regjistron hostet e infektuara, nuk nxjerr asgjë. Nxjerrja e të dhënave është vetë zëvendësimi: kur një përdorues kopjon një adresë marrësi nga ndërfaqja e përdoruesit të portofolit të tij dhe e ngjit atë në një dialog dërgimi, adresa e ngjitur i përket operatorit. Fondet humbasin brenda bandës, në mënyrë transparente për përdoruesin.

Çfarë ka të re këtu

Disa detaje bien në sy krahasuar me shabllonin gjenerik të crypto-clipper:

1. npm → kryqëzim i Python-it. Shumica e prerësve të kriptove që shohim në npm janë JavaScript i pastër, shpesh i turbulluar me _0x rrotullimi i vargut ose vlerësim(atob(…)) pirgje. Ky shembull përdor tarball-in npm si asgjë më shumë se një mbështjellës dorëzimi për një paketë Python - Python i pastër - dhe lejon që pip të trajtojë instalimin e varësive (kapëse pyper, psutil, opsionale setproctitle) i deklaruar në paketë pyproject.tomlNuk ka asnjë lloj ngatërrese JavaScript për t'u mposhtur. Vetë programi i prerjes është Python i thjeshtë dhe i lexueshëm.

2. Etiketat e persistencës Tri-OS të zgjedhura për besueshmëri. Shumë instalues ​​ndërplatformash regjistrojnë qëndrueshmërinë nën emra gjenerikë (shërbim përditësimi, helper.plist). Ky shembull merr mundimin të zgjedhë etiketa që i ngjajnë ndërmjetësve të kohës së ekzekutimit të platformës në secilin sistem operativ. Emërtimi është përpjekja e vetme për fshehtësi - nuk ka rootkit, nuk fshehje të tokës së përdoruesit, nuk ka turbullim të rrugës. Bast është se mbrojtësit rrallë auditojnë. ~/.config/systemd/user/ dhe se një shërbim i quajtur ndihmësi-python3-dbus nuk do të dallohet në një vlerësim të rastësishëm.

3. Maskimi i titullit të procesit është real, por anti-analiza është në gjumë. Ngarkesa e Python përcakton një _disguise_process() funksion që vendos titullin e procesit nëpërmjet setproctitle (Linux/macOS) ose SetConsoleTitleW (Windows) — dhe kryesore () e quan atë. Pra ps te Do te shfaqet ndihmësi-python3-dbus në vend të python3 …/guardian.pyMegjithatë, i njëjti modul përcakton një është_monitor_duke_punuar() funksion që numëron mjetet e njohura të monitorimit të procesit (htop, btop, Menaxheri i Detyrave, Monitori i Aktiviteteve, Hakeri i Proceseve, Monitori i Burimeve, monitorët e sistemit GNOME / KDE / Xfce / MATE, e kështu me radhë) — dhe kryesore () nuk e thërret kurrë. Cikli i zëvendësimit funksionon pa kushte, pavarësisht nëse përdoruesi ka apo jo një monitor procesi të hapur. Funksioni është kod i vdekur në versionin e dërguar. Ka shumë të ngjarë të jetë një mbetje nga një përsëritje e mëparshme, ose një skelë për një veçori që nuk është lidhur ende. Sidoqoftë, sipërfaqja anti-analizë e ngarkesës së publikuar është një riemërtim i titullit të procesit, jo shmangie aktive e monitorit.

4. Sjellja e bashkimit të konfigurimit të paketuar. npm-install.js shkruan listën e parazgjedhur të portofolit në ~/.config/kujdestari-i-clipboard-it/config.json dhe, nëse një skedar konfigurimi ekziston tashmë, bashkon çdo çelës vlera ekzistuese e të cilit është bosh. Kjo do të thotë që një përdorues që është infektuar më parë dhe e ka pastruar pjesërisht konfigurimin - le të themi, duke zbrazur ethereum vlerë — do ta ripopullojë atë nga çdo instalim i mëvonshëm i paketës dashakeqe. Nuk ka pastrim të skedarit të vazhdueshëm në asnjë shteg kodi.

Data / Ora (UTC) ngjarje
2026-05-21 18:50:32 @jaggle/resizeobserves@1.0.0 botuar.
2026-05-21 19:55:55 1.0.1 botuar — versioni i parë i shënuar nga skanimi i jashtëm.
2026-05-21 19:58:10 1.0.2 botuar.
2026-05-21 20:05:03 1.0.3 botuar.
2026-05-21 20:09:24 1.0.4 botuar.
2026-05-21 20:13:48 1.0.5 botuar.
2026-05-21 20:41:52 1.0.6 botuar.
2026-05-21 20:43:56 1.0.7 publikuar — shton një try/catch mbështjellës rreth hapit të shkrimit të konfigurimit të portofolit npm-install.js.
2026-05-21 20:46:15 1.0.8 publikuar — instaluesi u riemërua i riemërtuar npm-install.jsnpm-install.cjs (përmbajtje identike me bajt).
2026-05-22 Vendimet dhe IOC-të u botuan. Versionet janë ende në regjistër në kohën e publikimit (në vazhdim).

Nëntë versione në një orë e pesëdhjetë e gjashtë minuta është e shpejtë edhe për një typosquat. Modeli është në përputhje me një fushatë publiko dhe djeg — mbush regjistrin me një dorezë, lëre zbulimin të vazhdojë rrugën e vet dhe kalo në një dorezë të re pasi të hiqet një version i vetëm. Deltat e dukshme në të gjithë ekzekutimin janë kozmetike: 1.0.1 u shtua versioni eksplicit /usr/bin/pip3shtigje -style për në listën e kërkimit të pip (pajtueshmëria me sudo), 1.0.7 e mbështjelli shkrimin e konfigurimit të portofolit në një try/catch, dhe 1.0.8 e riemërtoi instaluesin nga .js.cjs duke e mbajtur përmbajtjen e saj identike me bajt. .cjs riemërtoni gjurmët me paralajmërime npm rreth zgjidhjes së paqartë të modulit në paketa pa një të qartë "lloj" fushë, dhe mund të jetë një përpjekje për të shtypur zhurmën e kohës së instalimit që mund të tërheqë vëmendjen. Ngarkesa e Python - e vetmja pjesë që në fakt vjedh - është e pandryshuar në të nëntë versionet.

Treguesit e Kompromisit

Paketat

ekosistemit paketë Versione Statusi
NPM @jaggle/resizeobserves 1.0.0 përmes 1.0.8 Drejtpërdrejt në publikim; kërkohet heqje.

Skedarët dhe hashet

Rrugë Shënimet
clipboard_guardian/guardian.py
(md5 f7935c2c82bc881288611ab6cd634f17)
Identike në të nëntë versionet e botuara (1.0.0 përmes 1.0.8Ngarkesa e makinës prerëse.
npm-install.js (1.0.0 – 1.0.7)
npm-install.cjs (1.0.8)
Instaluesi i persistencës; e njëjta sjellje nga fillimi në fund. 1.0.7's .js 1.0.8's .cjs janë identike me bajtet.
~/.config/clipboard-guardian/config.json Konfigurimi i persistencës së Linux dhe paketa e portofolit.
~/Library/Application Support/clipboard-guardian/config.json Konfigurimi i persistencës së macOS dhe paketa e portofolit.
%APPDATA%\clipboard-guardian\config.json Konfigurimi i persistencës së Windows dhe paketa e portofolit.
~/.config/systemd/user/python3-dbus-helper.service Përhershmëria e nisjes automatike të Linux-it.
~/Library/LaunchAgents/com.apple.python.runtime.plist Qëndrueshmëria e macOS LaunchAgent.
~/Library/Logs/com.apple.python.runtime.log Regjistri i macOS stdout/stderr për agjentin.
Scheduled Task PyRuntimeBroker Detyra e nisjes automatike të Windows (AtLogOn, pa afat kohor).

Treguesit e sjelljes

Sinjal Përshkrim
pip install --break-system-packages nga post-installimi i npm Detyron instalimin e Python në të gjithë faqen duke anashkaluar mbrojtjet PEP 668.
apt-get install -y xclip (ose pacman/dnf) Instalon shërbimet e clipboard-it në Linux gjatë instalimit të paketës.
python3-dbus-helper.service njësia e përdoruesit të sistemuar Persistenca u regjistrua nën një emër ndihmës runtime që dukej i besueshëm.
com.apple.python.runtime LaunchAgent Etiketë qëndrueshmërie jashtë shtigjeve legjitime të sistemit Apple.
PyRuntimeBroker Detyra e planifikuar Persistencë e rreme e ndërmjetësit të kohës së ekzekutimit të Windows pa burim të ligjshëm instaluesi.
Procesi Python i titulluar python3-dbus-helper importimin pyperclip psutil Mospërputhje sjelljeje midis emrit të procesit të shfaqur dhe bibliotekave të importuara.
Ndryshimet e kujtesës së përkohshme ~0.4s pas kopjimit të adresës së portofolit Sjellja e nënshkrimit të zëvendësimit të adresës së kriptomonedhës.

Pako portofoli për sulmues (lista e gjuetisë së mbrojtësve)

Lista e portofolit dërgohet me kod të ngurtë në npm-install.js clipboard_guardian/guardian.pyMbrojtësit mund ta përdorin listën si një listë bllokimi (ta trajtojnë çdo transferim në këto adresa nga portofolet e korporatave si të dyshimtë) dhe si një çelës gjuetie (ta trajtojnë praninë e ndonjërit prej këtyre vargjeve në një skedar konfigurimi të paautorizuar, objekt ndërtimi ose makinë zhvilluesi si një tregues infeksioni).

Paketa e Portofolit të Sulmuesit

Zinxhir Adresa
Ethereum / BSC 0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18
Ronin (EVM) ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18
Bitcoin bc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y
Bitcoin Cash bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt
Litecoin ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe
Dogecoin DNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy
Vizë lidhëse XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS
Zcash t1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M
DigiByte DPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH
Monero 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf
Solana DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5
TRON TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2
TON UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr
Ripple r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H
polkadot 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG
NEAR 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364
Gjithësi cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e
osmozë osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t
Celestia celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5
injective inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh
Kava kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux
Harmoni one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a
Tokë terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x
Algorand XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI
yjor GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE
Cardano addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f
MultiverseX erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0
me vend 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e
sui 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78
Nano nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn
Filecoin f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui
Tezos tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk
Prandaj 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA
Hedera 0.0.10488092

Zinxhirët me mbulim regex, por me vende bosh për portofolet në konfigurimin e parazgjedhur — Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB — nuk zëvendësohen në mënyrë aktive në këtë version, por zbulohen. Trajtojini ato si fushëveprim monitorimi dhe jo si fushëveprim zëvendësimi.

Atribuimi dhe Motivimi

Fushata ofron një sipërfaqe të hollë atribuimi. Nuk kemi qenë në gjendje të konfirmojmë identitetin e operatorit. Çfarë mund të regjistrojmë:

  • Meta të dhënat e botuesit. Llogaria npm tingëllon e rendit email-in e saj si olgascarlet@deltajohnsons.comDomeni deltajohnsons.com nuk zgjidhet në një identitet korporativ që mund ta verifikojmë. Llogaria npm nuk tregon verifikim me email dhe asnjë SCM verifikim. Nuk ka asnjë prani publike të lidhur në GitHub.
  • Fusha e depos. La package.json mbart nr depo fushë. Legjitimiteti npm:@juggle/resize-observer pikë në një depo të vërtetë GitHub me mijëra yje dhe probleme aktive. Mungesa e një lidhjeje depoje është treguesi më i shpejtë vizual në ndërfaqen e përdoruesit npm.
  • Plagjiaturë README. Paketa README është legjitime. @juggle/resize-observer README bajt-për-bajt, duke përfshirë import shembuj që referojnë @juggle/resize-observer vetë (jo paketa e publikimit). Operatori as nuk u shqetësua të rishkruante importet — një sinjal i zakonshëm se readme ishte hequr, jo i përshtatur.
  • Asnjë infrastrukturë mbi të cilën mund të ndërrohet drejtimi. Nuk ka pikë fundore C2, nuk ka kërkim DNS, nuk ka IP. Sjellja keqdashëse është e kapsuluar plotësisht në prerësin lokal plus paketën e portofolit të koduar fort. Kjo e bën të padisponueshëm ndryshimin e domenit ose ASN-së. Mbrojtësit që ndryshojnë fushata duhet të përputhin portofolet me çdo prerës të mëparshëm që kanë në dosje; ripërdorimi i një portofoli në paketa është lidhja më e zgjidhshme ndërfushatore.
  • Zgjedhja e emërtimit. @jaggle/resizeobserves është një karakter larg nga @xhongl dhe një ndryshim nga i njohuri vëzhguesi i ndryshimit të madhësisëDistanca e kombinuar e redaktimit është dy glife. Ky është një përplasje e qëllimshme vizuale, jo një ulje e përgjithshme.

Motivimi, i bazuar në sjelljen e ngarkesës: monetizim i pastër përmes zëvendësimit oportunist të clipboard-it. Nuk ka mbledhje kredencialesh, nuk ka gjurmë gishtash të hostit, nuk ka lexim të variablave të mjedisit. Operatori nuk interesohet se kush është viktima - ata interesohen që transferimi i radhës i viktimës të jetë në njërën nga adresat e listuara. Mbulimi me dyzet zinxhirë është modeli i lotarisë në veprim: hidheni gjerësisht, shpresoni që një ngjitje e vetme me vlerë të lartë të arrijë një herë për N instalime.

Operatori duket se nuk është i shqetësuar për heqjen e skedarëve. Publikimi i nëntë versioneve brenda dy orësh nën të njëjtin fushëveprim lexohet si një kontroll publikimi dhe djegieje: maksimizoni gjurmën e regjistrit përpara se të arrijë vonesa e heqjes, pastaj vazhdoni. Ne nuk kemi vërejtur @jaggle duke u ribotuar nën një fushëveprim të ri në kohën e shkrimit, por ne do të prisnim fusha të ngjashme (@jaggie, @xhongl-, @joggle) do të shfaqet gjatë ditëve në vijim nëse operatori është ende aktiv.

Ndikimi, Trendet dhe Çfarë duhet të bëjnë mbrojtësit

 ndikim

Përcaktimi sasior i ndikimit në para reale nuk është i mundur nga të dhënat aktuale. Pajisja për prerje nuk shkruan telemetri dhe portofolet ende nuk janë vërejtur duke marrë transferta të zëvendësuara që nga pika e fundit e analizës (një kontroll pasues i zinxhirëve të listuar është në listën tonë). Të ligjshmet npm:@juggle/resize-observer mesatarisht arrin deri në shkarkime javore me shtatë shifra — një objektiv me trafik të lartë — dhe paketa keqdashëse ishte aktive për më pak se 24 orë në kohën e zbulimit, gjë që kufizon popullatën e ekspozuar, por nuk e zeron atë.

Rrezja e shpërthimit që ia vlen të gjurmohet nuk është shkarkim i drejtpërdrejtë i @jaggle/resizeobserves — ato ka të ngjarë të jenë të vogla. Janë **instalime kalimtare**: një zhvillues që shton paketën në një projekt sandbox, duke ekzekutuar instaloni npm, dhe pastaj duke harruar që grepi i instalimit të ekzekutohej ndonjëherë. Çdo makinë që përpunoi postinstallin tani ka një rrëmbyes të clipboard-it për çdo përdorues në nisjen automatike, pavarësisht nëse projekti është ende në disk. Heqja e direktorisë së paketave nga nyjet_module **nuk** e heq persistencën.

Modele në zhvillim

Dy trende që kjo fushatë i ilustron.

npm si një mbështjellës i shpërndarjes së ngarkesës Python. Skedari tarball npm është një instalues ​​me 4 rreshta; vjedhësi aktual është Python, i instaluar në të gjithë sistemin nga cicërin nga direktoria e paketuar. Kjo nuk është e re - kemi parë paketa npm që heqin dorë nga Python më parë - por po bëhet një formë dukshëm më e zakonshme në të gjitha fushatat e crypto-clipper. Avantazhi për operatorin është i dyfishtë: bibliotekat e clipboard-it Python (kapëse pyper të parat midis tyre) janë më të pastra dhe më ndërplatformore sesa ekuivalentët e JavaScript, dhe Shumica e skanerëve të automatizuar npm i kushtojnë shumë rëndësi skedarëve JavaScript dhe Python .py tufat lehtë. Kostoja është se gjurma e instalimit është shumë më e zhurmshme - një e re instalim pip është e vështirë të fshihet në një makinë zhvilluesi që normalisht nuk e bën instalim pip gjatë instaloni npm.

Emrat e platformës vendase janë të vetmit opsione të fshehta. Disa programe të kohëve të fundit për prerjen e kodit dhe vjedhjen e ngarkesës së vogël e kanë braktisur tërësisht errësimin në nivel kodi në favor të etiketave të persistencës që duken legjitime. ndihmësi-python3-dbus, com.apple.python.runtimedhe PyRuntimeBroker janë shembuj nga librat shkollorë — emra që syri i një mbrojtësi do t'i anashkalojë në një listë prej dyzet shërbimesh përdoruesish. Kjo është një formë e lirë dhe e qëndrueshme e fshehtësisë: heqja bëhet për çdo paketë, por skedarët e vazhdueshëm i mbijetojnë heqjes, dhe një shërbim i emëruar sipas një komponenti platforme që duket real nuk do të pastrohet nga asgjë tjetër përveç një auditimi të qartë.

Çfarë duhet të bëjnë mbrojtësit

  • Auditimi ~/.config/systemd/user/, ~/Library/LaunchAgents/ dhe Get-ScheduledTask prodhim në makinat e zhvilluesve për hyrjet e listuara në IOC. Heqja e paketës npm i lë këto në vend; ato duhet të hiqen me dorë.
  • Blloko transfertat në adresat e listuara të portofolit në kufijtë e thesarit të korporatës dhe portofolit DeFi ku lista e lejuar e adresave është e disponueshme.
  • Kërko për ~/.config/clipboard-guardian/config.json (dhe ekuivalentët e platformës) në të gjithë flotën e pajisjeve zhvilluese. Prania e skedarit është infeksion me besim të lartë pavarësisht se cili version i paketës e ka dorëzuar atë.
  • Kërko node_modules/ për clipboard_guardian/guardian.py në pamjet e çastit të build-cache që mund të jenë para heqjes. MD5 i skedarit është i qëndrueshëm në të gjitha versionet e shqyrtuara.
  • Lockfile-pin @juggle/resize-observer (paketa legjitime) kështu që instalimet e ardhshme nuk mund të zgjidhin asgjë tjetër nën një gabim tipi me një karakter, veçanërisht në rrjedhat e punës pa skedarë të kyçur si npx.
  • Trajtoni çdo postinstalim npm që thirr instalimin e pip si me ashpërsi të lartë në ndërtim e sipër-pipeline politikë. Nuk ka asnjë arsye legjitime që një paketë npm të ketë nevojë për pip në kohën e instalimit — mjetet Python shpërndajnë mjetet Python.
  • Kërko të dhënat e monitorimit process_iter()-comparable për proceset e emëruara python3-dbus-helper që importojnë pyperclip — mospërputhja e maskimit (ndihmësi D-Bus që mban një bibliotekë të clipboard-it) është treguesi më i pastër i sjelljes që kemi.
  • Rrotulloni adresat e portofoleve të ngjitura nga makinat e infektuara. Një rrëmbyes i clipboard-it kompromenton rrugën midis një ndërfaqeje përdoruesi të portofolit dhe një objektivi ngjitjeje; adresat e kopjuara ndërsa janë të infektuara mund të ndryshohen në heshtje. Çdo gjë e dërguar gjatë dritares së infektimit duhet të trajtohet si potencialisht e keqdrejtuar.

Përfundimi: këmbëngulja ia kalon heqjes. Regjistri përfundimisht do të heqë @jaggle/resizeobserves në të nëntë versionet; njësia systemd, LaunchAgent dhe Detyra e Planifikuar nuk do të hiqen vetë.

Referencat

mjetet-e-për-përbërjes-së-softuerit-sca-tools
Përparësoni, korrigjoni dhe siguroni rreziqet e softuerit tuaj
Merrni Llogarinë tuaj Falas.
Nuk kërkohet kartë krediti.

Siguroni Zhvillimin dhe Ofrimin e Softuerit tuaj

me Xygeni Product Suite