TL; DR
Dňa 21. mája 2026 vydavateľ npm jaggle vydaných deväť verzií (1.0.0 cez 1.0.8) z @jaggle/resizeobserves v približne dvojhodinovom okne.
Balík je preklepom legitímneho @juggle/resize-observer polyfill – široko používaný balík s miliónmi stiahnutí týždenne – ale nedodáva žiadnu skutočnú implementáciu ResizeObserver.
Namiesto toho, balík háčik po inštalácii nainštaluje balík Python payload, zaregistruje perzistenciu ako runtime brokera s natívnym vzhľadom pre danú platformu a nasadí multiplatformový únosca schránky zameraný na transakcie s kryptomenami.
Linux vytrvalosť sa javí ako python3-dbus-helper, macOS as com.apple.python.runtimea Windows as PyRuntimeBroker.
Užitočné zaťaženie neustále monitoruje schránku a hľadá adresy peňaženiek viac ako 40 blockchainov a potichu nahrádza skopírované adresy peňaženkami ovládanými útočníkom.
Malvér funguje výlučne lokálne bez akejkoľvek infraštruktúry odchádzajúceho C2, vďaka čomu je samotná substitúcia zo schránky mechanizmom exfiltrácie.
Primárnym IOC je samotný názov balíka: @jaggle/resizeobserves — všimnite si vynechanú samohlásku v slove „jaggle“ a pridané „s“ v slove „resizeobserves“.
Závažnosť: vysoká.
Útok: Ako to funguje
npm:@jaggle/zmena veľkostiobserve nevyzerá ako malware na bežnom počítači zobrazenie npm. Jeho README.md je doslovný súbor README npm:@juggle/resize-observer — rovnaké ukážky kódu, rovnaké pokyny na použitie, rovnaké importovať { ResizeObserver } z '@juggle/resize-observer' odkazy v celom texte. Plagiátorstvo je také úplné, že každý, kto si pozrie dokumentáciu, si bude myslieť, že číta legitímnu dokumentáciu k balíku.
package.json, naopak, je riedky: nie sklad pole, jedno popolnice vstup smerujúci na bin/clipboard-guardian.js, A po inštalácii skript, ktorý beží uzol npm-install.jsPríklady „Základné použitie“ v súbore README odkazujú na implementáciu JavaScriptu, ktorá sa nikde v tarballe nenachádza. Jediný JavaScript v balíku je inštalačný skript.
Fáza 1 – npm po inštalácii zavádza dáta Pythonu
npm-install.js je platformovo orientovaný. Vyhľadáva jadro spustiteľný súbor pozdĺž pevnej vyhľadávacej cesty (/usr/bin/pip3, /usr/local/bin/pip, ustupujúc späť k python3 -m pip), nainštaluje pribalený balík Python z adresára tarball a – v systéme Linux – stiahne XCLIP or xsell via apt-get, pacman, Alebo DNF ak ani jeden z nich ešte nie je prítomný:
Použitie –balíky-prerušovacích-systémov je zámerné: moderné distribúcie Linuxu dodávajú Python s povoleným externe spravovaným prostredím PEP 668, ktoré štandardne blokuje inštalácie PIP na celom webe. Inštalačný skript vynúti inštaláciu.
Skript je tiež zodpovedný za sudo. Keď je spustené uid výsledkom inštalácia sudo npm, scenár znie SUDO_USER a vypláca do getentpasswd nájsť skutočný domovský adresár používateľa a potom tam zapíše svoje perzistentné súbory, a nie do / RootPerzistencia sa vzťahuje na jednotlivých používateľov, nie na celý systém.
Fáza 2 – Perzistencia medzi operačnými systémami pod názvami runtime brokerov
Po nainštalovaní balíka Python skript zaregistruje položku automatického spustenia pod iným názvom v každom operačnom systéme:
- Linux — používateľská jednotka systemd na adrese ~/.config/systemd/user/python3-dbus-helper.serviceJednotka Popis is Pomocník pre beh D-Bus v PythoneSkript sa to tiež pokúša povoliť prostredníctvom systemctl –povoliť používateľovi, pričom sa vracám k manuálnemu symbolickému odkazu pod predvolené.cieľ.chce/ keď zlyhá systemctl. Ak sa spúšťa pod príkazom sudo, skript sa prepne na sudo -u systemctl –používateľS XDG_RUNTIME_DIR nastavené tak, aby volanie používateľskej zbernice fungovalo.
- macOS — plist súboru LaunchAgent na adrese ~/Knižnica/LaunchAgents/com.apple.python.runtime.plist s SpustiťPriNačítaní=true a KeepAlive=true, potom načítané cez načítanie launchctl.
- Windows — naplánovaná úloha s názvom PyRuntimeBroker, spustená pri prihlásení do prevádzky (AtLogOn), s časovým limitom vykonania nula (t. j. bez časového limitu), registrovaná prostredníctvom PowerShellu.
Všetky tri mená sú na prvý pohľad dôveryhodné. python3-dbus-helper dodržiava konvenciu pomenovania legitímnej integrácie Python-D-Bus na počítačoch s Linuxom. com.apple.python.runtime napodobňuje označovanie reverzného DNS od spoločnosti Apple pre jej vlastné služby. PyRuntimeBroker pripomína systém Windows RuntimeBroker.exe — skutočná, podpísaná služba od spoločnosti Microsoft, ktorá sprostredkúva žiadosti o povolenia pre aplikácie UWP. Žiadna z týchto služieb v tomto kontexte nie je skutočná služba od spoločností Apple/Microsoft/Python, ale obranca vykonávajúci rýchlu vizuálnu kontrolu systemctl –user list-units or Get-ScheduledTask je nepravdepodobné, že by sa mykol.
Fáza 3 – Únosca schránky
Užitočné dáta Pythonu, nainštalované na clipboard_guardian/guardian.py, spúšťa nekonečnú slučku, ktorá každých 400 milisekúnd dotazuje systémovú schránku. Pri každom tiknutí načíta aktuálny obsah schránky prostredníctvom pyperclip.paste() a spúšťa ich so zoznamom viac ako štyridsiatich predkompilovaných regulárnych výrazov pokrývajúcich formáty adries peňaženiek pre 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 a niekoľko ďalších, ktoré sú v predvolenej konfigurácii odhalené, ale prázdne (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin).
Keď sa nájde zhoda, skript prečíta adresu útočníka pre daný reťazec z ~/.config/clipboard-guardian/config.json (alebo jeho ekvivalenty na platforme) a prepíše schránku nahradeným textom:
Neexistuje žiadny sieťový maják. Klipper netelefonuje domov, neregistruje infikované hostiteľské počítače, nič neodstraňuje. Odstraňovanie je samotná substitúcia: keď používateľ skopíruje adresu príjemcu z používateľského rozhrania peňaženky a vloží ju do dialógového okna odosielania, vložená adresa patrí operátorovi. Finančné prostriedky sa stratia v rámci pásma, transparentne pre používateľa.
Čo je tu nové
V porovnaní s generickou šablónou crypto-clipper vyniká niekoľko detailov:
1. npm → prechod medzi jazykom Python. Väčšina kryptokliperov, ktoré vidíme v npm, je čistý JavaScript, často zahalený _0x rotácia poľa alebo eval(atob(…)) zásobníky. Táto ukážka používa archív npm ako obal na doručenie balíka Python – čistý Python – a umožňuje pip spracovať inštaláciu závislostí (pyperclip, psutil, voliteľné názov_programu) deklarované v balíku pyproject.tomlNeexistuje žiadne zahmlievanie JavaScriptu, ktoré by sa dalo prekonať. Samotný nástroj na úpravu textu je jednoduchý a čitateľný v jazyku Python.
2. Označenia perzistencie Tri-OS vybrané z hľadiska vierohodnosti. Mnoho multiplatformových inštalátorov registruje perzistenciu pod generickými názvami (aktualizačná služba, helper.plist). Táto vzorka si dáva záležať na výbere označení, ktoré pripomínajú platformovo natívne runtime brokery v každom operačnom systéme. Pomenovanie je jediným pokusom o utajenie – neexistuje žiadny rootkit, žiadne skrývanie používateľskej oblasti ani žiadne zahmlievanie cesty. Stávka je, že obrancovia len zriedka vykonávajú audit. ~/.config/systemd/user/ a že služba s názvom python3-dbus-helper v bežnej recenzii nevynikne.
3. Maskovanie názvu procesu je skutočné, ale antianalýza je skrytá. Užitočná záťaž Pythonu definuje _proces_prezliekania() funkcia, ktorá nastavuje názov procesu pomocou názov_programu (Linux/macOS) alebo Nastaviť názov konzoly W (Windows) – a Hlavná() volá to. Takže ps aux ukáže python3-dbus-helper MIESTO python3 …/guardian.pyTen istý modul však definuje je_monitor_beží() funkcia, ktorá vymenúva známe nástroje na monitorovanie procesov (htop, btop, Správca úloh, Monitor aktivity, Process Hacker, Monitor zdrojov, monitory systémov GNOME / KDE / Xfce / MATE atď.) – a Hlavná() Nikdy ho nevolá. Substitučná slučka beží bezpodmienečne, bez ohľadu na to, či má používateľ otvorený monitor procesu alebo nie. Funkcia je v dodanej verzii mŕtvy kód. S najväčšou pravdepodobnosťou ide o pozostatok z predchádzajúcej iterácie alebo o scaffold pre funkciu, ktorá ešte nie je prepojená. V každom prípade je povrch proti analýze publikovaného užitočného zaťaženia premenovaním jedného názvu procesu, nie obchádzaním aktívneho monitora.
4. Správanie zlúčenia konfigurácií v balíku. npm-install.js zapíše predvolený zoznam peňaženiek do ~/.config/clipboard-guardian/config.json a ak už konfiguračný súbor existuje, zlúči všetky kľúče, ktorých existujúca hodnota je prázdna. To znamená, že používateľ, ktorý bol predtým infikovaný a čiastočne vyčistil konfiguráciu – napríklad vyprázdnením ethereum hodnota — pri každej následnej inštalácii škodlivého balíka sa znova naplní. V žiadnej ceste kódu sa nevyčistí súbor perzistencie.
| Dátum / čas (UTC) | udalosť |
|---|---|
2026-05-21 18:50:32 | @jaggle/resizeobserves@1.0.0 publikované. |
2026-05-21 19:55:55 | 1.0.1 publikované – prvá verzia označená externým skenovaním. |
2026-05-21 19:58:10 | 1.0.2 publikované. |
2026-05-21 20:05:03 | 1.0.3 publikované. |
2026-05-21 20:09:24 | 1.0.4 publikované. |
2026-05-21 20:13:48 | 1.0.5 publikované. |
2026-05-21 20:41:52 | 1.0.6 publikované. |
2026-05-21 20:43:56 | 1.0.7 publikované — pridáva try/catch obal okolo kroku zápisu konfigurácie peňaženky npm-install.js. |
2026-05-21 20:46:15 | 1.0.8 publikované — inštalátor premenovaný npm-install.js → npm-install.cjs (bajtovo identický obsah). |
2026-05-22 | Verdikty a rozsudky boli zverejnené. Verzie sú v čase zverejnenia stále dostupné v registri (priebežne). |
Deväť verzií za jednu hodinu a päťdesiatšesť minút je rýchly čas aj na preklep. Vzor je v súlade s kampaň typu „publikuj a napáľ“ — zaplaviť register pod jeden identifikátor, nechať detekciu pokračovať a po odstránení jednej verzie prejsť na nový identifikátor. Viditeľné rozdiely v priebehu behu sú kozmetické: 1.0.1 pridané explicitné /usr/bin/pip3cesty k zoznamu vyhľadávania pipov v štýle - (kompatibilita so sudo), verzia 1.0.7 zabalila zápis konfigurácie peňaženky do príkazu try/catch a verzia 1.0.8 premenovala inštalátor z . Js na .cjs pričom si zachováva bajtovú identiku obsahu. .cjs premenovanie skladieb s upozorneniami npm o nejednoznačnom rozlíšení modulov v balíkoch bez explicitného „Typ“ pole a môže ísť o pokus o potlačenie šumu pri inštalácii, ktorý by mohol upútať pozornosť. Užitočné zaťaženie Pythonu – jediná časť, ktorá skutočne kradne – sa vo všetkých deviatich verziách nezmenilo.
Indikátory kompromisu
Balíčky
| ekosystém | Balíček | verzia | postavenie |
|---|---|---|---|
| NPM | @jaggle/resizeobserves | 1.0.0 cez 1.0.8 | Živé v čase vydania; žiadosť o stiahnutie. |
Súbory a haše
| Cesta | Poznámky |
|---|---|
clipboard_guardian/guardian.py(md5 f7935c2c82bc881288611ab6cd634f17) | Identické vo všetkých deviatich publikovaných verziách (1.0.0 cez 1.0.8). Užitočné zaťaženie strojčeka. |
npm-install.js (1.0.0 – 1.0.7)npm-install.cjs (1.0.8) | Inštalátor perzistencie; rovnaké správanie od začiatku do konca. 1.0.7's .js a 1.0.8's .cjs sú bajtovo identické. |
~/.config/clipboard-guardian/config.json | Balík konfigurácie perzistencie Linuxu a peňaženky. |
~/Library/Application Support/clipboard-guardian/config.json | balík konfigurácie perzistencie pre macOS a peňaženky. |
%APPDATA%\clipboard-guardian\config.json | Konfigurácia perzistencie systému Windows a balík peňaženky. |
~/.config/systemd/user/python3-dbus-helper.service | Trvalosť automatického spustenia Linuxu. |
~/Library/LaunchAgents/com.apple.python.runtime.plist | Perzistencia LaunchAgentu v macOS. |
~/Library/Logs/com.apple.python.runtime.log | Protokol stdout/stderr v systéme macOS pre agenta. |
Scheduled Task PyRuntimeBroker | Úloha automatického spustenia systému Windows (AtLogOn, bez časového limitu). |
Indikátory správania
| Signálu | Popis |
|---|---|
pip install --break-system-packages z npm po inštalácii | Vynúti inštaláciu Pythonu na celom webe, pričom obíde ochrany PEP 668. |
apt-get install -y xclip (alebo pacman/nedokončil(a)) | Nainštaluje nástroje schránky v systéme Linux počas inštalácie balíka. |
python3-dbus-helper.service používateľská jednotka systemd | Perzistencia registrovaná pod vierohodne vyzerajúcim názvom pomocníka pre runtime. |
com.apple.python.runtime LaunchAgent | Označenie perzistencie mimo legitímnych systémových ciest Apple. |
PyRuntimeBroker Naplánovaná úloha | Falošná perzistencia brokera runtime systému Windows bez legitímneho zdroja inštalátora. |
Proces v Pythone s názvom python3-dbus-helper import pyperclip a psutil | Nesúlad v správaní medzi zobrazeným názvom procesu a importovanými knižnicami. |
| Zmeny schránky ~0.4 s po kopírovaní adresy peňaženky | Správanie podpisu pri substitúcii adresy kryptomeny. |
Balík peňaženiek pre útočníkov (zoznam na lov obrancov)
Zoznam peňaženiek sa dodáva pevne naprogramovaný npm-install.js a clipboard_guardian/guardian.pyObrancovia môžu tento zoznam použiť ako blokovací zoznam (akýkoľvek prevod na tieto adresy z firemných peňaženiek považovať za podozrivý) aj ako lovecký kľúč (prítomnosť ktoréhokoľvek z týchto reťazcov v neoverenom konfiguračnom súbore, artefakte zostavenia alebo počítači vývojára považovať za indikátor infekcie).
Balík peňaženky Attacker
| Reťaz | adresa |
|---|---|
| Ethereum / BSC | 0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Ronin (EVM) | ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Bitcoin | bc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y |
| Bitcoin Cash | bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt |
| Litecoin | ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe |
| dogecoin | DNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy |
| pomlčka | XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS |
| Zcash | t1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M |
| DigiByte | DPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH |
| Monera | 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf |
| Solana | DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5 |
| TRON | TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2 |
| TON | UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr |
| Ripple | r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H |
| polkadot | 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG |
| NEAR | 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364 |
| Kozmos | cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e |
| osmóza | osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t |
| Celestia | celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5 |
| injective | inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh |
| Kava | kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux |
| Harmónia | one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a |
| Krajiny | terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x |
| Algorand | XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI |
| hviezdny | GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE |
| Cardano | addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f |
| MultiverseX | erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0 |
| apt | 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e |
| sui | 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78 |
| Nano | nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn |
| Filecoin | f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui |
| Tezos | tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk |
| Ergo | 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA |
| hlavička | 0.0.10488092 |
Reťaze s regulárnym výrazom, ale s prázdnymi slotmi pre peňaženky v predvolenej konfigurácii – Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB – nie sú v tejto zostave aktívne substituované, ale sú detekované. Považujte ich za rozsah monitorovania, nie za rozsah substitúcie.
Atribúcia a motivácia
Kampaň ponúka tenkú atribučnú plochu. Nepodarilo sa nám potvrdiť identitu prevádzkovateľa. Čo dokážeme zaznamenať:
- Metadáta vydavateľa. Účet npm cvrlikať uvádza svoj e-mail ako olgascarlet@deltajohnsons.comDoména deltajohnsons.com neprechádza na firemnú identitu, ktorú môžeme overiť. Účet npm nevykazuje žiadne overenie e-mailom a žiadne SCM overenie. Neexistuje žiadna priradená verejná prítomnosť na GitHube.
- Pole úložiska. package.json nenesie žiadne sklad pole. Legitímne npm:@juggle/resize-observer ukazuje na skutočný GitHub repozitár s tisíckami hviezdičiek a aktívnych problémov. Absencia odkazu na repozitár je najrýchlejším vizuálnym ukazovateľom v používateľskom rozhraní npm.
- Plagiátorstvo v súbore README. Balík README je legitímny @juggle/resize-observer Súbor README bajt po bajte, vrátane import príklady, ktoré odkazujú @juggle/resize-observer samotný (nie publikačný balík). Prevádzkovateľ sa ani neobťažoval prepísať importované súbory – bežný signál, že súbor readme bol stiahnutý, nie upravený.
- Žiadna infraštruktúra, na ktorej by sa dalo oprieť. Neexistuje žiadny koncový bod C2, žiadne vyhľadávanie DNS, žiadna IP adresa. Škodlivé správanie je plne zapuzdrené v lokálnom nástroji na úpravu peňaženky a pevne naprogramovanom balíku peňaženiek. Vďaka tomu nie je možné prepínať peňaženky na základe domény alebo ASN. Obrancovia, ktorí prepínajú peňaženky medzi kampaňami, by mali porovnať hašovaciu hodnotu peňaženiek s akýmkoľvek predchádzajúcim nástrojom na úpravu peňaženky, ktorý majú v súbore; opätovné použitie peňaženky v rôznych balíkoch je najzvládnuteľnejším prepojením medzi kampaňami.
- Výber pomenovania. @jaggle/zmena veľkostiobservations je o jeden znak vzdialený od @žonglovať a o jednu inflexiu ďalej od dobre známeho pozorovateľ zmeny veľkostiKombinovaná vzdialenosť úprav sú dva glyfy. Ide o zámernú vizuálnu kolíziu, nie o generický drep.
Motivácia, založená na správaní užitočného zaťaženia: čistá monetizácia prostredníctvom oportunistickej substitúcie zo schránky. Neexistuje žiadny zber prihlasovacích údajov, žiadne odtlačky hostiteľa ani čítanie premenných prostredia. Operátorovi je jedno, kto je obeťou – záleží mu na tom, aby ďalší prevod obete smeroval na jednu z uvedených adries. Štyridsaťreťazcové pokrytie je lotériový model v akcii: rozhoďte široko, dúfajte, že na N inštalácií pristane jeden vysokohodnotný pastový efekt.
Zdá sa, že prevádzkovateľa zastavenie rušenia nezaujíma. Publikovanie deviatich verzií v priebehu dvoch hodín v rovnakom rozsahu sa chápe ako príkaz „publikovať a napáliť“: maximalizovať zaťaženie registra skôr, ako sa prekročí latencia zastavenia, a potom pokračovať. Nepozorovali sme nič. @jaggle v čase písania tohto článku opätovne publikujeme pod novým rozsahom, ale očakávali by sme aj podobné rozsahy (@jaggie, @žonglovať-, @joggle) sa objavia v najbližších dňoch, ak bude operátor stále aktívny.
Dopad, trendy a čo by mali obhajcovia robiť
Vplyv - CSR
Kvantifikácia vplyvu v reálnych peniazoch nie je z aktuálneho súboru údajov možná. Klipper nezaznamenáva žiadnu telemetriu a peňaženky zatiaľ k dátumu uzávierky analýzy neprijímajú žiadne náhradné prevody (na našom zozname je následné sweep uvedených reťazcov). Legitímne npm:@juggle/resize-observer priemerne dosahuje sedemciferné týždenné sťahovania – čo je cieľ s vysokou návštevnosťou, čo je chyba v preklepoch – a škodlivý balík bol v čase odhalenia aktívny menej ako 24 hodín, čo obmedzuje vystavenú populáciu, ale nevynuluje ju.
Sledovanie polomeru výbuchu nie je priame sťahovanie @jaggle/zmena veľkostiobservations — tie sú pravdepodobne malé. Ide o **tranzitívne inštalácie**: vývojár pridá balík do sandboxového projektu a spustí npm installa potom zabudnutie na spustenie inštalačného hooku. Každý počítač, ktorý spracoval poinštaláciu, má teraz pri automatickom spustení únoscu schránky pre každého používateľa, bez ohľadu na to, či je projekt stále na disku. Odstránenie adresára balíka z node_modules **neodstraňuje** perzistenciu.
Vznikajúce vzorce
Dva trendy, ktoré táto kampaň ilustruje.
npm ako obal na doručovanie užitočného zaťaženia v jazyku Python. Tarball npm je štvorriadkový inštalátor; skutočným stealerom je Python, ktorý sa inštaluje do celého systému pomocou jadro z adresára balíkov. Toto nie je nič nové – už sme videli, ako npm balíky vynechávajú Python – ale stáva sa to merateľne bežnejšou formou v kampaniach kryptokliperov. Výhoda pre operátora je dvojaká: knižnice schránky Pythonu (pyperclip prvé z nich) sú čistejšie a multiplatformovejšie ako ekvivalenty v jazyku JavaScript a väčšina automatizovaných npm skenerov výrazne zaťažuje súbory JavaScript a Python .py zľahka zväzuje. Cena je v tom, že inštalačná stopa je oveľa hlučnejšia – nový pip nainštalovať je ťažké skryť na vývojárskom počítači, ktorý to bežne nerobí pip nainštalovať počas npm install.
Názvy natívne pre platformu ako jediná nenápadnosť. Niekoľko nedávnych nástrojov na úpravu kódu a nástrojov na vykradnutie malých dát úplne upustilo od obfuskacie na úrovni kódu v prospech legitímne vyzerajúcich označení perzistencie. python3-dbus-helper, com.apple.python.runtimea PyRuntimeBroker sú učebnicové príklady – názvy, ktoré obranca preskočí na zozname štyridsiatich používateľských služieb. Ide o lacnú a odolnú formu utajenia: zastavenie sa vykonáva pre každý balík naraz, ale súbory perzistencie prežijú zastavenie a služba pomenovaná podľa skutočne vyzerajúceho komponentu platformy sa nevyčistí ničím iným ako explicitným auditom.
Čo by mali obrancovia robiť
- Audit ~/.config/systemd/user/, ~/Library/LaunchAgents/ a Get-ScheduledTask výkon na počítačoch vývojárov pre položky uvedené v IOC. Odstránenie balíka npm ich ponechá na mieste; je potrebné ich odstrániť ručne.
- Blokovať prevody na uvedené adresy peňaženiek na hraniciach medzi korporátnymi pokladnicami a DeFi peňaženkami, kde je k dispozícii zoznam povolených adries.
- Hľadajte súbor ~/.config/clipboard-guardian/config.json (a ekvivalenty platformy) v rámci celého systému vývojárov a počítačov. Prítomnosť súboru predstavuje vysoko pravdepodobnú infekciu bez ohľadu na to, ktorá verzia balíka ho poskytla.
- Vyhľadajte súbor clipboard_guardian/guardian.py v node_modules/ v snímkach vyrovnávacej pamäte zostavenia, ktoré mohli predchádzať zastaveniu. Súbor md5 je stabilný vo všetkých recenzovaných verziách.
- Pripnutie uzamknutého súboru @juggle/resize-observer (legitímny balík), takže budúce inštalácie sa nemôžu pod jednoznakovou chybou rozpoznať ako nič iné, najmä v pracovných postupoch bez lockfile, ako napríklad NPX.
- Ošetrite akúkoľvek npm postinstall, ktorá vyvolá pip install ako vysoko závažné v budove-pipeline politika. Neexistuje žiadny legitímny dôvod, aby npm balík potreboval pip počas inštalácie – nástroje Pythonu distribuujú nástroje Pythonu.
- Vyhľadávanie monitorovacích dát porovnateľných s process_iter() pre procesy s názvom python3-dbus-helper, ktoré importujú pyperclip — nesúlad maskovania (pomocník D-Bus s knižnicou schránky) je najčistejším behaviorálnym indikátorom, aký máme.
- Otáčajte adresy peňaženiek vložené z infikovaných počítačov. Únosca schránky ohrozuje cestu medzi používateľským rozhraním peňaženky a cieľom vloženia; adresy skopírované počas infikovania môžu byť ticho zmenené. Čokoľvek odoslané počas okna infikovania by sa malo považovať za potenciálne nesprávne smerované.
Ponaučenie: vytrvalosť prežije aj odstránenie. Register nakoniec odstráni @jaggle/zmena veľkostiobservations Vo všetkých deviatich verziách sa jednotka systemd, LaunchAgent a naplánovaná úloha samy neodstránia.
Referencie
- @juggle/resize-observer na npm — legitímny balík, za ktorý sa tento typosquat vydáva; užitočný ako základ pre plagiátorstvo bajt po bajte v súbore README.
- Metadáta registra @jaggle/resizeobserves — zverejniť časové pečiatky pre deväť škodlivých verzií, čo je užitočné pre forenzné časové plánovanie.





