Lt; DR
2026-05-21 npm leidėjas jaggle išleido devynias versijas (1.0.0 per 1.0.8) apie @jaggle/resizeobserves maždaug per dviejų valandų langą.
Paketas yra teisėto turinio klaidingas pavyzdys. @juggle/resize-observer „polyfill“ – plačiai naudojamas paketas, atsisiunčiamas milijonais kartų per savaitę, tačiau jame nėra jokios realios „ResizeObserver“ versijos.
Vietoj to, pakuotės po diegimo kabliukas įdiegia susietą „Python“ naudingąją apkrovą, užregistruoja išlikimą kaip platformoje atrodantį vykdymo laiko tarpininką ir įdiegia kelių platformų iškarpinės užgrobėją, skirtą kriptovaliutų operacijoms.
Linux atkaklumas pasireiškia kaip python3-dbus-helper, macOS as com.apple.python.runtimeir Windows as PyRuntimeBroker.
Naudingoji apkrova nuolat stebi iškarpinę, ieškodama piniginės adresų daugiau nei 40 blokų grandinių ir tyliai pakeičia nukopijuotus adresus užpuoliko kontroliuojamomis piniginėmis.
Kenkėjiška programa veikia visiškai lokaliai, be jokios išorinės C2 infrastruktūros, todėl išfiltracijos mechanizmu tampa pats iškarpinės pakeitimas.
Pagrindinis IOC yra pats paketo pavadinimas: @jaggle/resizeobserves – atkreipkite dėmesį į praleistą balsę žodyje „jaggle“ ir pridėtą „s“ raidę žodyje „resizeobserves“.
Sunkumas: didelis.
Ataka: kaip ji veikia
npm:@jaggle/resizeobserves atsitiktinai žiūrint neatrodo kaip kenkėjiška programa npm rodinys, jos README.md yra pažodinis README failas iš npm:@juggle/resize-observer — tie patys kodo pavyzdžiai, tos pačios naudojimo instrukcijos, tas pats importuoti { ResizeObserver } iš '@juggle/resize-observer' nuorodos visame tekste. Plagiatas yra toks didelis, kad kiekvienas, žvilgtelėjęs į dokumentaciją, pamanytų, kad skaito teisėtus paketo dokumentus.
Geriausios paketas.json, priešingai, yra retas: ne Saugykla laukas, vienas jusu siuksliu įėjimas nukreiptas į bin/clipboard-guardian.js, Ir po įdiegimo vykdomas scenarijus mazgas npm-install.jsREADME „Pagrindinio naudojimo“ pavyzdžiuose nurodomas „JavaScript“ įgyvendinimas, kurio nėra jokioje tarball byloje. Vienintelis „JavaScript“ pakete yra diegimo scenarijus.
1 etapas – „npm“ po diegimo paleidžia „Python“ naudingąją apkrovą
npm-install.js yra platforminis. Jis suranda pieputis vykdomąjį failą išilgai fiksuoto paieškos kelio (/usr/bin/pip3, /usr/local/bin/pip, grįžtant prie python3 -m pip), įdiegia pridėtą „Python“ paketą iš „tarball“ katalogo ir – „Linux“ sistemoje – įkelia xclip or xsell per apt-get, Pacmanarba dnf jei nė vieno dar nėra:
Naudojimas –break-system-packages yra sąmoningas: šiuolaikinės „Linux“ distribucijos pateikia „Python“ su įjungtu PEP 668 išoriškai valdomos aplinkos žymekliu, kuris pagal numatytuosius nustatymus blokuoja pip diegimą visoje svetainėje. Diegimo scenarijus priverstinai atlieka diegimą.
Scenarijus taip pat palaiko sudo. Kai veikiantis uid yra a rezultatas sudo npm diegimas, scenarijuje rašoma SUDO_USER ir investuoja į getentpasswd rasti tikras vartotojo namų katalogą, tada įrašo savo išsaugojimo failus ten, o ne į / RootIšlikimas yra individualus kiekvienam vartotojui, o ne visai sistemai.
2 etapas – išlikimas skirtingose operacinėse sistemose naudojant vykdymo laiko tarpininkų pavadinimus
Įdiegus „Python“ paketą, scenarijus kiekvienoje operacinėje sistemoje užregistruoja automatinio paleidimo įrašą skirtingu pavadinimu:
- Linux — sisteminis vartotojo blokas adresu ~/.config/systemd/user/python3-dbus-helper.serviceĮrenginio Aprašymas is Python D-Bus vykdymo laiko pagalbininkasScenarijus taip pat bando jį įjungti per systemctl – vartotojo įjungimas, grįžtant prie rankinės simbolinės nuorodos, esančios numatytasis.target.wants/ kai „systemctl“ nepavyksta. Jei vykdoma su sudo, scenarijus persijungia į sudo -u systemctl – vartotojas, Su XDG_RUNTIME_DIR nustatyti taip, kad veiktų vartotojo magistralės iškvietimas.
- macOS — „LaunchAgent“ plist'as adresu ~/Library/LaunchAgents/com.apple.python.runtime.plist su RunAtLoad=true bei KeepAlive=true, tada įkelta per launchctl įkėlimas.
- Windows — suplanuota užduotis pavadinimu „PyRuntimeBroker“, suaktyvinama prisijungus prie prisijungimo, kurios vykdymo laiko apribojimas yra nulis (t. y. nėra skirtojo laiko apribojimo), užregistruota per „PowerShell“.
Visi trys vardai iš pirmo žvilgsnio atrodo patikimi. python3-dbus-helper laikosi teisėtos „Python-D-Bus“ integracijos „Linux“ darbalaukiuose pavadinimų suteikimo konvencijos. com.apple.python.runtime imituoja „Apple“ atvirkštinio DNS žymėjimą savo paslaugoms. PyRuntimeBroker atkartoja „Windows“ „RuntimeBroker.exe“ – tikra, pasirašyta „Microsoft“ paslauga, kuri tarpininkauja leidimų užklausoms UWP programoms. Šiame kontekste nė viena iš jų nėra tikra „Apple“ / „Microsoft“ / „Python“ paslauga, tačiau gynėjas atlieka greitą vizualinę analizę. systemctl – vartotojų sąrašo vienetai or Gauti suplanuotą užduotį vargu ar sudrebės.
3 etapas – iškarpinės užgrobėjas
Python naudingoji apkrova, įdiegta adresu clipboard_guardian/guardian.py, vykdo begalinį ciklą, kas 400 milisekundžių apklausdamas sistemos iškarpinę. Kiekvieno tikso metu jis ištraukia dabartinį iškarpinės turinį per pyperclip.paste() ir vykdo juos pagal daugiau nei keturiasdešimties iš anksto sukompiliuotų reguliariųjų išraiškų sąrašą, apimantį piniginės adresų formatus, skirtus 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 ir keliems kitiems, kurie numatytojoje konfigūracijoje yra tušti, bet yra įtraukti į sąrašą (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin).
Kai randamas atitikmuo, scenarijus nuskaito užpuoliko adresą tai grandinei iš ~/.config/clipboard-guardian/config.json (arba jo platformos atitikmenis) ir perrašo iškarpinę pakeistu tekstu:
Nėra tinklo švyturio. Įrenginys neskambina namo, neregistruoja užkrėstų kompiuterių ir nieko neišfiltruoja. Išfiltravimas yra pats pakeitimas: kai vartotojas nukopijuoja gavėjo adresą iš savo piniginės sąsajos ir įklijuoja jį į siuntimo dialogo langą, įklijuotas adresas priklauso operatoriui. Lėšos prarandamos duomenų juostoje, vartotojui skaidriai.
Kas čia naujo
Palyginti su bendriniu kriptovaliutų šablonu, išsiskiria kelios detalės:
1. npm → Python kryžminimas. Dauguma kriptovaliutų, kuriuos matome npm, yra grynas „JavaScript“, dažnai užmaskuotas _0x masyvo sukimas arba įvertinimas (atob(…)) stekai. Šiame pavyzdyje „npm tarball“ naudojamas tik kaip „Python“ paketo pristatymo apvalkalas – švarus „Python“ – ir leidžiama „pip“ tvarkyti priklausomybių diegimą (Pyperclip, psutil, neprivaloma setproctitle) deklaruota sujungtame rinkinyje pyproject.tomlNėra jokio „JavaScript“ klaidinimo, kurį reikėtų įveikti. Pats „Clipper“ yra paprastas, lengvai skaitomas „Python“.
2. Trijų OS išlikimo žymės pasirinktos dėl patikimumo. Daugelis skirtingų platformų diegimo programų registruoja pastovumą bendriniais pavadinimais (atnaujinimo paslauga, helper.plist). Šiame pavyzdyje pasistengta parinkti etiketes, kurios kiekvienoje OS būtų panašios į platformos gimtąsias vykdymo laiko tarpininkavimo programas. Pavadinimas yra vienintelis bandymas slaptai veikti – nėra rootkit, vartotojo srities slėpimo, kelio užmaskavimo. Lažinuosi, kad gynėjai retai atlieka auditą. ~/.config/systemd/user/ ir kad paslauga, pavadinta python3-dbus-helper neišsiskirs atsitiktinėje apžvalgoje.
3. Proceso pavadinimo maskavimas yra realus, bet antianalizė snaudžia. Python naudingoji apkrova apibrėžia a _maskavimo_procesas() funkcija, kuri nustato proceso pavadinimą per setproctitle (Linux / macOS) arba Nustatyti konsolės pavadinimą (Windows) – ir pagrindinis () tai vadina. Taigi ps į parodys python3-dbus-helper VIETOJ python3 …/guardian.pyTačiau tas pats modulis apibrėžia veikia_monitorius() funkcija, kurioje išvardijami žinomi procesų stebėjimo įrankiai (htop, viršus, Užduočių tvarkyklė, Veiklos monitorius, Procesų įsilaužėlis, Išteklių monitorius, GNOME / KDE / Xfce / MATE sistemos monitoriai ir kt.) — ir pagrindinis () niekada to nekviečia. Pakeitimo ciklas veikia besąlygiškai, nepriklausomai nuo to, ar vartotojas yra atidaręs proceso monitorių. Funkcija yra negyvas kodas pateiktoje versijoje. Labiausiai tikėtina, kad tai ankstesnės iteracijos likutis arba dar nesukurtos funkcijos pastoliai. Bet kuriuo atveju, publikuotos naudingosios apkrovos antianalizės paviršius yra vienas proceso pavadinimo pervadinimas, o ne aktyvus monitoriaus apėjimas.
4. Sujungtos konfigūracijos sujungimo elgsena. npm-install.js įrašo numatytąjį piniginių sąrašą į ~/.config/clipboard-guardian/config.json ir, jei konfigūracijos failas jau yra, sujungia visus raktus, kurių esama reikšmė yra tuščia. Tai reiškia, kad vartotojas, kuris anksčiau buvo užkrėstas ir iš dalies išvalė konfigūraciją, tarkime, ištuštinęs ethereum reikšmė – ji bus iš naujo užpildyta kiekvieno vėlesnio kenkėjiško paketo diegimo metu. Jokiame kodo kelyje išsaugojimo failas nevalomas.
| Data / Laikas (UTC) | renginys |
|---|---|
2026-05-21 18:50:32 | @jaggle/resizeobserves@1.0.0 paskelbta. |
2026-05-21 19:55:55 | 1.0.1 paskelbta – pirmoji versija pažymėta išorinio nuskaitymo metu. |
2026-05-21 19:58:10 | 1.0.2 paskelbta. |
2026-05-21 20:05:03 | 1.0.3 paskelbta. |
2026-05-21 20:09:24 | 1.0.4 paskelbta. |
2026-05-21 20:13:48 | 1.0.5 paskelbta. |
2026-05-21 20:41:52 | 1.0.6 paskelbta. |
2026-05-21 20:43:56 | 1.0.7 paskelbtas – prideda try/catch apvalkalas aplink piniginės konfigūracijos rašymo veiksmą npm-install.js. |
2026-05-21 20:46:15 | 1.0.8 paskelbta – diegimo programos pavadinimas pakeistas npm-install.js → npm-install.cjs (baitų atžvilgiu identiškas turinys). |
2026-05-22 | Paskelbti nuosprendžiai ir Tarptautiniai teisės aktai (TOK). Versijos vis dar yra registre paskelbimo metu (tebevykdoma). |
Devyni variantai per vieną valandą ir penkiasdešimt šešias minutes yra greitas rezultatas net ir pritūpus su smūgį į pritūpimus. Modelis atitinka a publikavimo ir įrašymo kampanija — užtvindyti registrą vienu serveriu, leisti aptikimui tęsti savo darbą ir pereiti prie naujo serverio, kai pašalinama viena versija. Matomi pokyčiai visame registro vykdyme yra kosmetiniai: 1.0.1 versijoje pridėta aiški informacija /usr/bin/pip3stiliaus keliai į pip paieškos sąrašą (sudo-compatibility), 1.0.7 versijoje „wallet-config“ rašymas buvo įtrauktas į try/catch, o 1.0.8 versijoje diegimo programa buvo pervadinta iš . Js į .cjs išlaikant jo turinį baitiškai identišką. .cjs pervadinti takelius su npm įspėjimais apie dviprasmišką modulio skiriamąją gebą paketuose be aiškaus „Tipas“ lauke ir gali būti bandymas nuslopinti diegimo metu kylantį triukšmą, kuris galėtų atkreipti dėmesį. „Python“ naudingoji apkrova – vienintelė dalis, kuri iš tikrųjų vagia – visose devyniose versijose nepasikeitė.
Kompromiso rodikliai
Paketai
| ekosistema | Paketas | versijos | Statusas |
|---|---|---|---|
| npm | @jaggle/resizeobserves | 1.0.0 per 1.0.8 | Paskelbimo metu paskelbta; pateiktas pašalinimo prašymas. |
Failai ir maišos
| Kelias | Pastaba |
|---|---|
clipboard_guardian/guardian.py(md5 f7935c2c82bc881288611ab6cd634f17) | Identiškas visose devyniose publikuotose versijose (1.0.0 per 1.0.8). Kirpimo mašinos naudingoji apkrova. |
npm-install.js (1.0.0 – 1.0.7)npm-install.cjs (1.0.8) | Nuolatinis diegimo įrenginys; tas pats veikimo būdas nuo pradžios iki galo. 1.0.7's .js bei 1.0.8's .cjs yra baitų atžvilgiu identiški. |
~/.config/clipboard-guardian/config.json | „Linux“ išsaugojimo konfigūracijos ir piniginės paketas. |
~/Library/Application Support/clipboard-guardian/config.json | „macOS“ išsaugojimo konfigūracijos ir piniginės paketas. |
%APPDATA%\clipboard-guardian\config.json | „Windows“ išsaugojimo konfigūracijos ir piniginės paketas. |
~/.config/systemd/user/python3-dbus-helper.service | „Linux“ automatinio paleidimo išlikimas. |
~/Library/LaunchAgents/com.apple.python.runtime.plist | „macOS LaunchAgent“ išlikimas. |
~/Library/Logs/com.apple.python.runtime.log | „macOS stdout“ / „stderr“ žurnalas agentui. |
Scheduled Task PyRuntimeBroker | „Windows“ automatinio paleidimo užduotis (AtLogOn, be skirtojo laiko). |
Elgesio rodikliai
| signalas | Aprašymas |
|---|---|
pip install --break-system-packages iš npm po įdiegimo | Priverčia diegti „Python“ visoje svetainėje, apeinant PEP 668 apsaugą. |
apt-get install -y xclip (arba pacman/dnf) | Įdiegia iškarpinės įrankius „Linux“ sistemoje paketo diegimo metu. |
python3-dbus-helper.service systemd vartotojo vienetas | Patvarumas užregistruotas patikimai atrodančiu vykdymo laiko pagalbininko pavadinimu. |
com.apple.python.runtime LaunchAgent | Nuolatinės etiketės neegzistavimas už teisėtų „Apple“ sistemos kelių ribų. |
PyRuntimeBroker Suplanuota užduotis | Netikras „Windows“ vykdymo laiko brokeris be teisėto diegimo šaltinio. |
Python procesas pavadinimu python3-dbus-helper importuoti pyperclip bei psutil | Rodomo proceso pavadinimo ir importuotų bibliotekų veikimo neatitikimas. |
| Iškarpinė pasikeičia ~0.4 s po piniginės adreso nukopijavimo | Kriptovaliutos adreso pakeitimo parašo elgsena. |
Puolėjo piniginės rinkinys (gynėjų medžioklės sąrašas)
Piniginės sąrašas pateikiamas užkoduotas npm-install.js bei clipboard_guardian/guardian.pyApsaugos programos gali naudoti šį sąrašą ir kaip blokavimo sąrašą (bet kokį pervedimą į šiuos adresus iš įmonių piniginių laikyti įtartinu), ir kaip paieškos raktą (bet kurios iš šių eilučių buvimą neautentifikuotame konfigūracijos faile, kūrimo artefakte ar kūrėjo kompiuteryje laikyti užkrato indikatoriumi).
„Attacker“ piniginės paketas
| grandinė | Adresas |
|---|---|
| Ethereum / BSC | 0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Roninas (EVM) | ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Bitcoin | bc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y |
| Bitcoin Cash | bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt |
| Litecoin | ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe |
| Dogecoin | DNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy |
| brūkšnys | XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS |
| Zcash | t1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M |
| DigiByte | DPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH |
| Monero | 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf |
| J. Solana | DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5 |
| TRON | TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2 |
| TON | UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr |
| Ripple | r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H |
| Polkadot | 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG |
| NEAR | 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364 |
| Kosmosas | cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e |
| osmosas | osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t |
| Celestija | celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5 |
| Injektyvus | inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh |
| Kava | kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux |
| Harmonija | one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a |
| Žemė | terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x |
| Algorandas | XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI |
| žvaigždžių | GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE |
| Cardano | addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f |
| MultiverseX | erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0 |
| Aptos | 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e |
| Sui | 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78 |
| Nano | nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn |
| Filecoin | f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui |
| Tezos | tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk |
| Ergo | 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA |
| Hedera | 0.0.10488092 |
Grandinės su reguliariųjų išraiškų aprėptimi, bet tuščiais piniginės lizdais numatytojoje konfigūracijoje – „Sei“, „IOTA“, „Kaspa“, „Flow“, „Nervos“, „Decred“, „Ravencoin“, „Beacon-Chain BNB“ – šioje versijoje nėra aktyviai pakeičiamos, bet yra aptinkamos. Laikykite jas stebėjimo, o ne pakeitimo sritimi.
Priskyrimas ir motyvacija
Kampanija siūlo menką priskyrimo paviršių. Nepavyko patvirtinti operatoriaus tapatybės. Ką galime užfiksuoti:
- Leidėjo metaduomenys. NPM paskyra žvangėti nurodo savo el. pašto adresą kaip olgascarlet@deltajohnsons.comDomenas deltajohnsons.com nerodo įmonės tapatybės, kurią galėtume patvirtinti. NPM paskyroje nėra el. pašto patvirtinimo ir nėra SCM patvirtinimas. Nėra susijusio viešojo „GitHub“ buvimo.
- Saugyklos laukas. Geriausios paketas.json neneša Saugykla laukas. Teisėtas npm:@juggle/resize-observer nurodo tikrą „GitHub“ saugyklą su tūkstančiais žvaigždučių ir aktyvių problemų. Saugyklos nuorodos nebuvimas yra greičiausias vizualinis požymis „npm“ vartotojo sąsajoje.
- README plagiatas. Paketas README yra teisėtas. @juggle/resize-observer README baitas po baito, įskaitant importuoti pavyzdžiai, kurie nurodo @juggle/resize-observer pats (ne publikavimo paketas). Operatorius net nesivargino perrašyti importuojamų failų – įprastas signalas, kad „readme“ buvo panaikintas, o ne pritaikytas.
- Nėra infrastruktūros, kuria būtų galima remtis. Nėra C2 galinio taško, DNS paieškos, IP adreso. Kenkėjiškas elgesys yra visiškai įkapsuliuotas vietiniame karpytoje ir užkoduotame piniginės pakete. Dėl to domeno arba ASN pagrindu veikiantis keitimas negalimas. Apsauginiai serveriai, keičiantys pinigines skirtingose kampanijose, turėtų palyginti pinigines su bet kokiu ankstesniu karpytoju, kurį jie turi; piniginės pakartotinis naudojimas skirtinguose paketuose yra lengviausiai valdomas kampanijų ryšys.
- Pavadinimo pasirinkimas. @jaggle/resizeobserves yra vienu simboliu nuo @žongliruoti ir viena nuokrypa nuo gerai žinomo dydžio keitimo stebėtojasBendras redagavimo atstumas yra du glifai. Tai sąmoningas vizualinis susidūrimas, o ne bendras pritūpimas.
Motyvacija, pagrįsta naudingosios apkrovos elgsena: grynas pajamų gavimas per oportunistinį iškarpinės pakeitimą. Nėra jokio kredencialų rinkimo, jokio pagrindinio kompiuterio pirštų atspaudų spausdinimo, jokio aplinkos kintamųjų skaitymo. Operatoriui nerūpi, kas yra auka – jam rūpi, kad kitas aukos pervedimas būtų nukreiptas į vieną iš išvardytų adresų. Keturiasdešimties grandinių aprėptis yra loterijos modelis veikiant: užmeskite plačiai, tikėkitės, kad vienas didelės vertės pasta pateks kartą per N įdiegimų.
Operatorius, regis, nesirūpina pašalinimu. Devynių versijų paskelbimas per dvi valandas pagal tą pačią taikymo sritį yra tarsi paskelbimo ir įrašymo operacija: maksimaliai padidinkite registro pėdsaką, kol nepasiekia pašalinimo delsos, tada tęskite. Mes nepastebėjome... @jaggle rašymo metu pakartotinai publikuojame pagal naują taikymo sritį, tačiau tikimės panašių taikymo sričių (@jaggie, @juggle-, @joggle) pasirodys artimiausiomis dienomis, jei operatorius vis dar aktyvus.
Poveikis, tendencijos ir ką turėtų daryti gynėjai
poveikis
Iš dabartinio duomenų rinkinio neįmanoma kiekybiškai įvertinti poveikio realiais pinigais. Apkarpymo programa nerašo jokių telemetrijos duomenų, o piniginės dar nebuvo stebimos gaunant pakeistus pervedimus analizės pabaigos datai (tolesnis išvardytų grandinių patikrinimas yra mūsų sąraše). Teisėtas npm:@juggle/resize-observer Vidutinis savaitinis atsisiuntimų skaičius siekia septynženklį skaičių – tai didelio srauto typosquat taikinys – o kenkėjiškas paketas atskleidimo metu veikė mažiau nei 24 valandas, todėl pažeidžiamų programų skaičius sumažėja, bet jos nesumažėja.
Vertas stebėti sprogimo spindulį, kuris nėra tiesiogiai atsisiunčiamas @jaggle/resizeobserves — jie greičiausiai maži. Tai **tranzitiniai diegimai**: kūrėjas prideda paketą prie smėlio dėžės projekto, paleidžia npm įdiegti, ir tada pamiršta, kad diegimo kabliukas kada nors buvo paleistas. Kiekviena mašina, kuri apdorojo poįdiegimą, dabar automatiškai paleidžiant turi vartotojo iškarpinės užgrobėją, nepriklausomai nuo to, ar projektas vis dar yra diske. Paketo katalogo pašalinimas iš mazgo_moduliai **nepašalina** atkaklumo.
Atsirandantys modeliai
Ši kampanija iliustruoja dvi tendencijas.
npm kaip Python naudingosios apkrovos pristatymo apvalkalas. „npm tarball“ yra 4 eilučių diegimo failas; tikrasis „stealer“ yra „Python“, kurį visoje sistemoje įdiegia pieputis iš sugrupuoto katalogo. Tai nėra naujiena – jau esame matę, kaip „npm“ paketai atsisako „Python“ – tačiau tai tampa pastebimai dažnesne forma kriptovaliutų kirpimo kampanijose. Operatoriaus pranašumas yra dvejopas: „Python“ iškarpų bibliotekos (Pyperclip pirmieji iš jų) yra švaresni ir labiau pritaikyti įvairioms platformoms nei „JavaScript“ atitikmenys, ir dauguma automatizuotų npm skaitytuvų labai vertina „JavaScript“ failus ir „Python“ .py lengvai suriša. Kaina yra ta, kad įrengimo vieta yra daug triukšmingesnė – nauja pip diegimas sunku paslėpti kūrėjo kompiuteryje, kuris paprastai to nedaro pip diegimas metu npm įdiegti.
Platformoms būdingi pavadinimai kaip vienintelė paslėpta priemonė. Keletas pastaruoju metu populiarių programišių ir mažos apkrovos programų vagysčių visiškai atsisakė kodo lygio maskavimo ir pasirinko teisėtai atrodančias pastovumo etiketes. python3-dbus-helper, com.apple.python.runtimeir PyRuntimeBroker yra vadovėliniai pavyzdžiai – vardai, kuriuos gynėjo akis praleis keturiasdešimties vartotojų paslaugų sąraše. Tai pigi ir patvari slapto veikimo forma: pašalinimas atliekamas kiekvienam paketui, tačiau išsaugojimo failai išlieka ir pašalinus, o paslauga, pavadinta realiai atrodančio platformos komponento vardu, nebus išvalyta niekuo, išskyrus aiškų auditą.
Ką turėtų daryti gynėjai
- Auditas ~/.config/systemd/user/, ~/Library/LaunchAgents/ ir Get-ScheduledTask produkcija kūrėjų kompiuteriuose, skirtuose IOC išvardytiems įrašams. Pašalinus „npm“ paketą, jie lieka; juos reikia pašalinti rankiniu būdu.
- Blokuoti pervedimus į nurodytus piniginės adresus įmonių iždo ir DeFi piniginių ribose, kur galimas adresų leidžiamųjų sąrašų sudarymas.
- Ieškokite ~/.config/clipboard-guardian/config.json (ir platformos atitikmenis) visame kūrėjo kompiuterių parke. Failo buvimas yra didelio patikimumo užkrėtimas, nepriklausomai nuo to, kuri paketo versija jį pateikė.
- Ieškokite clipboard_guardian/guardian.py faile node_modules/ „Build-Cache“ momentinėse kopijose, kurios gali būti sukurtos iki pašalinimo. Failo md5 yra stabilus visose peržiūrėtose versijose.
- „Lockfile-pin“ @juggle/resize-observer (teisėtas paketas), kad būsimuose diegimuose nebūtų galima rasti nieko kito dėl vieno simbolio įvedimo klaidos, ypač darbo eigose be užrakinimo failų, pvz., NPX.
- Apdorokite bet kokį npm po diegimo iškviečiant pip diegimą kaip labai sunkus statybojepipeline politika. Nėra jokios pagrįstos priežasties, kodėl „npm“ paketui diegimo metu reikėtų naudoti „pip“ – „Python“ įrankiai platina „Python“ įrankius.
- Ieškoti procesams pavadinimu „python3-dbus-helper“, kurie importuoja „pyperclip“, palyginamų stebėjimo duomenų, naudojant „process_iter()-comparable“ – užmaskavimo neatitikimas (D-Bus pagalbininkas, laikantis iškarpinės biblioteką) yra aiškiausias mūsų turimas elgesio rodiklis.
- Keisti iš užkrėstų kompiuterių įklijuotus piniginės adresus. Iškarpinės užgrobėjas pažeidžia kelią tarp piniginės vartotojo sąsajos ir įklijavimo paskirties vietos; užkrėtimo metu nukopijuoti adresai gali būti nepastebimai pakeisti. Viskas, kas išsiųsta užkrėtimo laikotarpiu, turėtų būti laikoma potencialiai netinkamai nukreipta.
Išvada: išsaugojimas išlieka ilgiau nei pašalinimas. Registras galiausiai pašalins @jaggle/resizeobserves visose devyniose versijose; „systemd“ blokas, „LaunchAgent“ ir „Scheduled Task“ patys nepašalinami.
Nuorodos
- @juggle/resize-observer npm sistemoje — teisėtas paketas, kurį šis „typosquat“ apsimetinėja; naudingas kaip atskaitos taškas baitų po baito atliekamam README plagijavimui.
- @jaggle/resizeobserves registro metaduomenys — paskelbti devynių kenkėjiškų versijų laiko žymas, kurios būtų naudingos teismo ekspertizės laiko planavimui.





