TL; DR
21.05.2026, npm-utgiveren jaggle utgitt ni versjoner (1.0.0 gjennom 1.0.8) av @jaggle/resizeobserves i et vindu på omtrent to timer.
Pakken er en typosquat av det legitime @juggle/resize-observer polyfill – en mye brukt pakke med millioner av ukentlige nedlastinger – men som ikke leverer noen faktisk ResizeObserver-implementering.
I stedet er pakkens postinstall-krok installerer en medfølgende Python-nyttelast, registrerer persistens som en plattformbasert runtime-megler og distribuerer en plattformuavhengig utklippstavlkaprer som retter seg mot kryptovalutatransaksjoner.
Linux utholdenhet fremstår som python3-dbus-helper, macOS as com.apple.python.runtimeog Windows as PyRuntimeBroker.
Nyttelasten overvåker kontinuerlig utklippstavlen for lommebokadresser på tvers mer enn 40 blokkjeder og erstatter lydløst kopierte adresser med angriperkontrollerte lommebøker.
Skadevaren opererer helt lokalt uten utgående C2-infrastruktur, noe som gjør utklippstavlens erstatning til selve eksfiltreringsmekanismen.
Den primære IOC-en er selve pakkenavnet: @jaggle/resizeobserves — legg merke til den utelatte vokalen i «jaggle» og den tilføydne «s» i «resizeobserves».
Alvorlighetsgrad: høy.
Angrepet: Hvordan det fungerer
npm:@jaggle/resizeobserves ser ikke ut som skadelig programvare på en tilfeldig måte npm-visning. Dens README.md er den ordrette README-filen til npm:@jonglere/endre størrelse-observatør — samme kodeeksempler, samme bruksanvisninger, samme importer { ResizeObserver } fra '@juggle/resize-observer' referanser overalt. Plagiatet er så omfattende at alle som ser på dokumentasjonen ville anta at de leser dokumentasjonen til den legitime pakken.
Ocuco pakke.json, derimot, er sparsom: nei Repository felt, en enkelt bin inngang peker mot bin/utklippstavle-guardian.jsOg etterinstallasjon skript som kjører node npm-install.jsREADME-filens eksempler på «grunnleggende bruk» refererer til en JavaScript-implementering som ikke finnes noe sted i tarballen. Den eneste JavaScript-filen i pakken er installasjonsskriptet.
Trinn 1 — npm postinstall bootstrapper en Python-nyttelast
npm-install.js er plattformbevisst. Den lokaliserer en pip kjørbar langs en fast søkesti (/usr/bin/pip3, /usr/local/bin/pip, faller tilbake til python3 -m pip), installerer den medfølgende Python-pakken fra tarball-katalogen, og – på Linux – henter inn xclip or xsell av apt-get, pacmaneller DNF hvis ingen av dem allerede er til stede:
Bruken av –break-system-pakker er bevisst: moderne Linux-distribusjoner leverer Python med PEP 668s markør for eksternt administrert miljø aktivert, som blokkerer nettstedsomfattende pip-installasjoner som standard. Installasjonsskriptet tvinger installasjonen gjennom.
Skriptet er også sudo-bevisst. Når den kjørende uid-en er resultatet av en sudo npm installasjon, leser manuset SUDO_USER og punger ut til få passord å finne ekte brukerens hjemmekatalog, og skriver deretter persistensfilene dit i stedet for inn i / RootPersistens er per bruker, ikke systemomfattende.
Fase 2 – Kryss-OS-persistens under runtime-meglernavn
Etter at Python-pakken er installert, registrerer skriptet en automatisk startoppføring under et annet navn på hvert operativsystem:
- Linux — en systemd-brukerenhet på ~/.config/systemd/bruker/python3-dbus-hjelper.tjeneste. Enhetens Tekniske beskrivelser is Python D-Bus Runtime HelperSkriptet prøver også å aktivere det via systemctl –brukeraktivering, og går tilbake til en manuell symbolsk lenke under standard.mål.ønsker/ når systemctl feiler. Hvis det kjøres under sudo, bytter skriptet til sudo -u systemctl –brukermed XDG_RUNTIME_DIR angi slik at brukerbusskallet fungerer.
- macOS — en LaunchAgent-plist på ~/Bibliotek/LaunchAgents/com.apple.python.runtime.plist med KjørVedLoad=true og KeepAlive=sann, deretter lastet inn via launchctl-lasting.
- Windows — en planlagt oppgave kalt PyRuntimeBroker, utløst AtLogOn, med en utførelsestidsgrense på null (dvs. ingen timeout), registrert via PowerShell.
Alle tre navnene er troverdige ved første øyekast. python3-dbus-hjelper følger navnekonvensjonen for legitim Python-D-Bus-integrasjon på Linux-skrivebord. com.apple.python.runtime etterligner Apples omvendte DNS-merking for sine egne tjenester. PyRuntimeBroker gjenspeiler Windows sin RuntimeBroker.exe — en ekte, signert Microsoft-tjeneste som formidler tillatelsesforespørsler for UWP-apper. Ingen av disse er ekte Apple/Microsoft/Python-tjenester i denne sammenhengen, men en forsvarer som gjør en rask visuell skanning av systemctl –brukerlisteenheter or Get-ScheduledTask er usannsynlig å rykke til.
Fase 3 – Kapreren av utklippstavlen
Python-nyttelasten, installert på utklippstavle_verge/verge.py, kjører en uendelig løkke som avspør systemets utklippstavle hvert 400. millisekund. Ved hvert hakk henter den innholdet i gjeldende utklippstavle via pyperclip.paste() og kjører dem mot en liste med over førti forhåndskompilerte regulære uttrykk som dekker lommebokadresseformater 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 flere andre som er stubbet, men tomme i standardkonfigurasjonen (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin).
Når en match lander, leser skriptet angriperens adresse for den kjeden fra ~/.config/utklippstavle-verge/config.json (eller dens plattformekvivalenter) og overskriver utklippstavlen med den erstattede teksten:
Det finnes ingen nettverksfyr. Klipperen ringer ikke hjem, registrerer ikke infiserte verter, og eksfiltrerer ikke noe. Eksfiltreringen er selve substitusjonen: når en bruker kopierer en mottakeradresse fra lommebokens brukergrensesnitt og limer den inn i en sendedialog, tilhører den innlimte adressen operatøren. Midlene går tapt i båndet, transparent for brukeren.
Hva er nytt her
Noen få detaljer skiller seg ut sammenlignet med den generiske kryptoklippermalen:
1. npm → Python-kryssning. De fleste kryptoklipperne vi ser i npm er ren JavaScript, ofte tilslørt med _0x matriserotasjon eller eval(atob(…)) stabler. Dette eksemplet bruker npm-tarballen som ikke noe mer enn en leveringspakke for en Python-pakke – ren Python – og lar pip håndtere avhengighetsinstallasjon (pyperclip, psutil, Valgfri settproctitle) erklært i den medfølgende pyproject.tomlDet er ingen JavaScript-forvirring å omgå. Selve klipperen er enkel og lesbar Python.
2. Tri-OS-persistensetiketter valgt for plausibilitet. Mange plattformuavhengige installasjonsprogrammer registrerer persistens under generiske navn (oppdateringstjeneste, hjelper.plist). Dette eksemplet tar seg bryet med å velge etiketter som ligner plattformnative runtime-brokere på hvert operativsystem. Navngivningen er det eneste forsøket på stealth – det er ingen rootkit, ingen skjuling av brukerland, ingen sti-tilsløring. Veddemålet er at forsvarere sjelden reviderer ~/.config/systemd/bruker/ og at en tjeneste som heter python3-dbus-hjelper vil ikke skille seg ut i en tilfeldig anmeldelse.
3. Prosesstittel-forkledning er reell, men antianalyse er sovende. Python-nyttelasten definerer en _disguise_process() funksjon som setter prosesstittelen via settproctitle (Linux/macOS) eller AngiKonsolltittelW (Windows) — og main () kaller det. Så ps til Vil vise seg python3-dbus-hjelper istedenfor python3 …/guardian.pyDen samme modulen definerer imidlertid en kjører_monitor() funksjon som lister opp kjente prosessovervåkingsverktøy (htop, btop, Oppgavebehandling, Aktivitetsmonitor, Prosess hacker, Ressursmonitor, GNOME / KDE / Xfce / MATE systemmonitorer, og så videre) — og main () kaller den aldri. Substitusjonsløkken kjører ubetinget, enten brukeren har en prosessmonitor åpen eller ikke. Funksjonen er død kode i den leverte versjonen. Den er mest sannsynlig en rest fra en tidligere iterasjon, eller et stillas for en funksjon som ennå ikke er koblet opp. Uansett er den publiserte nyttelastens anti-analyseoverflate én prosesstittel-omdøping, ikke aktiv monitor-unngåelse.
4. Den medfølgende konfigurasjonssammenslåingsvirkemåten. npm-install.js skriver standard lommeboklisten til ~/.config/utklippstavle-verge/config.json og, hvis en konfigurasjonsfil allerede finnes, fletter inn alle nøkler med en tom verdi. Det betyr en bruker som tidligere har blitt infisert og delvis har ryddet opp i konfigurasjonen – for eksempel ved å tømme ethereum verdi — vil få den utfylt på nytt ved hver påfølgende installasjon av skadelig pakke. Det er ingen opprydding av persistensfilen i noen kodebane.
| Dato/klokkeslett (UTC) | Event |
|---|---|
2026-05-21 18:50:32 | @jaggle/resizeobserves@1.0.0 publisert. |
2026-05-21 19:55:55 | 1.0.1 publisert – første versjon flagget av ekstern skanning. |
2026-05-21 19:58:10 | 1.0.2 publisert. |
2026-05-21 20:05:03 | 1.0.3 publisert. |
2026-05-21 20:09:24 | 1.0.4 publisert. |
2026-05-21 20:13:48 | 1.0.5 publisert. |
2026-05-21 20:41:52 | 1.0.6 publisert. |
2026-05-21 20:43:56 | 1.0.7 publisert – legger til en try/catch innpakning rundt skrivetrinnet for lommebokkonfigurasjon i npm-install.js. |
2026-05-21 20:46:15 | 1.0.8 publisert – installatøren har fått nytt navn npm-install.js → npm-install.cjs (byte-identisk innhold). |
2026-05-22 | Dommer og IOC-er publisert. Versjoner finnes fortsatt i registeret på publiseringstidspunktet (pågående). |
Ni versjoner på én time og femtiseks minutter er raskt selv for en typosquat. Mønsteret er i samsvar med en publiser-og-brenn-kampanje — fyll registeret under ett referansenummer, la deteksjonen gå sin gang, og flytt til et nytt referansenummer når én enkelt versjon er fjernet. De synlige deltaene på tvers av kjøringen er kosmetiske: 1.0.1 lagt til eksplisitt /usr/bin/pip3-style-stier til pip-søkelisten (sudo-kompatibilitet), 1.0.7 pakket inn wallet-config-skrivingen i en try/catch, og 1.0.8 omdøpte installasjonsprogrammet fra . Js til .cjs samtidig som innholdet holdes byte-identisk. .cjs gi spor nytt navn med npm-advarsler om tvetydig moduloppløsning i pakker uten en eksplisitt "type" feltet, og kan være et forsøk på å undertrykke støy under installasjon som kan tiltrekke seg oppmerksomhet. Python-nyttelasten – den eneste delen som faktisk stjeler – er uendret på tvers av alle ni versjoner.
Indikatorer for kompromiss
Nettsidepakker
| Økosystem | Pakke | versjoner | status |
|---|---|---|---|
| NPM | @jaggle/resizeobserves | 1.0.0 gjennom 1.0.8 | Direkte ved publisering; fjerning forespurt. |
Filer og hasher
| Sti | Merknader |
|---|---|
clipboard_guardian/guardian.py(md5 f7935c2c82bc881288611ab6cd634f17) | Identisk på tvers av alle ni publiserte versjoner (1.0.0 gjennom 1.0.8). Clipper-nyttelasten. |
npm-install.js (1.0.0 – 1.0.7)npm-install.cjs (1.0.8) | Persistensinstallasjonsprogram; samme ende-til-ende-oppførsel. 1.0.7's .js og 1.0.8's .cjs er byte-identiske. |
~/.config/clipboard-guardian/config.json | Linux persistenskonfigurasjon og lommebokpakke. |
~/Library/Application Support/clipboard-guardian/config.json | macOS-persistenskonfigurasjon og lommebokpakke. |
%APPDATA%\clipboard-guardian\config.json | Windows-persistenskonfigurasjon og lommebokpakke. |
~/.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-logg for agenten. |
Scheduled Task PyRuntimeBroker | Windows automatisk startoppgave (AtLogOn, ingen timeout). |
Atferdsindikatorer
| Signal | Tekniske beskrivelser |
|---|---|
pip install --break-system-packages fra npm etterinstallasjon | Tvinger frem Python-installasjon på hele nettstedet og omgår PEP 668-beskyttelse. |
apt-get install -y xclip (eller pacman/dnf) | Installerer utklippstavlverktøy på Linux under pakkeinstallasjon. |
python3-dbus-helper.service systemd brukerenhet | Persistens registrert under et plausibelt utseende runtime-helper-navn. |
com.apple.python.runtime LaunchAgent | Persistensetikett utenfor legitime Apple-systemstier. |
PyRuntimeBroker Planlagt oppgave | Falsk Windows runtime broker-persistens uten legitim installasjonskilde. |
Python-prosess med tittelen python3-dbus-helper importere pyperclip og psutil | Atferdsmessig avvik mellom vist prosessnavn og importerte biblioteker. |
| Endringer i utklippstavlen ~0.4 sekunder etter kopiering av lommebokadresse | Signaturoppførsel for erstatning av kryptovalutaadresse. |
Pakke med angriperlommebøker (liste over forsvarssøkere)
Lommeboklisten sendes hardkodet i npm-install.js og utklippstavle_verge/verge.pyForsvarere kan bruke listen både som en blokkeringsliste (behandle enhver overføring til disse adressene fra bedriftslommebøker som mistenkelig) og en jaktnøkkel (behandle tilstedeværelsen av noen av disse strengene i en uautentisert konfigurasjonsfil, byggeartefakt eller utviklermaskin som en infeksjonsindikator).
Attacker Wallet-pakke
| Kjede | 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 |
| Polkadot | 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG |
| NEAR | 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364 |
| Kosmos | cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e |
| Osmosis | osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t |
| Celestia | celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5 |
| injektiv | inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh |
| Kava | kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux |
| Harmony | one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a |
| Earth | 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 |
Kjeder med regex-dekning, men tomme lommebokplasser i standardkonfigurasjonen – Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB – er ikke aktivt byttet ut i denne byggingen, men blir oppdaget. Behandle dem som overvåkingsområde snarere enn substitusjonsområde.
Attribusjon og motivasjon
Kampanjen tilbyr en tynn attribusjonsflate. Vi har ikke klart å bekrefte operatørens identitet. Hva vi kan registrere:
- Utgiverens metadata. npm-kontoen jaggle oppgir e-postadressen sin som olgascarlet@deltajohnsons.com. Domenet deltajohnsons.com løser ikke opp til en bedriftsidentitet vi kan bekrefte. npm-kontoen viser ingen e-postbekreftelse og ingen SCM verifisering. Det er ingen tilknyttet offentlig GitHub-tilstedeværelse.
- Repository-felt. Ocuco pakke.json bærer ingen Repository felt. Det legitime npm:@jonglere/endre størrelse-observatør peker på et ekte GitHub-repository med tusenvis av stjerner og aktive problemer. Fraværet av en repository-lenke er den raskeste visuelle indikatoren på npm-grensesnittet.
- README-plagiering. Pakken README er den legitime @jongler/resize-observatør README byte-for-byte, inkludert importere eksempler som refererer @jongler/resize-observatør selve (ikke publiseringspakken). Operatøren gadd ikke engang å omskrive importfilene – et vanlig signal om at readme-filen ble fjernet, ikke tilpasset.
- Ingen infrastruktur å snu seg etter. Det finnes ikke noe C2-endepunkt, ingen DNS-oppslag, ingen IP-adresse. Den ondsinnede oppførselen er fullstendig innkapslet i den lokale clipperen pluss den hardkodede lommebokpakken. Dette gjør domene- eller ASN-basert pivotering utilgjengelig. Forsvarere som pivoterer på tvers av kampanjer bør hash-matche lommebøkene mot alle tidligere clippere de har registrert. Gjenbruk av en lommebok på tvers av pakker er den mest håndterbare koblingen på tvers av kampanjer.
- Valg av navn. @jaggle/resizeobserves er én karakter unna @sjongler og én bøyning av den velkjente resize-observatørDen kombinerte redigeringsavstanden er to tegn. Dette er en bevisst visuell kollisjon, ikke en generisk knebøy.
Motivasjon, forankret i nyttelastens atferd: ren monetarisering gjennom opportunistisk utklippstavlersubstitusjon. Det er ingen innhenting av legitimasjonsinformasjon, ingen fingeravtrykk fra verten, ingen avlesning av miljøvariabler. Operatøren bryr seg ikke om hvem offeret er – de bryr seg om at offerets neste overføring peker på en av de oppførte adressene. Førti-kjededekningen er lotterimodellen i aksjon: kast bredt, håp om at en enkelt høyverdig lime lander én gang per N installasjoner.
Operatøren virker likegyldig til fjerningen. Å publisere ni versjoner innen to timer under samme omfang leses som en publiser-og-brenn-håndtak: maksimer registeravtrykket før fjerningsforsinkelsen tar igjen, og gå deretter videre. Vi har ikke observert @jaggle publiserer på nytt under et nytt omfang i skrivende stund, men vi forventer lignende omfang (@jaggie, @sjongler-, @joggle) skal vises i løpet av de kommende dagene hvis operatøren fortsatt er aktiv.
Innvirkning, trender og hva forsvarere bør gjøre
Impact
Det er ikke mulig å kvantifisere effekten i ekte penger fra det nåværende datasettet. Clipperen skriver ingen telemetri, og lommebøkene er ennå ikke observert som mottar substituerte overføringer ved analysefristen (en oppfølgingsundersøkelse av de listede kjedene er på listen vår). Den legitime npm:@jonglere/endre størrelse-observatør ligger i gjennomsnitt på godt syvsifrede ukentlige nedlastinger – et typosquat-mål med høy trafikk – og den skadelige pakken var aktiv i under 24 timer på tidspunktet for avsløringen, noe som begrenser den eksponerte populasjonen, men ikke nullstiller den.
Eksplosjonsradiusen som er verdt å spore er ikke direkte nedlastinger av @jaggle/resizeobserves — de er sannsynligvis små. Det er **transitive installasjoner**: en utvikler legger til pakken i et sandkasseprosjekt, kjører npm installasjon, og så glemmer man at installasjonskroken noen gang har kjørt. Hver maskin som behandlet etterinstallasjonen har nå en utklippstavlskapskaprer per bruker ved automatisk oppstart, uavhengig av om prosjektet fortsatt er på disk. Fjerner pakkekatalogen fra node_modules fjerner **ikke** persistensen.
Fremvoksende mønstre
To trender denne kampanjen eksemplifiserer.
npm som en Python-nyttelastleveringswrapper. npm tarball er et installasjonsprogram med fire linjer; den faktiske stjeleren er Python, installert på hele systemet av pip fra den medfølgende katalogen. Dette er ikke nytt – vi har sett npm-pakker droppe Python før – men det blir en målbart mer vanlig form på tvers av kryptoklipperkampanjer. Fordelen for operatøren er todelt: Python-utklippstavlebiblioteker (pyperclip (først blant dem) er renere og mer plattformuavhengige enn JavaScript-ekvivalentene, og De fleste automatiserte npm-skannere vekter JavaScript-filer og Python tungt .py bunter lett. Kostnaden er at installasjonsavtrykket er mye mer støyende – en ny pip installasjon er vanskelig å skjule på en utviklermaskin som vanligvis ikke pip installasjon under npm installasjon.
Plattform-native navn som den eneste snikende funksjonen. Flere nylige klippere og tyveri av små nyttelaster har droppet obfuskasjon på kodenivå helt til fordel for legitime persistensetiketter. python3-dbus-hjelper, com.apple.python.runtimeog PyRuntimeBroker er lærebokeksempler – navn en forsvarers øye vil hoppe over på en liste med førti brukertjenester. Dette er en billig og holdbar form for stealth: fjerning skjer per pakke, men persistensfilene overlever fjerningen, og en tjeneste oppkalt etter en ekte plattformkomponent vil ikke bli ryddet opp i noe annet enn en eksplisitt revisjon.
Hva forsvarere bør gjøre
- Revisjon ~/.config/systemd/user/, ~/Library/LaunchAgents/ og Get-ScheduledTask produksjon på utviklermaskiner for oppføringene som er oppført i IOC-er. Hvis du fjerner npm-pakken, forblir disse på plass; de må fjernes manuelt.
- Blokker overføringer til de oppførte lommebokadressene ved grenser mellom bedriftens finanskontor og DeFi-lommebøker der adressetillatelseslisting er tilgjengelig.
- Let etter ~/.config/clipboard-guardian/config.json (og plattformekvivalenter) på tvers av utvikler-maskin-flåten. Tilstedeværelsen av filen er en høykonfidensinfeksjon uavhengig av hvilken pakkeversjon som leverte den.
- Søk i node_modules/ etter clipboard_guardian/guardian.py i build-cache-øyeblikksbilder som kan være fra før fjerningen. Filens md5 er stabil på tvers av alle gjennomgåtte versjoner.
- Låsfil-pin @jonglere/resize-observatør (den legitime pakken) slik at fremtidige installasjoner ikke kan løses opp til noe annet under en feiltekst på ett tegn, spesielt i arbeidsflyter uten låsefiler som NPX.
- Behandle alle npm postinstall-påkaller pip install som høy alvorlighetsgrad i bygge-pipeline policy. Det finnes ingen legitim grunn til at en npm-pakke skal trenge pip ved installasjon – Python-verktøy distribuerer Python-verktøy.
- Søk etter process_iter()-sammenlignbare overvåkingsdata for prosesser kalt python3-dbus-helper som importerer pyperclip — forkledningsavviket (D-Bus-hjelper som holder et utklippstavlbibliotek) er den reneste atferdsindikatoren vi har.
- Roter lommebokadresser limt inn fra infiserte maskiner. En utklippstavlskapskaprer kompromitterer banen mellom et lommebokgrensesnitt og et limemål; adresser som kopieres mens de er infisert, kan endres i det stille. Alt som sendes i løpet av infeksjonsvinduet, bør behandles som potensielt feiladressert.
Konklusjonen er at vedvarende funksjonalitet overlever fjerning. Registeret vil til slutt fjerne @jaggle/resizeobserves I alle ni versjoner vil ikke systemd-enheten, LaunchAgent og den planlagte oppgaven fjerne seg selv.
Referanser
- @jonglere/resize-observatør på npm — den legitime pakken som denne typosquaten imiterer; nyttig som et grunnlag for byte-for-byte README-plagiat.
- @jaggle/resizeobserves registermetadata — publiser tidsstempler for de ni skadelige versjonene, nyttig for rettsmedisinsk tidslinje.





