TL; DR
2026. gada 21. maijā npm izdevējs jaggle izlaida deviņas versijas (1.0.0 cauri 1.0.8) no @jaggle/resizeobserves aptuveni divu stundu logā.
Pakotne ir likumīgā satura kļūda. @juggle/resize-observer polyfill — plaši izmantota pakotne ar miljoniem lejupielāžu nedēļā —, taču tai nav faktiskas ResizeObserver implementācijas.
Tā vietā, iepakojuma pēcinstalēšanas āķis instalē komplektā iekļauto Python lietderīgo slodzi, reģistrē noturību kā platformai līdzīgu izpildlaika brokeri un izvieto starpplatformu starpliktuves nolaupītāju, kas vērsts pret kriptovalūtas darījumiem.
Linux noturība izpaužas kā python3-dbus-helper, macOS as com.apple.python.runtime, un Windows as PyRuntimeBroker.
Kravnesība nepārtraukti uzrauga starpliktuvi, meklējot maku adreses visā vairāk nekā 40 blokķēdes un klusībā aizstāj kopētās adreses ar uzbrucēja kontrolētiem makiem.
Ļaunprogrammatūra darbojas pilnībā lokāli, bez izejošās C2 infrastruktūras, padarot starpliktuves aizstāšanu par eksfiltrācijas mehānismu.
Primārais IOC ir pats pakotnes nosaukums: @jaggle/resizeobserves — ievērojiet izlaisto patskani vārdā “jaggle” un pievienoto “s” vārdā “resizeobserves”.
Smagums: augsts.
Uzbrukums: kā tas darbojas
npm:@jaggle/resizeobserves neizskatās pēc ļaunprogrammatūras ikdienišķā attēlā npm skats. tā README.md ir burtiska README versija no npm:@juggle/resize-observer — tie paši koda paraugi, tie paši lietošanas norādījumi, tas pats importēt { ResizeObserver } no '@juggle/resize-observer' atsauces viscaur. Plaģiāts ir tik pilnīgs, ka ikviens, uzmetot skatienu dokumentācijai, pieņemtu, ka lasa likumīgās pakotnes dokumentus.
The pack.json, turpretī, ir reti sastopams: nē krātuve lauks, viens tīne ieeja, kas norāda uz bin/clipboard-guardian.js, Un pēc instalēšanas skripts, kas darbojas mezgls npm-install.jsREADME faila “Pamata lietošanas” piemēros ir atsauce uz JavaScript ieviešanu, kas neeksistē nekur tarball failā. Vienīgais JavaScript kods pakotnē ir instalēšanas skripts.
1. posms — npm pēcinstalēšanas palaiž Python lietderīgo slodzi
npm-install.js ir platformas apzinīgs. Tas atrod pip izpildāms pa fiksētu meklēšanas ceļu (/usr/bin/pip3, /usr/local/bin/pip, atgriežoties pie python3 -m pip), instalē komplektā iekļauto Python pakotni no tarball direktorijas un — Linux sistēmā — ielādē xclip or xsell līdz apt-get, Pacman, vai DNF ja neviens no tiem vēl nav klāt:
Izmantošana –break-system-packages ir apzināts: mūsdienu Linux distribūcijas piegādā Python ar iespējotu PEP 668 ārēji pārvaldītās vides marķieri, kas pēc noklusējuma bloķē pip instalēšanu visā vietnē. Instalēšanas skripts piespiedu kārtā veic instalēšanu.
Skripts atbalsta arī sudo. Kad darbojošais uid ir rezultāts sudo npm instalēšana, skripts skan SUDO_LIETOTĀJS un tērē līdzekļus iegūt paroli lai atrastu reāls lietotāja mājas direktorijā un pēc tam savus saglabāšanas failus ieraksta tur, nevis iekšā / RootNoturība attiecas uz katru lietotāju, nevis uz visu sistēmu.
2. posms — noturība vairākās operētājsistēmās ar izpildlaika starpnieku nosaukumiem
Pēc Python pakotnes instalēšanas skripts katrā operētājsistēmā reģistrē automātiskās palaišanas ierakstu ar atšķirīgu nosaukumu:
- Linux — systemd lietotāja vienība vietnē ~/.config/systemd/user/python3-dbus-helper.serviceIekārtas Apraksts is Python D-Bus izpildlaika palīgsSkripts arī mēģina to iespējot, izmantojot systemctl –lietotāja iespējošana, atgriežoties pie manuālas simboliskas saites sadaļā noklusējuma.mērķis.vēlas/ ja systemctl neizdodas. Ja skripts darbojas ar sudo, tas pārslēdzas uz sudo -u systemctl –lietotājs, ar XDG_RUNTIME_DIR iestatīts tā, lai lietotāja kopnes izsaukums darbotos.
- macOS — LaunchAgent plist vietnē ~/Bibliotēka/LaunchAgents/com.apple.python.runtime.plist ar RunAtLoad=true un KeepAlive=true, pēc tam ielādēts caur launchctl ielāde.
- Windows — ieplānots uzdevums ar nosaukumu PyRuntimeBroker, kas tiek aktivizēts, izmantojot AtLogOn, ar izpildes laika ierobežojumu nulle (t. i., bez taimauta), reģistrēts, izmantojot PowerShell.
Visi trīs vārdi no pirmā acu uzmetiena ir ticami. python3-dbus-helper ievēro likumīgas Python-D-Bus integrācijas nosaukumu piešķiršanas konvenciju Linux darbvirsmās. com.apple.python.runtime atdarina Apple reversās DNS marķēšanu saviem pakalpojumiem. PyRuntimeBroker atgādina Windows RuntimeBroker.exe — īsts, parakstīts Microsoft pakalpojums, kas nodarbojas ar atļauju pieprasījumu apstrādi UWP lietotnēm. Šajā kontekstā neviens no tiem nav īsts Apple/Microsoft/Python pakalpojums, bet gan aizstāvis, kas veic ātru vizuālu skenēšanu. systemctl –lietotāju saraksta vienības or Get-ScheduledTask maz ticams, ka viņš sarausīsies.
3. posms — starpliktuves nolaupītājs
Python lietderīgā slodze, kas instalēta vietnē clipboard_guardian/guardian.py, ik pēc 400 milisekundēm veic bezgalīgu ciklu, aptaujājot sistēmas starpliktuvi. Katrā tikšķā tas izvelk pašreizējo starpliktuves saturu, izmantojot pyperclip.paste() un pārbauda tos ar vairāk nekā četrdesmit iepriekš kompilētu regulāro izteiksmju sarakstu, kas aptver maka adrešu formātus 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 un vairākiem citiem, kas noklusējuma konfigurācijā ir tukši (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin).
Kad tiek atrasta atbilstība, skripts nolasa uzbrucēja adresi šai ķēdei no ~/.config/clipboard-guardian/config.json (vai tās platformas ekvivalentus) un pārraksta starpliktuvi ar aizstāto tekstu:
Nav tīkla bākas. Datu sūtīšanas rīks nezvana uz mājām, nereģistrē inficētus resursdatorus un neko neizfiltrē. Datu sūtīšana ir pati aizstāšana: kad lietotājs nokopē saņēmēja adresi no sava maka lietotāja saskarnes un ielīmē to sūtīšanas dialoglodziņā, ielīmētā adrese pieder operatoram. Līdzekļi tiek zaudēti joslas ietvaros, lietotājam caurspīdīgi.
Kas šeit ir jauns?
Salīdzinot ar vispārīgo kriptovalūtu apgriešanas veidni, dažas detaļas izceļas:
1. npm → Python krustojums. Lielākā daļa kriptovalūtu apgriešanas rīku, ko redzam npm, ir tīrs JavaScript, kas bieži tiek maskēts ar _0x masīva rotācija vai eval(atob(…)) steki. Šajā paraugā npm tarball tiek izmantots tikai kā piegādes apvalks Python pakotnei — tīram Python — un tas ļauj pip apstrādāt atkarību instalēšanu (pyperclip, psutil, neobligāti setproctitle) deklarēts komplektā pyproject.tomlNav jāuzvar nekāda JavaScript kodēšanas slēpšana. Pats spraudnis ir vienkāršs, lasāms Python.
2. Tri-OS noturības etiķetes izvēlētas ticamības dēļ. Daudzi starpplatformu instalētāji reģistrē noturību ar vispārīgiem nosaukumiem (atjauninātājs.pakalpojums, palīgs.plist). Šajā paraugā ir parūpēts izvēlēties etiķetes, kas atgādina platformas iebūvētos izpildlaika brokerus katrā operētājsistēmā. Nosaukumu piešķiršana ir vienīgais mēģinājums rīkoties slepeni — nav ne sakņkopu, ne lietotāju zonas slēpšanas, ne ceļa obfukācijas. Iespējams, ka aizstāvji reti veic auditu. ~/.config/systemd/lietotājs/ un ka pakalpojums ar nosaukumu python3-dbus-helper neizcelsies ikdienišķā apskatā.
3. Procesa nosaukuma maskēšana ir reāla, bet antianalīze snauda. Python lietderīgā slodze definē a _maskēšanas_process() funkcija, kas iestata procesa nosaukumu, izmantojot setproctitle (Linux/macOS) vai SetConsoleTitleW (Windows) — un Galvenais () to sauc. Tātad ps aux rādīs python3-dbus-helper vietā python3 …/guardian.pyTomēr tas pats modulis definē darbojas_monitors() funkcija, kas uzskaita zināmos procesu uzraudzības rīkus (htop, augšpusē, Uzdevumu pārvaldnieks, Aktivitāšu monitors, Procesu hakeris, Resursu monitors, GNOME/KDE/Xfce/MATE sistēmas monitori utt.) — un Galvenais () nekad to neizsauc. Aizvietošanas cikls darbojas bez nosacījumiem neatkarīgi no tā, vai lietotājam ir atvērts procesa monitors. Funkcija piegādātajā versijā ir nedarbojošs kods. Visticamāk, tā ir palieka no agrākas iterācijas vai arī sastatne vēl neinstalētai funkcijai. Jebkurā gadījumā publicētās lietderīgās slodzes antianalīzes virsma ir viena procesa nosaukuma pārdēvēšana, nevis aktīva monitora apiešana.
4. Komplektētās konfigurācijas apvienošanas darbība. npm-install.js ieraksta noklusējuma maku sarakstu ~/.config/clipboard-guardian/config.json un, ja konfigurācijas fails jau pastāv, apvieno visas atslēgas, kuru esošā vērtība ir tukša. Tas nozīmē, ka lietotājs, kurš iepriekš ir bijis inficēts un daļēji iztīrījis konfigurāciju, piemēram, iztukšojot ethereum vērtība — tā tiks atkārtoti aizpildīta katrā nākamajā ļaunprātīgās pakotnes instalēšanas reizē. Nevienā koda ceļā netiek veikta pastāvīgā faila tīrīšana.
| Datums/laiks (UTC) | notikums |
|---|---|
2026-05-21 18:50:32 | @jaggle/resizeobserves@1.0.0 publicēts. |
2026-05-21 19:55:55 | 1.0.1 publicēta — pirmā versija atzīmēta ar ārēju skenēšanu. |
2026-05-21 19:58:10 | 1.0.2 publicēts. |
2026-05-21 20:05:03 | 1.0.3 publicēts. |
2026-05-21 20:09:24 | 1.0.4 publicēts. |
2026-05-21 20:13:48 | 1.0.5 publicēts. |
2026-05-21 20:41:52 | 1.0.6 publicēts. |
2026-05-21 20:43:56 | 1.0.7 publicēts — pievieno try/catch apvalks ap wallet-config rakstīšanas soli npm-install.js. |
2026-05-21 20:46:15 | 1.0.8 publicēts — instalētājs pārdēvēts npm-install.js → npm-install.cjs (baitiem identisks saturs). |
2026-05-22 | Spriedumi un IOC publicēti. Versijas joprojām ir pieejamas reģistrā publicēšanas laikā (tiek veikta apstrāde). |
Deviņas versijas vienas stundas un piecdesmit sešu minūšu laikā ir ātrs uzdevums pat ar typosquat. Modelis atbilst a publicēšanas un ierakstīšanas kampaņa — pārpludināt reģistru zem viena turiņa, ļaut noteikšanai darboties un pāriet uz jaunu turi, kad ir noņemta viena versija. Redzamās deltas visā izpildes laikā ir kosmētiskas: 1.0.1 versijā pievienots skaidrs /usr/bin/pip3stila ceļi uz pip meklēšanas sarakstu (sudo-compatibility), 1.0.7 ietvēra wallet-config rakstīšanu try/catch, un 1.0.8 pārdēvēja instalētāju no . Js uz .cjs vienlaikus saglabājot tā saturu baitu ziņā identisku. .cjs pārdēvēt celiņus ar npm brīdinājumiem par neskaidru moduļu izšķirtspēju pakotnēs bez skaidra "tips" laukā, un tas varētu būt mēģinājums apspiest instalēšanas laika troksni, kas varētu piesaistīt uzmanību. Python lietderīgā slodze — vienīgā daļa, kas faktiski zog — visās deviņās versijās nav mainīta.
Kompromisa rādītāji
Paketes
| Ekosistēma | Pakete | versijas | Status |
|---|---|---|---|
| npm | @jaggle/resizeobserves | 1.0.0 cauri 1.0.8 | Publicēšanas brīdī publicēts; pieprasīta noņemšana. |
Faili un jaucējkodas
| taka | Piezīmes |
|---|---|
clipboard_guardian/guardian.py(md5 f7935c2c82bc881288611ab6cd634f17) | Identisks visās deviņās publicētajās versijās (1.0.0 cauri 1.0.8). Klipera lietderīgā slodze. |
npm-install.js (1.0.0 – 1.0.7)npm-install.cjs (1.0.8) | Noturības instalētājs; tāda pati darbība no sākuma līdz beigām. 1.0.7's .js un 1.0.8's .cjs ir baiti identiski. |
~/.config/clipboard-guardian/config.json | Linux noturības konfigurācijas un maka komplekts. |
~/Library/Application Support/clipboard-guardian/config.json | macOS noturības konfigurācijas un maka komplekts. |
%APPDATA%\clipboard-guardian\config.json | Windows noturības konfigurācijas un maka komplekts. |
~/.config/systemd/user/python3-dbus-helper.service | Linux automātiskās palaišanas noturība. |
~/Library/LaunchAgents/com.apple.python.runtime.plist | macOS LaunchAgent noturība. |
~/Library/Logs/com.apple.python.runtime.log | macOS stdout/stderr žurnāls aģentam. |
Scheduled Task PyRuntimeBroker | Windows automātiskās palaišanas uzdevums (AtLogOn, bez taimauta). |
Uzvedības rādītāji
| Signalizēt | Apraksts |
|---|---|
pip install --break-system-packages no npm pēcinstalēšanas | Piespiež instalēt Python visā vietnē, apejot PEP 668 aizsardzību. |
apt-get install -y xclip (vai pacman/dnf) | Instalē starpliktuves utilītas operētājsistēmā Linux pakotnes instalēšanas laikā. |
python3-dbus-helper.service systemd lietotāja vienība | Noturība reģistrēta zem ticama izskata izpildlaika palīga nosaukuma. |
com.apple.python.runtime LaunchAgent | Pastāvības etiķete ārpus likumīgiem Apple sistēmas ceļiem. |
PyRuntimeBroker Plānotais uzdevums | Viltus Windows izpildlaika brokera noturība bez likumīga instalēšanas avota. |
Python process ar nosaukumu python3-dbus-helper importēšana pyperclip un psutil | Uzvedības neatbilstība starp parādīto procesa nosaukumu un importētajām bibliotēkām. |
| Starpliktuve mainās ~0.4 s pēc maka adreses kopēšanas | Kriptovalūtas adreses aizstāšanas paraksta uzvedība. |
Uzbrucēja maka komplekts (aizstāvju medību saraksts)
Maku saraksts tiek piegādāts cietajā kodā npm-install.js un clipboard_guardian/guardian.pyAizsargprogrammatūras var izmantot šo sarakstu gan kā bloķēšanas sarakstu (uzskatīt jebkuru pārskaitījumu uz šīm adresēm no korporatīvajiem makiem par aizdomīgu), gan kā medību atslēgu (uzskatīt jebkuru no šīm virknēm neautentificētā konfigurācijas failā, būvējuma artefaktā vai izstrādātāja datorā par infekcijas indikatoru).
Uzbrucēja maka komplekts
| ķēde | Adrese |
|---|---|
| Ethereum / BSC | 0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Ronins (EVM) | ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Bitcoin | bc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y |
| Bitcoin Cash | bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt |
| Litecoin | ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe |
| dogecoin | DNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy |
| Svītra | XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS |
| Zcash | t1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M |
| DigiByte | DPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH |
| Monero | 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf |
| Solana | DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5 |
| TRON | TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2 |
| TON | UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr |
| Ripple | r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H |
| Polkadot | 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG |
| NEAR | 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364 |
| Kosmoss | cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e |
| osmoze | osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t |
| Celestia | celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5 |
| Injicējošs | inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh |
| Kava | kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux |
| Harmonija | one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a |
| Zeme | terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x |
| Algorands | XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI |
| zvaigžņu | GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE |
| Cardano | addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f |
| MultiverseX | erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0 |
| Aptos | 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e |
| Sui | 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78 |
| Nano | nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn |
| Filecoin | f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui |
| Tezos | tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk |
| Ergo | 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA |
| Hedera | 0.0.10488092 |
Ķēdes ar regulāro izteiksmju pārklājumu, bet tukšām maku vietām noklusējuma konfigurācijā — Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB — šajā versijā netiek aktīvi aizstātas, bet tiek noteiktas. Uztveriet tās kā uzraudzības tvērumu, nevis aizstāšanas tvērumu.
Atribūcija un motivācija
Kampaņai ir vāja atribūcijas virsma. Mēs neesam spējuši apstiprināt operatora identitāti. Ko mēs varam reģistrēt:
- Izdevēja metadati. NPM konts žagoties norāda savu e-pastu kā olgascarlet@deltajohnsons.comDomēns deltajohnsons.com neveido korporatīvo identitāti, ko varētu pārbaudīt. NPM kontā netiek rādīta e-pasta verifikācija un nav SCM verifikācija. Nav saistītas publiskas GitHub klātbūtnes.
- Repozitorija lauks. The pack.json nes nevienu krātuve lauks. Likumīgais npm:@juggle/resize-observer norāda uz īstu GitHub repozitoriju ar tūkstošiem zvaigzņu un aktīvām problēmām. Repozitorija saites neesamība ir ātrākā vizuālā pazīme npm lietotāja saskarnē.
- README plaģiāts. Pakete README ir likumīga. @juggle/resize-observer README baits pa baitam, ieskaitot importēt piemēri, kas atsaucas @juggle/resize-observer pats (nevis publicēšanas pakotne). Operators pat neuztraucās pārrakstīt importētos failus — izplatīta zīme, ka readme fails tika noņemts, nevis pielāgots.
- Nav infrastruktūras, uz kuras balstīties. Nav C2 galapunkta, nav DNS meklēšanas, nav IP adreses. Ļaunprātīgā rīcība ir pilnībā iekapsulēta lokālajā izgriezējā un cietkodētajā maka pakotnē. Tas padara uz domēnu vai ASN balstītu pagriešanu nepieejamu. Aizsargiem, kas maina maciņus starp kampaņām, ir jāsalīdzina maciņi ar jebkuru iepriekšēju izgriezēju, kas viņiem ir failā; maka atkārtota izmantošana dažādās pakotnēs ir visvieglāk apstrādājamā starpkampaņu saite.
- Nosaukuma izvēle. @jaggle/resizeobserves ir par vienu rakstzīmi mazāk nekā @žonglēt un viena atkāpe no labi zināmā resize-observerKombinētais rediģēšanas attālums ir divi glifi. Šī ir apzināta vizuāla sadursme, nevis vispārējs pietupiens.
Motivācija, kuras pamatā ir lietderīgās slodzes uzvedība: tīra monetizācija, izmantojot oportūnistisku starpliktuves aizstāšanu. Nav akreditācijas datu vākšanas, nav resursdatora pirkstu nospiedumu noņemšanas, nav vides mainīgo nolasīšanas. Operatoram nerūp, kas ir upuris — viņam rūp, lai upura nākamais pārskaitījums būtu vērsts uz vienu no norādītajām adresēm. Četrdesmit ķēžu pārklājums ir loterijas modelis darbībā: plaši izplatīts, cerams, ka viena augstas vērtības pasta nonāks vienu reizi uz N instalācijām.
Operators, šķiet, neuztraucas par noņemšanu. Deviņu versiju publicēšana divu stundu laikā vienā un tajā pašā darbības jomā nozīmē publicēšanas un ierakstīšanas identifikatoru: maksimāli palielināt reģistra nospiedumu, pirms noņemšanas latentums sasniedz, un pēc tam turpināt. Mēs neesam novērojuši @jaggle atkārtoti publicējot ar jaunu darbības jomu rakstīšanas laikā, taču mēs sagaidām līdzīgus darbības jomas (@jaggie, @juggle-, @joggle) parādīsies tuvākajās dienās, ja operators joprojām ir aktīvs.
Ietekme, tendences un kas aizstāvjiem būtu jādara
Ietekme
No pašreizējā datu kopuma nav iespējams kvantitatīvi noteikt ietekmi reālā naudā. Apgriešanas rīks neraksta telemetrijas datus, un analīzes robežvērtības brīdī vēl nav novērots, ka maki saņemtu aizvietotus pārskaitījumus (uzskaitīto ķēžu turpmākā pārbaude ir mūsu sarakstā). Leģitīmais npm:@juggle/resize-observer Vidēji nedēļas lejupielāžu skaits ir krietni septiņciparu skaitlis — tas ir typosquat mērķis ar lielu datplūsmu —, un ļaunprātīgā pakotne atklāšanas brīdī bija aktīva mazāk nekā 24 stundas, kas ierobežo inficēto lietotāju skaitu, bet to pilnībā neizslēdz.
Sprādziena rādiuss, kura izsekošanas vērtība nav tiešas lejupielādes @jaggle/resizeobserves — tās, visticamāk, ir mazas. Tās ir **tranzitīvas instalācijas**: izstrādātājs pievieno pakotni smilškastes projektam, palaižot npm instalēt, un pēc tam aizmirstot, ka instalēšanas aizķere vispār ir palaista. Katrai mašīnai, kas apstrādāja pēcinstalēšanu, tagad automātiskās palaišanas laikā ir lietotāja starpliktuves nolaupītājs neatkarīgi no tā, vai projekts joprojām atrodas diskā. Pakotnes direktorija noņemšana no mezgla_moduļi **neatceļ** noturību.
Jauni modeļi
Divas tendences, ko šī kampaņa iemieso.
npm kā Python lietderīgās slodzes piegādes apvalks. npm tarball ir 4 rindu instalētājs; faktiskais zaglis ir Python, ko visā sistēmā instalējis pip no komplektā iekļautās direktorijas. Tas nav nekas jauns — mēs jau iepriekš esam redzējuši, ka npm pakotnes atmet Python —, taču tā kļūst par ievērojami izplatītāku formu kriptoapgriešanas kampaņās. Operatoram ir divējāda priekšrocība: Python starpliktuves bibliotēkas (pyperclip pirmie no tiem) ir tīrāki un vairāk piemēroti dažādām platformām nekā JavaScript ekvivalenti, un vairums automatizēto npm skeneru ļoti novērtē JavaScript failus un Python .py viegli sasien. Izmaksas ir tādas, ka uzstādīšanas vieta rada daudz skaļāku troksni — svaigs pip instalēšana ir grūti noslēpt izstrādātāja datorā, kas parasti to nedara pip instalēšana laikā npm instalēt.
Platformām raksturīgi nosaukumi kā vienīgā slepenā iespēja. Vairāki neseni izstrādātāji un mazas slodzes zagļi ir pilnībā atteikušies no koda līmeņa obfuskācijas par labu likumīgi izskatīgām noturības etiķetēm. python3-dbus-helper, com.apple.python.runtime, un PyRuntimeBroker ir mācību grāmatas piemēri — vārdi, kurus aizstāvja acs izlaidīs četrdesmit lietotāju pakalpojumu sarakstā. Šī ir lēta un izturīga slepenības forma: noņemšana notiek katrā pakotnē, taču saglabāšanas faili paliek spēkā pēc noņemšanas, un pakalpojums, kas nosaukts pēc reāli izskatīga platformas komponenta, netiks iztīrīts ne ar ko citu, kā vien ar skaidru auditu.
Kas aizstāvjiem būtu jādara
- Auditēt ~/.config/systemd/user/, ~/Library/LaunchAgents/ un Get-ScheduledTask produkcija izstrādātāju datoros ierakstiem, kas uzskaitīti IOC. Noņemot npm pakotni, tie paliek savās vietās; tie ir jānoņem manuāli.
- Bloķēt pārskaitījumus uz norādītajām maku adresēm korporatīvo un valsts kases, kā arī DeFi maku robežās, kur ir pieejama adrešu atļauju sarastīšana.
- Meklējiet ~/.config/clipboard-guardian/config.json (un platformas ekvivalentiem) visā izstrādātāju iekārtu parkā. Faila klātbūtne ir augstas ticamības infekcija neatkarīgi no tā, kura pakotnes versija to piegādāja.
- Meklēt clipboard_guardian/guardian.py failā node_modules/ kešatmiņas momentuzņēmumos, kas varētu būt izveidoti pirms noņemšanas. Faila md5 ir stabils visās pārskatītajās versijās.
- Lockfile-pin @juggle/resize-observer (likumīgā pakotne), lai turpmākās instalācijas nevarētu atrisināt neko citu vienas rakstzīmes kļūdas dēļ, īpaši darbplūsmās bez bloķēšanas failiem, piemēram, NPX.
- Apstrādāt jebkuru npm pēcinstalēšanu, kas izsauc pip instalēšanu kā ļoti nopietns būvniecībāpipeline politika. Nav pamatota iemesla, kāpēc npm pakotnei instalēšanas laikā būtu nepieciešams pip — Python rīki izplata Python rīkus.
- Meklēt process_iter()-salīdzināmos uzraudzības datos procesiem ar nosaukumu python3-dbus-helper, kas importē pyperclip — maskēšanas neatbilstība (D-Bus palīgs, kurā atrodas starpliktuves bibliotēka) ir tīrākais uzvedības indikators, kāds mums ir.
- Rotēt no inficētām iekārtām ielīmētām maku adresēm. Starpliktuves nolaupītājs apdraud ceļu starp maka lietotāja saskarni un ielīmēšanas mērķi; inficēšanas laikā kopētās adreses var tikt nemanāmi mainītas. Viss, kas nosūtīts inficēšanas laikā, jāuzskata par potenciāli nepareizi novirzītu.
Secinājums: noturība pārsniedz dzēšanas ilgumu. Reģistrs galu galā noņems @jaggle/resizeobserves visās deviņās versijās; systemd vienība, LaunchAgent un Scheduled Task paši sevi nenoņems.
Atsauces
- @juggle/resize-observer vietnē npm — likumīgā pakotne, kuru šī typosquat funkcija atdarina; noderīga kā atskaites punkts baitpa bait README plaģiātam.
- @jaggle/resizeobserves reģistra metadati — publicēt deviņu ļaunprātīgo versiju laika zīmogus, kas ir noderīgi kriminālistikas laika noteikšanai.





