TL; DR
Den 21. maj 2026, npm-udgiveren jaggle udgivet ni versioner (1.0.0 ved 1.0.8) af @jaggle/resizeobserves i et vindue på cirka to timer.
Pakken er en typosquat af det legitime @juggle/resize-observer polyfill — en udbredt pakke med millioner af ugentlige downloads — men leverer ingen egentlig ResizeObserver-implementering.
I stedet er pakkens postinstall-krog installerer en medfølgende Python-nyttelast, registrerer persistens som en platformsnative runtime-broker og implementerer en platformsuafhængig udklipsholder-kaprer, der er målrettet mod kryptovalutatransaktioner.
Linux vedholdenhed fremstår som python3-dbus-helper, MacOS as com.apple.python.runtimeog Windows as PyRuntimeBroker.
Nyttelasten overvåger løbende udklipsholderen for tegnebogsadresser på tværs mere end 40 blockchains og erstatter lydløst kopierede adresser med angriberstyrede tegnebøger.
Malwaren opererer udelukkende lokalt uden udgående C2-infrastruktur, hvilket gør udklipsholderstatningen til selve eksfiltreringsmekanismen.
Den primære IOC er selve pakkenavnet: @jaggle/resizeobserves — bemærk den udeladte vokal i “jaggle” og det tilføjede “s” i “resizeobserves”.
Sværhedsgrad: høj.
Angrebet: Sådan fungerer det
npm:@jaggle/resizeobserves ligner ikke malware på en casual npm-visning. Dens README.md er den ordrede README-fil af npm:@jonglere/ændre størrelse-observatør — samme kodeeksempler, samme brugsanvisninger, samme importér { ResizeObserver } fra '@juggle/resize-observer' referencer overalt. Plagiatet er så omfattende, at enhver, der kigger på dokumentationen, ville antage, at de læser den legitime pakkes dokumentation.
pakke.jsoner derimod sparsom: nej Repository felt, en enkelt bin indgang peger på bin/udklipsholder-guardian.jsOg en efterinstallation script der kører node npm-install.jsREADME-filens eksempler på "Grundlæggende brug" refererer til en JavaScript-implementering, der ikke findes nogen steder i tarballen. Det eneste JavaScript i pakken er installationsskriptet.
Trin 1 — npm postinstall bootstrapper en Python-nyttelast
npm-install.js er platformbevidst. Den lokaliserer en pip eksekverbar langs en fast søgesti (/usr/bin/pip3, /usr/local/bin/pip, falder tilbage til python3 -m pip), installerer den medfølgende Python-pakke fra tarball-mappen, og — på Linux — henter xclip or xsell via apt-get, Pacman eller DNF hvis ingen af delene allerede er til stede:
Brugen af –break-system-pakker er bevidst: moderne Linux-distributioner leverer Python med PEP 668's markør for eksternt administreret miljø aktiveret, hvilket som standard blokerer pip-installationer på hele webstedet. Installationsscriptet tvinger installationen igennem.
Scriptet er også sudo-bevidst. Når den kørende uid er resultatet af en sudo npm installation, manuskriptet læser SUDO_USER og punger ud til hent adgangskode at finde ægte brugerens hjemmemappe og skriver derefter sine persistensfiler dertil i stedet for ind i / RootPersistens er pr. bruger, ikke systemomfattende.
Fase 2 — Krydsende OS-persistens under runtime-broker-navne
Når Python-pakken er installeret, registrerer scriptet en automatisk startpost under et forskelligt navn på hvert operativsystem:
- Linux — en systemd-brugerenhed på ~/.config/systemd/bruger/python3-dbus-hjælper.serviceEnhedens Beskrivelse is Python D-Bus Runtime Helper. Scriptet forsøger også at aktivere det via systemctl –brugeraktivering, og går tilbage til et manuelt symbolsk link under standard.mål.ønsker/ når systemctl fejler. Hvis det kører under sudo, skifter scriptet til sudo -u systemctl –bruger, med XDG_RUNTIME_DIR indstil så brugerbuskaldet fungerer.
- MacOS — en LaunchAgent-plist på ~/Bibliotek/LaunchAgents/com.apple.python.runtime.plist med KørVedIndlæsning=sand og Hold i live=sandog derefter indlæst via launchctl-indlæsning.
- Windows — en planlagt opgave ved navn PyRuntimeBroker, udløst AtLogOn, med en udførelsestidsgrænse på nul (dvs. ingen timeout), registreret via PowerShell.
Alle tre navne er umiddelbart troværdige. python3-dbus-hjælper følger navngivningskonventionen for legitim Python-D-Bus-integration på Linux-desktops. com.apple.python.runtime efterligner Apples reverse-DNS-mærkning for sine egne tjenester. PyRuntimeBroker afspejler Windows' RuntimeBroker.exe — en ægte, signeret Microsoft-tjeneste, der formidler tilladelsesanmodninger til UWP-apps. Ingen af disse er ægte Apple/Microsoft/Python-tjenester i denne sammenhæng, men en forsvarer, der laver en hurtig visuel scanning af systemctl –brugerliste-enheder or Get-planlagt opgave er usandsynligt at blinke.
Fase 3 — Udklipsholderkapreren
Python-nyttelasten, installeret kl. udklipsholder/guardian.py, kører et uendeligt loop, der afspørger systemets udklipsholder hvert 400 millisekund. Ved hvert tick henter den det aktuelle indhold af udklipsholderen via pyperclip.paste() og kører dem mod en liste med over fyrre prækompilerede regulære udtryk, der dækker wallet-adresseformater for 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 og adskillige andre, der er stubbet, men tomme i standardkonfigurationen (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin).
Når et match lander, læser scriptet angriberens adresse for den pågældende kæde fra ~/.config/udklipsholder-guardian/config.json (eller dens platformækvivalenter) og overskriver udklipsholderen med den erstattede tekst:
Der er ingen netværksbeacon. Clipperen ringer ikke hjem, registrerer ikke inficerede værter og eksfiltrerer ikke noget. Eksfiltreringen er selve substitutionen: når en bruger kopierer en modtageradresse fra sin tegnebogs-brugergrænseflade og indsætter den i en afsendelsesdialog, tilhører den indsatte adresse operatøren. Pengene går tabt i båndet, transparent for brugeren.
Hvad er nyt her
Et par detaljer skiller sig ud sammenlignet med den generiske kryptoklipper-skabelon:
1. npm → Python-krydsning. De fleste kryptoklippere, vi ser i npm, er ren JavaScript, ofte tilsløret med _0x arrayrotation eller eval(atob(…)) stakke. Dette eksempel bruger npm tarball som intet andet end en leveringsindpakning til en Python-pakke — ren Python — og lader pip håndtere afhængighedsinstallation (pyperclip, psutil, Valgfri sætproctitle) deklareret i den medfølgende pyproject.tomlDer er ingen JavaScript-forvirring at omgå. Selve klipperen er almindelig, læsbar Python.
2. Tri-OS-persistensmærkater valgt ud fra sandsynlighed. Mange installationsprogrammer på tværs af platforme registrerer persistens under generiske navne (opdateringstjeneste, hjælper.plist). Dette eksempel gør sig umagen ved at vælge etiketter, der ligner platform-native runtime-brokere på hvert operativsystem. Navngivningen er det eneste forsøg på stealth - der er ingen rootkit, ingen brugerland-skjuling, ingen sti-forvirring. Væddemålet er, at forsvarere sjældent reviderer ~/.config/systemd/bruger/ og at en tjeneste ved navn python3-dbus-hjælper vil ikke skille sig ud i en tilfældig anmeldelse.
3. Procestitel-forklædning er reel, men antianalyse er i dvale. Python-nyttelasten definerer en _disguise_process() funktion, der angiver procestitlen via sætproctitle (Linux/macOS) eller SætKonsoltitelW (Windows) — og main () kalder det. Så ps aux vil vise python3-dbus-hjælper i stedet for python3 …/guardian.pyDet samme modul definerer dog en kører_monitor() funktion, der opregner kendte procesovervågningsværktøjer (htop, btop, Jobliste, Aktivitetsovervågning, Process Hacker, Ressourceovervågning, GNOME / KDE / Xfce / MATE systemovervågninger osv.) — og main () kalder den aldrig. Substitutionsløkken kører ubetinget, uanset om brugeren har en procesovervågning åben eller ej. Funktionen er død kode i den leverede version. Det er højst sandsynligt en rest fra en tidligere iteration eller et stillads for en funktion, der endnu ikke er installeret. Uanset hvad er den publicerede nyttelasts anti-analyseoverflade én procestitel-omdøbning, ikke aktiv overvågningsundgåelse.
4. Den medfølgende konfigurationsfletningsadfærd. npm-install.js skriver standard tegnebogslisten til ~/.config/udklipsholder-guardian/config.json og, hvis en konfigurationsfil allerede findes, fletter alle nøgler ind, hvis eksisterende værdi er tom. Det betyder en bruger, der tidligere er blevet inficeret og delvist har renset konfigurationen - f.eks. ved at tømme ethereum værdi — vil få den genudfyldt ved hver efterfølgende installation af skadelig pakke. Der er ingen oprydning af persistensfilen i nogen kodesti.
| Dato/tid (UTC) | Begivenhed |
|---|---|
2026-05-21 18:50:32 | @jaggle/resizeobserves@1.0.0 offentliggjort. |
2026-05-21 19:55:55 | 1.0.1 udgivet — første version markeret ved ekstern scanning. |
2026-05-21 19:58:10 | 1.0.2 offentliggjort. |
2026-05-21 20:05:03 | 1.0.3 offentliggjort. |
2026-05-21 20:09:24 | 1.0.4 offentliggjort. |
2026-05-21 20:13:48 | 1.0.5 offentliggjort. |
2026-05-21 20:41:52 | 1.0.6 offentliggjort. |
2026-05-21 20:43:56 | 1.0.7 udgivet — tilføjer en try/catch indpakning omkring skrivetrinnet til wallet-config i npm-install.js. |
2026-05-21 20:46:15 | 1.0.8 udgivet — installationsprogrammet omdøbt npm-install.js → npm-install.cjs (byte-identisk indhold). |
2026-05-22 | Domme og IOC'er er offentliggjort. Versioner findes stadig i registret på offentliggørelsestidspunktet (igangværende). |
Ni versioner på en time og seksoghalvtreds minutter er hurtigt, selv for en typosquat. Mønsteret stemmer overens med en publicer-og-brænd-kampagne — oversvømme registreringsdatabasen under ét handle, lade detekteringen gå sin gang, og flyt til et nyt handle, når en enkelt version er fjernet. De synlige deltaer på tværs af kørslen er kosmetiske: 1.0.1 tilføjet eksplicit /usr/bin/pip3-style-stier til pip-søgelisten (sudo-kompatibilitet), 1.0.7 indpakkede wallet-config-skrivningen i en try/catch, og 1.0.8 omdøbte installationsprogrammet fra . Js til .cjs samtidig med at indholdet forbliver byte-identisk. .cjs Omdøb spor med npm-advarsler om tvetydig modulopløsning i pakker uden en eksplicit "type" feltet, og kan være et forsøg på at undertrykke støj under installationen, der kunne tiltrække opmærksomhed. Python-nyttelasten - den eneste del, der rent faktisk stjæler - er uændret på tværs af alle ni versioner.
Indikatorer for kompromis
Pakker
| Ecosystem | Pakke | versioner | Status |
|---|---|---|---|
| NPM | @jaggle/resizeobserves | 1.0.0 ved 1.0.8 | Live ved udgivelse; fjernelse anmodet. |
Filer og hashes
| Sti | Noter |
|---|---|
clipboard_guardian/guardian.py(md5 f7935c2c82bc881288611ab6cd634f17) | Identisk på tværs af alle ni udgivne versioner (1.0.0 ved 1.0.8). Clipperens nyttelast. |
npm-install.js (1.0.0 – 1.0.7)npm-install.cjs (1.0.8) | Persistensinstallationsprogram; samme end-to-end-adfærd. 1.0.7's .js og 1.0.8's .cjs er byte-identiske. |
~/.config/clipboard-guardian/config.json | Linux persistenskonfiguration og wallet-pakke. |
~/Library/Application Support/clipboard-guardian/config.json | macOS persistenskonfiguration og wallet-pakke. |
%APPDATA%\clipboard-guardian\config.json | Windows-persistenskonfiguration og tegnebogspakke. |
~/.config/systemd/user/python3-dbus-helper.service | Linux autostart-persistens. |
~/Library/LaunchAgents/com.apple.python.runtime.plist | macOS LaunchAgent-persistens. |
~/Library/Logs/com.apple.python.runtime.log | macOS stdout/stderr-log for agenten. |
Scheduled Task PyRuntimeBroker | Windows automatisk startopgave (AtLogOn, ingen timeout). |
Adfærdsindikatorer
| Signal | Beskrivelse |
|---|---|
pip install --break-system-packages fra npm postinstall | Tvinger Python-installation på hele webstedet frem, hvorved PEP 668-beskyttelse omgås. |
apt-get install -y xclip (eller pacman/dnf) | Installerer udklipsholderværktøjer på Linux under pakkeinstallation. |
python3-dbus-helper.service systemd brugerenhed | Persistens registreret under et plausibelt udseende runtime-helper-navn. |
com.apple.python.runtime LaunchAgent | Persistensmærkat uden for legitime Apple-systemstier. |
PyRuntimeBroker Planlagt opgave | Falsk Windows runtime broker-persistens uden legitim installationskilde. |
Python-proces med titlen python3-dbus-helper importere pyperclip og psutil | Adfærdsmæssig uoverensstemmelse mellem vist procesnavn og importerede biblioteker. |
| Ændringer i udklipsholderen ~0.4 sekunder efter kopiering af tegnebogsadresse | Signaturadfærd ved udskiftning af kryptovalutaadresser. |
Pakke med angriber-pung (liste over forsvarssøgende)
Tegnebogslisten sendes hardkodet i npm-install.js og udklipsholder/guardian.pyForsvarere kan bruge listen som både en blokeringsliste (behandl enhver overførsel til disse adresser fra virksomhedens tegnebøger som mistænkelig) og en jagtnøgle (behandl tilstedeværelsen af en af disse strenge i en uautoriseret konfigurationsfil, build-artefakt eller udviklermaskine som en infektionsindikator).
Attacker Wallet-pakke
| Kæde | Adresse |
|---|---|
| Ethereum / BSC | 0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Ronin (EVM) | ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Bitcoin | bc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y |
| Bitcoin Cash | bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt |
| Litecoin | ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe |
| dogecoin | DNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy |
| Dash | XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS |
| Zcash | t1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M |
| DigiByte | DPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH |
| Monero | 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf |
| Solana | DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5 |
| TRON | TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2 |
| TON | UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr |
| Ripple | r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H |
| Polka prik | 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG |
| NEAR | 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364 |
| kosmos | cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e |
| osmose | osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t |
| Celestia | celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5 |
| injektiv | inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh |
| Kava | kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux |
| Harmoni | one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a |
| Jorden | terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x |
| Algorand | XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI |
| Stellar | GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE |
| Cardano | addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f |
| MultiverseX | erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0 |
| Aptos | 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e |
| sui | 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78 |
| Nano | nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn |
| Filecoin | f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui |
| Tezos | tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk |
| Ergo | 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA |
| Hedera | 0.0.10488092 |
Kæder med regex-dækning, men tomme wallet-pladser i standardkonfigurationen — Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB — er ikke aktivt substituerede i denne build, men detekteres. Behandl dem som overvågningsområdet snarere end substitutionsområdet.
Attribuering og motivation
Kampagnen tilbyder en tynd attributionsflade. Vi har ikke været i stand til at bekræfte operatørens identitet. Hvad vi kan registrere:
- Udgiverens metadata. npm-kontoen jaggle angiver sin e-mail som olgascarlet@deltajohnsons.comDomænet deltajohnsons.com løser ikke en virksomhedsidentitet, vi kan verificere. npm-kontoen viser ingen e-mailbekræftelse og ingen SCM verifikation. Der er ingen tilknyttet offentlig GitHub-tilstedeværelse.
- Felt for arkiv. pakke.json bærer ingen Repository felt. Det legitime npm:@jonglere/ændre størrelse-observatør peger på et rigtigt GitHub-arkiv med tusindvis af stjerner og aktive problemer. Fraværet af et link til arkivet er den hurtigste visuelle indikator på npm-brugergrænsefladen.
- README-plagiering. Pakken README er den legitime @jongler/ændre størrelse-observatør README byte-for-byte, inklusive importere eksempler, der refererer @jongler/ændre størrelse-observatør selve (ikke udgivelsespakken). Operatøren gad ikke engang omskrive importfilen — et almindeligt signal om, at readme-filen blev fjernet, ikke tilpasset.
- Ingen infrastruktur at vende sig efter. Der er intet C2-slutpunkt, intet DNS-opslag, ingen IP-adresse. Den ondsindede adfærd er fuldt indkapslet i den lokale clipper plus den hardcodede wallet-pakke. Dette gør domæne- eller ASN-baseret pivotering utilgængelig. Forsvarere, der pivoterer på tværs af kampagner, bør hash-matche wallets mod enhver tidligere clipper, de har på fil; genbrug af en wallet på tværs af pakker er det mest håndterbare link på tværs af kampagner.
- Valg af navngivning. @jaggle/resizeobserves er én karakter væk fra @jongler og én bøjning væk fra den velkendte resize-observatørDen kombinerede redigeringsafstand er to glyffer. Dette er en bevidst visuel kollision, ikke en generisk squat.
Motivation, baseret på nyttelastadfærd: ren monetarisering gennem opportunistisk udklipsholdersubstitution. Der er ingen indsamling af legitimationsoplysninger, ingen fingeraftryk fra værten, ingen aflæsning af miljøvariabler. Operatøren er ligeglad med, hvem offeret er - de er interesserede i, at offerets næste overførsel peger på en af de anførte adresser. Dækningen med fyrre kæder er lotterimodellen i aktion: kast bredt, håb om, at en enkelt højværdi-paste lander én gang pr. N installationer.
Operatøren virker ligeglad med fjernelse. At udgive ni versioner inden for to timer under samme omfang lyder som en publicer-og-brænd-handle: maksimer registreringsdatabasens fodaftryk, før fjernelseslatensen indhenter, og fortsæt derefter. Vi har ikke observeret @jaggle genudgiver under et nyt omfang i skrivende stund, men vi forventer lignende omfang (@jaggie, @jongler-, @joggle) vil blive vist i løbet af de kommende dage, hvis operatøren stadig er aktiv.
Indvirkning, tendenser og hvad forsvarere bør gøre
Impact
Det er ikke muligt at kvantificere effekten i rigtige penge ud fra det nuværende datasæt. Clipperen skriver ingen telemetri, og tegnebøgerne er endnu ikke observeret modtagende substituerede overførsler ved analysens grænse (en opfølgende undersøgelse af de anførte kæder er på vores liste). npm:@jonglere/ændre størrelse-observatør ligger i gennemsnit på syvcifrede ugentlige downloads – et typosquat-mål med høj trafik – og den ondsindede pakke var live i under 24 timer på tidspunktet for afsløringen, hvilket begrænser den eksponerede population, men ikke nulstiller den.
Sprængningsradiusen, der er værd at spore, er ikke direkte downloads af @jaggle/resizeobserves — de er sandsynligvis små. Det er **transitive installationer**: en udvikler tilføjer pakken til et sandkasseprojekt, der kører npm installere, og så glemmer man at installations-hook'en nogensinde har kørt. Hver maskine, der behandlede postinstallationen, har nu en brugervenlig hijacker ved automatisk start af udklipsholderen, uanset om projektet stadig er på disken. Fjerner pakkemappen fra node_modules fjerner **ikke** persistensen.
Nye mønstre
To tendenser, som denne kampagne eksemplificerer.
npm som en Python-payload-leveringswrapper. npm tarball er et installationsprogram med 4 linjer; den egentlige stjæler er Python, installeret på hele systemet af pip fra den medfølgende mappe. Dette er ikke nyt - vi har set npm-pakker droppe Python før - men det er ved at blive en målbart mere almindelig form på tværs af krypto-klippemaskinekampagner. Fordelen for operatøren er dobbelt: Python-klippemaskinebiblioteker (pyperclip (først blandt dem) er renere og mere tværplatformede end JavaScript-ækvivalenterne, og De fleste automatiserede npm-scannere vægter JavaScript-filer og Python tungt .py bundter let. Omkostningerne er, at installationsaftrykket er meget støjende — en frisk pip installation er svært at skjule på en udviklermaskine, der normalt ikke pip installation i løbet af npm installere.
Platform-native navne som den eneste stealth. Adskillige nylige clippers og små-nyttelast-stjælere har helt droppet obfuskation på kodeniveau til fordel for legitimt udseende persistensetiketter. python3-dbus-hjælper, com.apple.python.runtimeog PyRuntimeBroker er lærebogseksempler – navne, som en forsvarers øje vil springe over på en liste med fyrre brugertjenester. Dette er en billig, holdbar form for stealth: nedtagning sker pr. pakke, men persistensfilerne overlever nedtagningen, og en tjeneste opkaldt efter en platformkomponent, der ser rigtig ud, vil ikke blive ryddet op ved andet end en eksplicit revision.
Hvad forsvarere bør gøre
- Revision ~/.config/systemd/user/, ~/Library/LaunchAgents/ og Get-ScheduledTask output på udviklermaskiner for de poster, der er angivet i IOC'er. Fjernelse af npm-pakken lader disse være på plads; de skal fjernes manuelt.
- Bloker overførsler til de angivne tegnebogsadresser ved grænser mellem virksomheds-, finans- og DeFi-wallet-kontorer, hvor adressetilladelsesliste er tilgængelig.
- Søg efter ~/.config/clipboard-guardian/config.json (og platformækvivalenter) på tværs af udvikler-maskineflåden. Tilstedeværelsen af filen er en højkonfidensinfektion uanset hvilken pakkeversion den leverede.
- Søg i node_modules/ efter clipboard_guardian/guardian.py i build-cache-snapshots, der muligvis er fra før fjernelsen. Filens md5 er stabil på tværs af alle gennemgåede versioner.
- Låsfil-pin @jongle/resize-observatør (den legitime pakke), så fremtidige installationer ikke kan omdannes til noget andet under en fejltype på ét tegn, især i arbejdsgange uden låsefiler som f.eks. NPX.
- Behandl enhver npm postinstall, der kalder pip install som høj alvorlighedsgrad i bygge-pipeline politik. Der er ingen legitim grund til, at en npm-pakke skal have brug for pip ved installationstidspunktet — Python-værktøj distribuerer Python-værktøj.
- Søg efter process_iter()-sammenlignbare overvågningsdata for processer med navnet python3-dbus-helper, der importerer pyperclip — forklædningsmismatchen (D-Bus-hjælper, der indeholder et udklipsholderbibliotek) er den reneste adfærdsindikator, vi har.
- Roter tegnebogsadresser indsat fra inficerede maskiner. En udklipsholder-kaprer kompromitterer stien mellem en tegnebogs brugergrænseflade og et indsætningsmål; adresser, der kopieres, mens de er inficerede, kan ændres i stilhed. Alt, der sendes inden for infektionsvinduet, bør behandles som potentielt vildledt.
Konklusionen er: Vedholdenhed overlever fjernelse. Registreringsdatabasen vil til sidst fjerne @jaggle/resizeobserves I alle ni versioner fjernes systemd-enheden, LaunchAgent og den planlagte opgave ikke af sig selv.
Referencer
- @jongler/resize-observatør på npm — den legitime pakke, som denne typosquat efterligner; nyttig som en basislinje for byte-for-byte README-plagiat.
- @jaggle/resizeobserves registreringsdatabase metadata — offentliggør tidsstempler for de ni ondsindede versioner, nyttigt til retsmedicinsk tidslinje.





