TL, DR
Dne 21. května 2026 vydavatel npm jaggle vydáno devět verzí (1.0.0 přes 1.0.8) z @jaggle/resizeobserves v zhruba dvouhodinovém okně.
Balíček je překlepem legitimního @juggle/resize-observer polyfill – široce používaný balíček s miliony stažení týdně – ale nedodává žádnou skutečnou implementaci ResizeObserver.
Místo toho balíček poinstalační hook nainstaluje přibalený Python payload, zaregistruje perzistenci jako běhového brokera s nativní platformou a nasadí multiplatformní únosce schránky cílící na transakce s kryptoměnami.
Linux vytrvalost se jeví jako python3-dbus-helper, macOS as com.apple.python.runtime, a Windows as PyRuntimeBroker.
Užitečná část neustále monitoruje schránku a hledá adresy peněženek. více než 40 blockchainů a tiše nahrazuje zkopírované adresy peněženkami ovládanými útočníkem.
Malware operuje výhradně lokálně bez jakékoli odchozí C2 infrastruktury, takže samotná substituce ze schránky je mechanismem exfiltrace.
Primárním IOC je samotný název balíčku: @jaggle/resizeobserves — všimněte si vynechané samohlásky ve slově „jaggle“ a přidaného „s“ ve slově „resizeobserves“.
Závažnost: vysoká.
Útok: Jak to funguje
npm:@jaggle/resizeobserves na běžném počítači nevypadá jako malware zobrazení npm. Jeho README.md je doslovný soubor README npm:@juggle/resize-observer — stejné ukázky kódu, stejné pokyny k použití, stejné importovat { ResizeObserver } z '@juggle/resize-observer' odkazy v celém textu. Plagiátorství je tak úplné, že by si kdokoli, kdo by se podíval na dokumentaci, myslel, že čte legitimní dokumentaci k balíčku.
Jedno balíček.json, naopak, je řídký: ne Sklad pole, jediné popelnice vstup ukazující na bin/clipboard-guardian.js, A po instalaci skript, který běží uzel npm-install.jsPříklady „Základního použití“ v souboru README odkazují na implementaci JavaScriptu, která nikde v tarballu neexistuje. Jediný JavaScript v balíčku je instalační skript.
Fáze 1 — npm postinstall bootstrapuje datovou část Pythonu
npm-install.js je platformně vědomý. Vyhledává jádro spustitelný soubor podél pevné vyhledávací cesty (/usr/bin/pip3, /usr/local/bin/pip, ustupující zpět k python3 -m pip), nainstaluje přiložený balíček Pythonu z adresáře tarball a – v Linuxu – stáhne xclip or xsell přes apt-get, pacmannebo Dnf pokud ani jeden z nich již není přítomen:
Použití –balíčky-systému-break je záměrné: moderní linuxové distribuce dodávají Python s povoleným externě spravovaným prostředím PEP 668, které ve výchozím nastavení blokuje instalace PIP napříč webem. Instalační skript instalaci vynutí.
Skript je také vědom sudo. Pokud je spuštěné uid výsledkem příkazu Instalace sudo npm, scénář zní SUDO_USER a vydává se na heslo getentu najít skutečný domovský adresář uživatele a poté tam zapíše své persistence soubory, nikoli do / RootPerzistence se týká jednotlivých uživatelů, nikoli celého systému.
Fáze 2 – Perzistence napříč operačními systémy pod názvy runtime brokerů
Po instalaci balíčku Pythonu skript zaregistruje položku automatického spuštění pod jiným názvem v každém operačním systému:
- Linux — uživatelská jednotka systemd na adrese ~/.config/systemd/user/python3-dbus-helper.serviceJednotka Popis is Pomocník pro běhové prostředí Pythonu D-BusSkript se to také pokouší povolit prostřednictvím systemctl –uživatelská povolení, s návratem k ručnímu symbolickému odkazu pod výchozí.cíl.chce/ když selže systemctl. Pokud je spuštěno pod příkazem sudo, skript se přepne na sudo -u systemctl –uživatels XDG_RUNTIME_DIR nastavit tak, aby volání uživatelské sběrnice fungovalo.
- macOS — plistní soubor LaunchAgent na adrese ~/Knihovna/LaunchAgents/com.apple.python.runtime.plist s SpustitPřiNačtení=true a KeepAlive=true, poté načteno přes načtení launchctl.
- Windows — naplánovaná úloha s názvem PyRuntimeBroker, spuštěná při přihlášení k provozu (AtLogOn), s časovým limitem provedení nula (tj. bez časového limitu), registrovaná pomocí PowerShellu.
Všechna tři jména jsou na první pohled věrohodná. python3-dbus-helper dodržuje konvenci pojmenování legitimní integrace Python-D-Bus na linuxových počítačích. com.apple.python.runtime napodobuje označování reverzního DNS od společnosti Apple pro její vlastní služby. PyRuntimeBroker odráží Windows RuntimeBroker.exe — skutečná, podepsaná služba od Microsoftu, která zprostředkovává žádosti o oprávnění pro aplikace UWP. V tomto kontextu se nejedná o skutečné služby Apple/Microsoft/Python, ale o obránce, který provádí rychlou vizuální kontrolu systemctl –uživatelské seznamy-jednotek or Get-ScheduledTask je nepravděpodobné, že by ucukl.
Fáze 3 – Únosce schránky
Datový náklad Pythonu, nainstalovaný na adrese clipboard_guardian/guardian.py, spustí nekonečnou smyčku, která dotazuje systémovou schránku každých 400 milisekund. Při každém taktu načte aktuální obsah schránky pomocí pyperclip.paste() a porovnává je se seznamem více než čtyřiceti předkompilovaných regulárních výrazů pokrývajících formáty adres peněženek pro 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 několik dalších, které jsou ve výchozí konfiguraci zablokované, ale prázdné (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin).
Když se najde shoda, skript přečte adresu útočníka pro daný řetězec z ~/.config/clipboard-guardian/config.json (nebo jeho ekvivalenty na platformě) a přepíše schránku nahrazeným textem:
Neexistuje žádný síťový maják. Klipper nevolá domů, neregistruje infikované hostitele, nic neodesílá. Odesílání je samotná substituce: když uživatel zkopíruje adresu příjemce z uživatelského rozhraní peněženky a vloží ji do dialogového okna pro odesílání, vložená adresa patří operátorovi. Finanční prostředky se ztrácejí v rámci pásma, transparentně pro uživatele.
Co je zde nového
V porovnání s obecnou šablonou crypto-clipper vyniká několik detailů:
1. npm → křížení Pythonu. Většina kryptoměnových nástrojů, které v npm vidíme, je čistý JavaScript, často obfuskovaný pomocí _0x rotace pole nebo eval(atob(…)) stacks. Tato ukázka používá tarball npm pouze jako obal pro doručení balíčku Pythonu – čistý Python – a umožňuje pipu zvládnout instalaci závislostí (pyperclip, psutil, Volitelně setproctitle) deklarované v balíčku pyproject.tomlNeexistuje žádné JavaScriptové zmatkování, které by bylo třeba obejít. Samotný Clipper je jednoduchý a čitelný Python.
2. Označení perzistence Tri-OS zvolené z hlediska věrohodnosti. Mnoho multiplatformních instalačních programů registruje perzistenci pod generickými názvy (aktualizační služba, helper.plist). Tato ukázka si dává tu práci s výběrem označení, která připomínají nativní běhové brokery platformy v každém operačním systému. Pojmenování je jediným pokusem o utajení – neexistuje žádný rootkit, žádné skrytí uživatelské domény ani žádné zamlžování cesty. Sázka je na to, že obránci auditují jen zřídka. ~/.config/systemd/uživatel/ a že služba s názvem python3-dbus-helper v běžné recenzi nevynikne.
3. Maskování názvu procesu je skutečné, ale antianalýza dřímá. Datová část Pythonu definuje _proces_převleku() funkce, která nastavuje název procesu pomocí setproctitle (Linux/macOS) nebo Nastavit název konzoleW (Windows) – a hlavní () říká to. Takže ps aux je dobrý začátek python3-dbus-helper místo python3 …/guardian.pyStejný modul však definuje běží_monitor() funkce, která vyjmenovává známé nástroje pro monitorování procesů (htop, btop, Správce úloh, Monitor aktivity, Process Hacker, Monitor zdrojů, monitory systémů GNOME / KDE / Xfce / MATE atd.) – a hlavní () Nikdy ji nevolá. Substituční smyčka běží bezpodmínečně, ať už má uživatel otevřený monitor procesu, nebo ne. Funkce je v dodané verzi mrtvý kód. S největší pravděpodobností se jedná o pozůstatek z dřívější iterace nebo o scaffold pro funkci, která ještě nebyla propojena. Ať tak či onak, povrch proti analýze publikovaného datového obsahu je jeden přejmenovaný procesní název, nikoli obcházení aktivního monitoru.
4. Chování slučování konfigurací v balíčku. npm-install.js zapíše výchozí seznam peněženek do ~/.config/clipboard-guardian/config.json a pokud již konfigurační soubor existuje, zařadí do něj všechny klíče, jejichž stávající hodnota je prázdná. To znamená, že uživatel, který byl dříve infikován a částečně vyčistil konfiguraci – například vyprázdněním ethereum hodnota — bude znovu naplněna při každé další instalaci škodlivého balíčku. V žádné cestě kódu nedochází k vyčištění souboru perzistence.
| Datum / čas (UTC) | událost |
|---|---|
2026-05-21 18:50:32 | @jaggle/resizeobserves@1.0.0 publikováno. |
2026-05-21 19:55:55 | 1.0.1 publikováno — první verze označená externím skenováním. |
2026-05-21 19:58:10 | 1.0.2 publikováno. |
2026-05-21 20:05:03 | 1.0.3 publikováno. |
2026-05-21 20:09:24 | 1.0.4 publikováno. |
2026-05-21 20:13:48 | 1.0.5 publikováno. |
2026-05-21 20:41:52 | 1.0.6 publikováno. |
2026-05-21 20:43:56 | 1.0.7 publikováno — přidává try/catch obal kolem kroku zápisu wallet-config npm-install.js. |
2026-05-21 20:46:15 | 1.0.8 publikováno — instalační program přejmenován npm-install.js → npm-install.cjs (bajtově identický obsah). |
2026-05-22 | Verdikty a rozsudky byly zveřejněny. Verze jsou v době vydání stále k dispozici v registru (probíhá). |
Devět verzí za jednu hodinu a padesát šest minut je rychlé i na překlep. Vzor je v souladu s... kampaň „publikuj a vypal“ — zaplavit registr pod jeden handle, nechat detekci provést svou vlastní cestu a po odstranění jedné verze přejít na nový handle. Viditelné delty v celém běhu jsou kosmetické: 1.0.1 přidán explicitní /usr/bin/pip3Cesty ve stylu -k vyhledávacímu seznamu pip (kompatibilita se sudo), 1.0.7 zabalil zápis wallet-config do příkazu try/catch a 1.0.8 přejmenoval instalační program z . Js na .cjs přičemž si zachovává bajtovou identiku obsahu. .cjs přejmenování stop s varováními npm o nejednoznačném rozlišení modulů v balíčcích bez explicitního "typ" pole a může se jednat o pokus o potlačení šumu při instalaci, který by mohl upoutat pozornost. Datová část Pythonu – jediná část, která skutečně krade data – se ve všech devíti verzích nezměnila.
Ukazatele kompromisu
Balíčky
| Ekosystém | Balíček | verze | Status |
|---|---|---|---|
| Npm | @jaggle/resizeobserves | 1.0.0 přes 1.0.8 | Platí v době zveřejnění; požadováno stažení. |
Soubory a hashe
| Cesta | Poznámky |
|---|---|
clipboard_guardian/guardian.py(md5 f7935c2c82bc881288611ab6cd634f17) | Identické ve všech devíti publikovaných verzích (1.0.0 přes 1.0.8). Užitečné zatížení strojku. |
npm-install.js (1.0.0 – 1.0.7)npm-install.cjs (1.0.8) | Instalační program pro trvalost; stejné chování od začátku do konce. 1.0.7's .js a 1.0.8's .cjs jsou bajtově identické. |
~/.config/clipboard-guardian/config.json | Konfigurace perzistence Linuxu a balíček peněženky. |
~/Library/Application Support/clipboard-guardian/config.json | konfigurace perzistence macOS a balíček peněženky. |
%APPDATA%\clipboard-guardian\config.json | Konfigurace perzistence systému Windows a balíček peněženky. |
~/.config/systemd/user/python3-dbus-helper.service | Perzistence automatického spuštění Linuxu. |
~/Library/LaunchAgents/com.apple.python.runtime.plist | Perzistence LaunchAgentu v macOS. |
~/Library/Logs/com.apple.python.runtime.log | Protokol stdout/stderr v macOS pro agenta. |
Scheduled Task PyRuntimeBroker | Úloha automatického spuštění systému Windows (AtLogOn, bez časového limitu). |
Indikátory chování
| Signálu | Popis |
|---|---|
pip install --break-system-packages z npm po instalaci | Vynutí instalaci Pythonu na celém webu bez ochrany PEP 668. |
apt-get install -y xclip (nebo pacman/nedokončil) | Instaluje utility schránky v systému Linux během instalace balíčku. |
python3-dbus-helper.service uživatelská jednotka systemd | Perzistence registrovaná pod věrohodně vypadajícím názvem běhového pomocníka. |
com.apple.python.runtime LaunchAgent | Označení perzistence mimo legitimní systémové cesty Apple. |
PyRuntimeBroker Naplánovaná úloha | Falešná perzistence běhového brokera systému Windows bez legitimního zdroje instalačního programu. |
Proces v Pythonu s názvem python3-dbus-helper importu pyperclip a psutil | Chování se neshoduje mezi zobrazeným názvem procesu a importovanými knihovnami. |
| Změny schránky ~0.4 s po kopírování adresy peněženky | Chování podpisu při substituci adresy kryptoměny. |
Balíček peněženky pro útočníky (seznam pro lovce obránců)
Seznam peněženek je dodáván pevně naprogramovaný npm-install.js a clipboard_guardian/guardian.pyObránci mohou tento seznam použít jak jako seznam blokovaných adres (jakýkoli převod na tyto adresy z firemních peněženek považovat za podezřelý), tak i jako lovecký klíč (přítomnost kteréhokoli z těchto řetězců v neověřeném konfiguračním souboru, artefaktu sestavení nebo vývojářském počítači považovat za indikátor infekce).
Balíček peněženky Attacker
| Řetěz | 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 |
| Monero | 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf |
| Solana | DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5 |
| TRON | TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2 |
| TON | UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr |
| Ripple | r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H |
| Polkadot | 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG |
| NEAR | 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364 |
| Kosmos | cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e |
| Osmóza | osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t |
| Celestia | celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5 |
| Injekční | inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh |
| Kava | kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux |
| Harmonie | one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a |
| terra | terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x |
| Algorand | XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI |
| Hvězdný | GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE |
| Cardano | addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f |
| MultiverseX | erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0 |
| Aptos | 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e |
| sui | 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78 |
| Nano | nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn |
| Filecoin | f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui |
| Tezos | tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk |
| Od té doby | 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA |
| Hedera | 0.0.10488092 |
Řetězce s regulárním výrazem, ale s prázdnými sloty pro peněženky ve výchozí konfiguraci – Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB – nejsou v této sestavě aktivně substituovány, ale jsou detekovány. Považujte je za monitorovací rozsah, nikoli za rozsah substituce.
Atribuce a motivace
Kampaň nabízí tenkou atribuční plochu. Nebyli jsme schopni potvrdit identitu operátora. Co můžeme zaznamenat:
- Metadata vydavatele. Účet npm cvrkat uvádí svůj e-mail jako olgascarlet@deltajohnsons.comDoména deltajohnsons.com Neodpovídá firemní identitě, kterou můžeme ověřit. Účet npm nevykazuje žádné ověření e-mailem ani SCM ověření. Neexistuje žádná přidružená veřejná prezentace na GitHubu.
- Pole úložiště. Jedno balíček.json nenese žádné Sklad pole. Legitimní npm:@juggle/resize-observer ukazuje na skutečný repozitář GitHubu s tisíci hvězdiček a aktivními problémy. Absence odkazu na repozitář je nejrychlejší vizuální identifikace v uživatelském rozhraní npm.
- Plagiátorství v README. Balíček README je legitimní @juggle/resize-observer Soubor README bajt po bajtu, včetně import příklady, které odkazují @juggle/resize-observer samotný (ne publikační balíček). Provozovatel se ani neobtěžoval přepsat importované soubory – což je běžný signál, že soubor readme byl stažen, nikoli upraven.
- Žádná infrastruktura, na kterou by se dalo opřít. Neexistuje žádný koncový bod C2, žádné vyhledávání DNS ani žádná IP adresa. Škodlivé chování je plně zapouzdřeno v lokálním klipperu a pevně naprogramovaném balíčku peněženek. Díky tomu není možné přepínání peněženek na základě domény nebo ASN. Obránci, kteří přepínání peněženek mezi kampaněmi, by měli porovnat hash peněženek s jakýmkoli předchozím klipperem, který mají v souboru; opětovné použití peněženky napříč balíčky je nejsnadnějším propojením napříč kampaněmi.
- Volba pojmenování. @jaggle/resizeobservations je o jeden znak jinde než @žonglovat a o jednu inflexi od známého pozorovatel změny velikostiKombinovaná vzdálenost pro úpravy jsou dva glyfy. Jedná se o záměrnou vizuální kolizi, nikoli o obecný dřep.
Motivace, založená na chování v datové části: čistá monetizace prostřednictvím oportunistické substituce ze schránky. Nedochází k žádnému sběru přihlašovacích údajů, otiskům hostitele ani k čtení proměnných prostředí. Operátorovi je jedno, kdo je oběť – záleží mu na tom, aby další přenos oběti směřoval na jednu z uvedených adres. Pokrytí čtyřiceti řetězců je loterijní model v akci: házejte široce a doufejte, že na N instalací přistane jeden vysoce hodnotný vložený objekt.
Zdá se, že operátorovi je otázka odstranění lhostejná. Publikování devíti verzí během dvou hodin ve stejném rozsahu se čte jako pokyn „publikovat a vypálit“: maximalizovat využití registru, než se zvýší latence odstranění, a pak pokračovat. Nepozorovali jsme nic takového. @jaggle v době psaní tohoto textu znovu publikujeme pod novým rozsahem, ale očekávali bychom podobné rozsahy (@jaggie, @žonglovat-, @joggle) se objeví v nadcházejících dnech, pokud bude operátor stále aktivní.
Dopad, trendy a co by měli obránci dělat
Dopad
Kvantifikace dopadu v reálných penězích není z aktuální datové sady možná. Nástroj pro zachycení nezaznamenává žádnou telemetrii a peněženky dosud nebyly pozorovány při přijímání náhradních převodů k datu uzávěrky analýzy (následné sledování uvedených řetězců je na našem seznamu). Legitimní npm:@juggle/resize-observer průměrně dosahuje sedmimístných týdenních stažení – což je cíl s vysokou návštěvností, což je chyba v překlepech – a škodlivý balíček byl v době odhalení aktivní méně než 24 hodin, což omezuje vystavenou populaci, ale nenuluje ji.
Sledování poloměru výbuchu není přímým stahováním @jaggle/resizeobservations — ty jsou pravděpodobně malé. Jde o **tranzitivní instalace**: vývojář přidá balíček do sandboxového projektu a spustí npm installa pak zapomene, že instalační hook vůbec spustil instalaci. Každý počítač, který zpracoval postinstalační operaci, má nyní při automatickém spuštění únosce schránky pro každého uživatele, bez ohledu na to, zda je projekt stále na disku. Odebrání adresáře balíčku z node_modules neodstraňuje perzistenci.
Vznikající vzorce
Dva trendy, které tato kampaň ilustruje.
npm jako obal pro doručování datových částí v Pythonu. npm tarball je čtyřřádkový instalační soubor; skutečným stealerem je Python, který se instaluje do celého systému pomocí jádro z adresáře s balíčky. Není to nic nového – už jsme viděli, jak npm balíčky Python vynechávají – ale stává se to měřitelně běžnější formou v kampaních krypto-klipperů. Výhoda pro operátora je dvojí: knihovny schránky Pythonu (pyperclip první z nich) jsou čistší a multiplatformnější než JavaScriptové ekvivalenty a Většina automatizovaných npm skenerů silně zatěžuje soubory JavaScript a Python. .py lehce se svazuje. Cenou je, že instalační stopa je mnohem hlučnější – nový pip nainstalovat je těžké skrýt na vývojářském počítači, který to normálně nedělá pip nainstalovat během npm install.
Platformově nativní názvy jako jediná nenápadnost. Několik nedávných nástrojů pro zastřihování kódu a vykrádání malých datových úložišť se zcela zbavilo obfuskace na úrovni kódu ve prospěch legitimně vypadajících popisků perzistence. python3-dbus-helper, com.apple.python.runtime, a PyRuntimeBroker jsou učebnicové příklady – názvy, které oko obránce přehlédne na seznamu čtyřiceti uživatelských služeb. Jedná se o levnou a odolnou formu utajení: zablokování se provádí pro jednotlivé balíčky, ale soubory perzistence zablokování přežijí a služba pojmenovaná po skutečně vypadající komponentě platformy nebude vyčištěna ničím jiným než explicitním auditem.
Co by měli obránci dělat
- Audit ~/.config/systemd/user/, ~/Library/LaunchAgents/ a Get-ScheduledTask výstup na počítačích vývojářů pro položky uvedené v IOC. Odebrání balíčku npm tyto položky ponechá na místě; je třeba je odstranit ručně.
- Blokovat převody na uvedené adresy peněženek na hranicích mezi korporátními pokladnami a DeFi peněženkami, kde je k dispozici seznam povolených adres.
- Hledejte soubor ~/.config/clipboard-guardian/config.json (a ekvivalenty platformy) napříč celým systémem vývojářů a strojů. Přítomnost souboru je vysoce pravděpodobnou infekcí bez ohledu na to, která verze balíčku jej doručila.
- Hledat v node_modules/ soubor clipboard_guardian/guardian.py ve snapshotech build-cache, které mohly předcházet zastavení hry. Soubor md5 je stabilní ve všech recenzovaných verzích.
- Lockfile-pin @juggle/resize-observer (legitimní balíček), takže budoucí instalace nemohou být pod jednoznakovou chybou přeloženy na nic jiného, zejména v pracovních postupech bez lockfile, jako je npx.
- Ošetření jakéhokoli npm postinstall volajícího pip install jako vysoce závažný ve výstavbě-pipeline zásady. Neexistuje žádný legitimní důvod, proč by npm balíček potřeboval pip při instalaci – Python tooling distribuuje Python tooling.
- Vyhledat data monitorování srovnatelná s process_iter() pro procesy s názvem python3-dbus-helper, které importují pyperclip — neshoda v maskování (pomocník D-Bus s knihovnou schránky) je nejčistším behaviorálním indikátorem, který máme.
- Rotovat adresy peněženek vložené z infikovaných počítačů. Únosce schránky naruší cestu mezi uživatelským rozhraním peněženky a cílem vložení; adresy kopírované během infekce mohou být tiše změněny. Cokoli odeslaného během okna infekce by mělo být považováno za potenciálně chybně směrované.
Poučení: vytrvalost přežije i odstranění. Registr nakonec odstraní @jaggle/resizeobservations Ve všech devíti verzích se jednotka systemd, LaunchAgent a naplánovaná úloha samy neodstraní.
Reference
- @juggle/resize-observer na npm — legitimní balíček, za který se tento překlep vydává; užitečný jako základ pro plagiátorství bajt po bajtu v souboru README.
- Metadata registru @jaggle/resizeobserves — publikovat časová razítka pro devět škodlivých verzí, což je užitečné pro forenzní časové plánování.





