TL; DR
2026-05-21, npm-julkaisija jaggle julkaissut yhdeksän versiota (1.0.0 kautta 1.0.8) @jaggle/resizeobserves noin kahden tunnin ikkunassa.
Paketti on kirjoitusvirhe laillisesta @juggle/resize-observer polyfill — laajalti käytetty paketti, jolla on miljoonia viikoittaisia latauksia — mutta se ei sisällä varsinaista ResizeObserver-toteutusta.
Sen sijaan paketin jälkiasennuksen koukku asentaa paketoidun Python-hyötykuorman, rekisteröi pysyvyyden alustanatiivisena ajonaikaisena välittäjänä ja ottaa käyttöön alustojen välisen leikepöydän kaappaajan, joka kohdistaa toimintansa kryptovaluuttatapahtumiin.
Linux pysyvyys näkyy muodossa python3-dbus-helper, macOS as com.apple.python.runtimeja Windows as PyRuntimeBroker.
Hyötykuorma tarkkailee jatkuvasti leikepöydän lompakko-osoitteita yli 40 lohkoketjua ja korvaa kopioidut osoitteet hiljaa hyökkääjän hallitsemilla lompakoilla.
Haittaohjelma toimii täysin paikallisesti ilman lähtevää C2-infrastruktuuria, joten leikepöydän korvaaminen itsessään toimii vuotomekanismina.
Ensisijainen IOC on itse paketin nimi: @jaggle/resizeobserves — huomaa pois jätetty vokaali sanassa ”jaggle” ja lisätty ”s” sanassa ”resizeobserves”.
Vakavuusaste: korkea.
Hyökkäys: Näin se toimii
npm:@jaggle/resizeobserves ei näytä haittaohjelmalta satunnaisesti katsottuna npm-näkymä. Sen README.md on sanatarkka README-tiedosto npm:@juggle/resize-observer — samat koodinäytteet, samat käyttöohjeet, sama tuo { ResizeObserver } hakemistosta '@juggle/resize-observer' viitteitä kaikkialla. Plagiointi on niin täydellistä, että kuka tahansa dokumentaatiota vilkaiseva olettaisi lukevansa laillisen paketin dokumentteja.
package.jsonon sitä vastoin harva: ei säilytyspaikka kenttä, yksittäinen astia sisäänkäynti osoittaa bin/clipboard-guardian.jsTämä asennuksen jälkeen suoritettava skripti solmu npm-install.jsREADME-tiedoston ”Peruskäyttö”-esimerkit viittaavat JavaScript-toteutukseen, jota ei ole olemassa missään tarball-tiedostossa. Paketin ainoa JavaScript-koodi on asennusskripti.
Vaihe 1 — npm postinstall käynnistää Python-hyötykuorman
npm-install.js on alustatietoinen. Se paikantaa pIP suoritettava tiedosto kiinteää hakupolkua pitkin (/usr/bin/pip3, /usr/local/bin/pip, palaten takaisin python3 -m pip), asentaa mukana tulevan Python-paketin tarball-hakemistosta ja — Linuxissa — vetää palvelimelle xclip or xsell kautta apt-get, pacmantai DNF jos kumpaakaan ei ole jo olemassa:
Käyttö –break-system-paketit on tarkoituksellista: nykyaikaiset Linux-jakelut toimittavat Pythonin PEP 668:n ulkoisesti hallinnoidun ympäristön merkintä käytössä, mikä estää oletuksena koko sivuston kattavat pip-asennukset. Asennusskripti pakottaa asennuksen läpi.
Skripti on myös sudo-tietoinen. Kun käynnissä oleva uid on seurausta sudosta sudo npm -asennus, käsikirjoituksessa lukee SUDO_USER ja panostaa getent-salasana löytää todellinen käyttäjän kotihakemistoon ja kirjoittaa sitten pysyvyystiedostonsa sinne sen sijaan, että ne kirjoitettaisiin / RootPysyvyys on käyttäjäkohtaista, ei koko järjestelmää koskevaa.
Vaihe 2 — Käyttöjärjestelmien välinen säilyvyys suorituksenaikaisten välittäjien nimien alla
Kun Python-paketti on asennettu, skripti rekisteröi automaattisen käynnistyksen eri nimellä jokaisessa käyttöjärjestelmässä:
- Linux — systemd-käyttäjäyksikkö osoitteessa ~/.config/systemd/user/python3-dbus-helper.serviceYksikön Tuotetiedot is Pythonin D-Bus-ajonaikaisen apuohjelmanSkripti yrittää myös ottaa sen käyttöön kautta systemctl –käyttäjän käyttöönotto, palaten manuaaliseen symboliseen linkkiin kohdassa oletus.kohde.haluaa/ kun systemctl epäonnistuu. Jos skripti suoritetaan sudon alaisuudessa, se vaihtaa muotoon sudo -u systemctl –käyttäjä, kanssa XDG_SUORITUSKANAVA_HAKEMISTO asetettu niin, että käyttäjäväyläkutsu toimii.
- macOS — LaunchAgent-plist osoitteessa ~/Kirjasto/LaunchAgents/com.apple.python.runtime.plist RunAtLoad=true ja KeepAlive=true, sitten ladattu kautta launchctl-lataus.
- Windows — ajoitettu tehtävä nimeltä PyRuntimeBroker, joka käynnistetään AtLogOn-toiminnolla ja jonka suoritusaika on nolla (eli ei aikakatkaisua) ja joka on rekisteröity PowerShellin kautta.
Kaikki kolme nimeä tuntuvat ensi silmäyksellä uskottavilta. python3-dbus-helper noudattaa laillisen Python-D-Bus-integraation nimeämiskäytäntöä Linux-työasemilla. com.apple.python.runtime matkii Applen käänteistä DNS-merkintää omille palveluilleen. PyRuntimeBroker toistaa Windowsin RuntimeBroker.exe — oikea, allekirjoitettu Microsoft-palvelu, joka välittää UWP-sovellusten käyttöoikeuspyyntöjä. Mikään näistä ei ole tässä yhteydessä oikea Apple/Microsoft/Python-palvelu, mutta puolustaja tekee nopean visuaalisen skannauksen systemctl –käyttäjäluetteloyksiköt or Get-ajoitetuksi tuskin säpsähtää.
Vaihe 3 — Leikepöydän kaappaaja
Python-hyötykuorma, asennettuna osoitteessa clipboard_guardian/guardian.py, suorittaa loputtoman silmukan, joka kyselee järjestelmän leikepöydältä 400 millisekunnin välein. Jokaisella syklillä se hakee leikepöydän nykyisen sisällön pyperclip.paste() ja suorittaa ne yli neljäkymmentä valmiiksi käännettyä säännöllistä lauseketta vasten, jotka kattavat lompakko-osoitteiden muodot Ethereumille, Bitcoinille, Monerolle, Solanalle, TRONille, TONille, Ripplelle, Litecoinille, Dogecoinille, Polkadotille, NEARille, Cosmosille, Algorandille, Stellarille, Cardanolle, Bitcoin Cashille, Dashille, Zcashille, Aptosille, Suille, Tezosille, MultiversX:lle, Harmonylle, Terralle, Injectivelle, Osmosisille, Kavalle, Celestialle, Nanolle, Filecoinille, Roninille, Ergolle, DigiBytelle, Hederalle, BNB Smart Chainille ja useille muille, jotka ovat oletuskokoonpanossa tyhjiä (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin).
Kun osuma osuu kohdalleen, skripti lukee hyökkääjän osoitteen kyseiselle ketjulle ~/.config/clipboard-guardian/config.json (tai sen alustavastineet) ja korvaa leikepöydän korvatulla tekstillä:
Verkkomerkkiä ei ole. Kopioija ei soita kotiin, ei rekisteröi tartunnan saaneita koneita eikä vuoda mitään. Vuorottaminen on itse korvaamista: kun käyttäjä kopioi vastaanottajan osoitteen lompakkonsa käyttöliittymästä ja liittää sen lähetysikkunaan, liitetty osoite kuuluu operaattorille. Varat menetetään kaistan sisällä, käyttäjälle läpinäkyvästi.
Mitä uutta täällä on
Muutamat yksityiskohdat erottuvat edukseen verrattuna yleiseen kryptovaluuttojen crypto-clipper-malliin:
1. npm → Pythonin risteytys. Useimmat npm:ssä näkemämme kryptoleikkaajat ovat puhdasta JavaScriptiä, usein obfuskoituna _0x taulukon kierto tai eval(atob(…)) pinot. Tässä esimerkissä npm-tarball-tiedostoa käytetään vain Python-paketin toimituskääreenä — siistinä Pythonina — ja annetaan pipin hoitaa riippuvuuksien asennus (pyperclip, psutil, valinnainen setproctitle) ilmoitettu niputetussa pyproject.tomlJavaScript-hämärrystä ei ole voitettavana. Clipper itsessään on yksinkertainen, luettava Python.
2. Tri-OS-persistenssitunnisteet valittiin uskottavuuden perusteella. Monet alustojen väliset asennusohjelmat rekisteröivät pysyvyyden yleisillä nimillä (päivityspalvelu, helper.plist). Tässä esimerkissä nähdään vaivaa valitakseen tunnisteet, jotka muistuttavat kunkin käyttöjärjestelmän alustan natiiveja ajonaikaisia välittäjiä. Nimeäminen on ainoa yritys piilottaa – ei ole rootkit-ohjelmia, ei käyttäjäalueen piilottamista eikä polun hämärtämistä. Veikkaan, että puolustajat auditoivat harvoin. ~/.config/systemd/käyttäjä/ ja että palvelu nimeltä python3-dbus-helper ei erotu joukosta satunnaisessa arvostelussa.
3. Prosessiotsikon naamiointi on todellista, mutta analyysin vastaisuus on piilevää. Pythonin hyötykuorma määrittelee _naamiointiprosessi() funktio, joka asettaa prosessin otsikon setproctitle (Linux/macOS) tai AsetaKonsoliOtsikkoW (Windows) — ja main () soittaa sitä. Joten ps aux tulee näyttämään python3-dbus-helper sijasta python3 …/guardian.pySama moduuli kuitenkin määrittelee on_monitori_käynnissä() funktio, joka luettelee tunnetut prosessien valvontatyökalut (htop, btop, Tehtävienhallinta, Toimintojen valvonta, Prosessien hakkerointi, Resurssien valvonta, GNOME / KDE / Xfce / MATE -järjestelmän valvontaohjelmat ja niin edelleen) — ja main () ei koskaan kutsu sitä. Korvaussilmukka toimii ehdoitta riippumatta siitä, onko käyttäjällä prosessimonitori auki vai ei. Funktio on kuollutta koodia toimitetussa versiossa. Se on todennäköisesti jäänne aiemmasta iteraatiosta tai tukirakennetta ominaisuudelle, jota ei ole vielä kytketty. Joka tapauksessa julkaistun hyötykuorman analyysin vastainen pinta on yksi prosessin otsikon uudelleennimeäminen, ei aktiivisen monitorin väistö.
4. Mukana toimivien konfiguraatioiden yhdistämisen toiminta. npm-install.js kirjoittaa oletuslompakkoluettelon kohteeseen ~/.config/clipboard-guardian/config.json ja jos asetustiedosto on jo olemassa, yhdistää kaikki avaimet, joiden nykyinen arvo on tyhjä. Tämä tarkoittaa käyttäjää, joka on aiemmin saanut tartunnan ja osittain puhdistanut asetustiedoston – esimerkiksi tyhjentämällä ethereum arvo — se täytetään uudelleen jokaisen seuraavan haitallisen paketin asennuksen yhteydessä. Minkään koodipolun pysyvyystiedostoa ei puhdisteta.
| Päivämäärä / aika (UTC) | Tapahtuma |
|---|---|
2026-05-21 18:50:32 | @jaggle/resizeobserves@1.0.0 julkaistu. |
2026-05-21 19:55:55 | 1.0.1 julkaistu — ulkoisen skannauksen merkityn ensimmäisen version. |
2026-05-21 19:58:10 | 1.0.2 julkaistu. |
2026-05-21 20:05:03 | 1.0.3 julkaistu. |
2026-05-21 20:09:24 | 1.0.4 julkaistu. |
2026-05-21 20:13:48 | 1.0.5 julkaistu. |
2026-05-21 20:41:52 | 1.0.6 julkaistu. |
2026-05-21 20:43:56 | 1.0.7 julkaistu — lisää try/catch kääre wallet-config-kirjoitusvaiheen ympärillä npm-install.js. |
2026-05-21 20:46:15 | 1.0.8 julkaistu — asentajan nimi on muutettu npm-install.js → npm-install.cjs (tavuidenttinen sisältö). |
2026-05-22 | Tuomiot ja IOC:t julkaistu. Versiot ovat edelleen rekisterissä julkaisuhetkellä (keskeneräinen). |
Yhdeksän versiota tunnissa ja viidessäkymmenessäkuudessa minuutissa on nopeaa jopa typosquatille. Kuvio on yhdenmukainen a:n kanssa julkaise ja polta -kampanja — rekisteri täytetään yhden kahvan alle, annetaan tunnistuksen toimia ja siirrytään uuteen kahvaan, kun yksi versio on poistettu. Näkyvät muutokset suorituksen aikana ovat kosmeettisia: versiossa 1.0.1 lisätty eksplisiittinen /usr/bin/pip3-tyyliset polut pip-hakuluetteloon (sudo-yhteensopivuus), 1.0.7 kääri wallet-config-kirjoitusfunktion try/catch-funktioon ja 1.0.8 nimesi asentajan uudelleen versiosta . Js että .cjs-tiedosto pitäen samalla sisällön tavuidenttisenä. .cjs-tiedosto nimeä kappaleet uudelleen npm-varoituksilla epäselvästä moduuliresoluutiosta paketeissa ilman eksplisiittistä "tyyppi" kenttään, ja se voi olla yritys vaientaa asennuksenaikaista kohinaa, joka voisi herättää huomiota. Pythonin hyötykuorma – ainoa osa, joka todella varastaa – on pysynyt muuttumattomana kaikissa yhdeksässä versiossa.
Kompromissin indikaattorit
Jäsenyydet
| ekosysteemi | Paketti | versiot | Tila |
|---|---|---|---|
| NPM | @jaggle/resizeobserves | 1.0.0 kautta 1.0.8 | Julkaistu julkaisuhetkellä; poistopyyntö. |
Tiedostot ja tiivisteet
| Polun, | Huomautuksia |
|---|---|
clipboard_guardian/guardian.py(md5 f7935c2c82bc881288611ab6cd634f17) | Identtinen kaikissa yhdeksässä julkaistussa versiossa (1.0.0 kautta 1.0.8). Klipperin hyötykuorma. |
npm-install.js (1.0.0 – 1.0.7)npm-install.cjs (1.0.8) | Pysyvyysasennusohjelma; sama kokonaisvaltainen toiminta. 1.0.7's .js ja 1.0.8's .cjs ovat tavuidenttisiä. |
~/.config/clipboard-guardian/config.json | Linuxin pysyvyyskonfiguraatio ja lompakkopaketti. |
~/Library/Application Support/clipboard-guardian/config.json | macOS:n pysyvyysmääritysten ja lompakon paketti. |
%APPDATA%\clipboard-guardian\config.json | Windowsin pysyvyysmääritys- ja lompakkopaketti. |
~/.config/systemd/user/python3-dbus-helper.service | Linuxin automaattisen käynnistyksen pysyvyys. |
~/Library/LaunchAgents/com.apple.python.runtime.plist | macOS LaunchAgentin pysyvyys. |
~/Library/Logs/com.apple.python.runtime.log | macOS:n stdout/stderr-loki agentille. |
Scheduled Task PyRuntimeBroker | Windowsin automaattisesti käynnistyvä tehtävä (AtLogOn, ei aikakatkaisua). |
Käyttäytymisindikaattorit
| signaali | Tuotetiedot |
|---|---|
pip install --break-system-packages npm:n asennuksen jälkeisestä ajasta | Pakottaa koko sivuston kattavan Pythonin asennuksen ohittaen PEP 668 -suojaukset. |
apt-get install -y xclip (tai pacman/dnf) | Asentaa leikepöydän apuohjelmat Linuxiin paketin asennuksen aikana. |
python3-dbus-helper.service systemd-käyttäjäyksikkö | Pysyvyys rekisteröity uskottavan näköisen ajonaikaisen auttajanimen alle. |
com.apple.python.runtime LaunchAgent | Pysyvyysmerkintä laillisten Apple-järjestelmäpolkujen ulkopuolella. |
PyRuntimeBroker Ajoitettu tehtävä | Väärennetty Windowsin suorituksenaikaisen välittäjän pysyvyys ilman laillista asennuslähdettä. |
Python-prosessi otsikolla python3-dbus-helper tuovan pyperclip ja psutil | Näytetyn prosessinimen ja tuotujen kirjastojen toimintahäiriö. |
| Leikepöytä muuttuu ~0.4 sekuntia lompakon osoitteen kopioinnin jälkeen | Kryptovaluutan osoitteen korvaamisen allekirjoituskäyttäytyminen. |
Hyökkääjän lompakkopaketti (puolustajan metsästyslista)
Lompakkoluettelo toimitetaan kiinteästi koodattuna npm-install.js ja clipboard_guardian/guardian.pyPuolustajat voivat käyttää listaa sekä estolistana (käsitellä kaikkia yrityslompakoista näihin osoitteisiin tehtyjä siirtoja epäilyttävinä) että metsästysavaimena (käsitellä minkä tahansa näistä merkkijonoista esiintymistä todentamattomassa asetustiedostossa, koontitiedostossa tai kehittäjäkoneessa tartunnan ilmaisimena).
Hyökkääjän lompakkopaketti
| Ketju | Osoite |
|---|---|
| Ethereum / BSC | 0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Ronin (EVM) | ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Bitcoin | bc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y |
| Bitcoin Cash | bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt |
| Litecoin | ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe |
| dogecoin | DNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy |
| Ajatusviiva | XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS |
| Zcash | t1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M |
| DigiByte | DPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH |
| Monero | 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf |
| Solana | DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5 |
| TRON | TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2 |
| TON | UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr |
| Ripple | r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H |
| Pallokuosi | 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG |
| NEAR | 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364 |
| Maailmankaikkeus | cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e |
| Osmosis | osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t |
| Celestia | celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5 |
| injective | inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh |
| Kava | kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux |
| Harmonia | one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a |
| Maa | terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x |
| Algorand | XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI |
| Tähtien | GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE |
| Cardano | addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f |
| MultiverseX | erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0 |
| Aptos | 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e |
| sui | 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78 |
| Nano | nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn |
| Filecoin | f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui |
| Tezos | tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk |
| Ergo | 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA |
| hedera | 0.0.10488092 |
Ketjut, joissa on regex-kattavuus, mutta tyhjiä lompakkopaikkoja oletuskokoonpanossa — Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB — eivät ole aktiivisesti substituoituja tässä kokoonpanossa, mutta ne havaitaan. Käsittele niitä valvonta-alueina substituutioalueiden sijaan.
Attribuutio ja motivaatio
Kampanjan attribuutiopinta on ohut. Emme ole pystyneet vahvistamaan operaattorin henkilöllisyyttä. Mitä voimme tallentaa:
- Julkaisijan metatiedot NPM-tili heilua listaa sähköpostiosoitteensa seuraavasti olgascarlet@deltajohnsons.comVerkkotunnus deltajohnsons.com ei vastaa varmennettavaa yritysidentiteettiä. NPM-tilillä ei näy sähköpostiosoitteen vahvistusta eikä SCM vahvistus. Ei ole olemassa julkista GitHub-läsnäoloa.
- Tietovarastokenttä. package.json ei kanna mukanaan säilytyspaikka kenttä. Laillinen npm:@juggle/resize-observer viittaa oikeaan GitHub-repositorioon, jolla on tuhansia tähtiä ja aktiivisia ongelmia. Repositoriolinkin puuttuminen on nopein visuaalinen merkki npm-käyttöliittymässä.
- README-plagiointia. README-paketti on laillinen @juggle/resize-observer README-tiedosto tavu tavulta, mukaan lukien tuoda esimerkkejä, jotka viittaavat @juggle/resize-observer itse (ei julkaisupaketti). Operaattori ei edes vaivautunut kirjoittamaan tuotuja tiedostoja uudelleen – yleinen merkki siitä, että readme-tiedosto poistettiin, ei muokattu.
- Ei infrastruktuuria, johon kääntyä. Ei ole C2-päätepistettä, ei DNS-hakua eikä IP-osoitetta. Haitallinen toiminta on täysin kapseloitu paikalliseen clipperiin ja kovakoodattuun lompakkopakettiin. Tämä tekee verkkotunnus- tai ASN-pohjaisen pivoting-toiminnon mahdottomaksi. Kampanjoiden välillä pivot-toimintoja hyödyntävien puolustajien tulisi vertailla lompakoita aiempiin tiedostoissaan oleviin clippereihin; lompakon uudelleenkäyttö eri paketeissa on helpoin tapa kampanjoiden välillä.
- Nimeämisvalinta. @jaggle/resizeobserves on yhden merkin päässä @pallotella ja yksi poikkeama tunnetusta koon muuttamisen tarkkailijaYhdistetty muokkausetäisyys on kaksi glyyfiä. Tämä on tarkoituksellinen visuaalinen törmäys, ei geneerinen kyykky.
Motivaatio, joka perustuu hyötykuorman käyttäytymiseen: puhdasta rahaksi tekemistä opportunistisen leikepöydän korvaamisen kautta. Ei tunnistetietojen keräämistä, isännän sormenjälkien ottamista tai ympäristömuuttujien lukemista. Operaattoria ei kiinnosta kuka uhri on – häntä kiinnostaa, että uhrin seuraava siirto osoittaa johonkin luetelluista osoitteista. Neljänkymmenen ketjun kattavuus on lottomalli toiminnassa: heitä laajalle, toivoen, että yksi arvokas liite osuu kerran N asennusta kohden.
Operaattori vaikuttaa välinpitämättömältä poistosta. Yhdeksän version julkaiseminen kahden tunnin sisällä samalla laajuusalueella on kuin julkaise ja polta -kahvan käyttö: maksimoi rekisterin jalanjälki ennen kuin poistoviive saavuttaa, ja sitten siirrytään eteenpäin. Emme ole havainneet @jaggle uudelleenjulkaisu uudella laajuusalueella kirjoitushetkellä, mutta odotamme samankaltaisia laajuusalueita (@jaggie, @pallotella-, @heilutella) ilmestyy tulevina päivinä, jos operaattori on edelleen aktiivinen.
Vaikutus, trendit ja mitä puolustajien tulisi tehdä
Vaikutus
Vaikutuksen kvantifiointi reaalirahassa ei ole mahdollista nykyisestä datasetistä. Leikkausohjelma ei kirjoita telemetriaa, eikä lompakoiden ole vielä havaittu vastaanottavan korvaavia siirtoja analyysin katkaisuhetkellä (listattujen ketjujen seurantatarkastus on listallamme). Laillinen npm:@juggle/resize-observer keskimäärin reilusti seitsemännumeroisia viikoittaisia latausmääriä – paljon liikennettä sisältävä typosquat-kohde – ja haitallinen paketti oli aktiivinen alle 24 tuntia paljastushetkellä, mikä rajoittaa altistuneen populaation määrää, mutta ei nollaa sitä.
Seurannan arvoinen räjähdyssäde ei ole suoria latauksia @jaggle/resizeobserves — ne ovat todennäköisesti pieniä. Kyseessä on **transitiiviset asennukset**: kehittäjä lisää paketin hiekkalaatikkoprojektiin ja suorittaa npm asentaa, ja sitten unohtaen, että asennuskoukku koskaan suoritettiin. Jokaisella asennuksen jälkeistä prosessia käsitelleellä koneella on nyt käyttäjäkohtainen leikepöydän kaappaaja automaattisen käynnistyksen yhteydessä riippumatta siitä, onko projekti vielä levyllä. Pakettihakemiston poistaminen osoitteesta solmu_moduulit **ei** poista pysyvyyttä.
Nousevat mallit
Kaksi trendiä, joista tämä kampanja on esimerkki.
npm Python-hyötykuorman toimituskääreenä. npm-tarball on nelirivinen asennusohjelma; varsinainen varastaja on Python, jonka asentaa koko järjestelmään pIP niputetusta hakemistosta. Tämä ei ole uutta – olemme nähneet npm-pakettien hylkäävän Pythonin aiemminkin – mutta siitä on tulossa mitattavasti yleisempi muoto kryptoleikkaavissa kampanjoissa. Operaattorille on kaksi etua: Pythonin leikepöytäkirjastot (pyperclip ensimmäinen niistä) ovat puhtaampia ja alustojenvälisesti toimivampia kuin JavaScript-vastineet, ja useimmat automatisoidut npm-skannerit painottavat JavaScript-tiedostoja voimakkaasti ja Pythonia .py niputtaa kevyesti. Kustannuksena on, että asennusjälki on paljon äänekkäämpi – uusi pip asennus on vaikea piilottaa kehittäjäkoneella, joka ei normaalisti pip asennus aikana npm asentaa.
Ainoana piilotettuna keinona ovat alustakohtaiset nimet. Useat viimeaikaiset koodinleikkaajat ja pienten hyötykuormien varastajat ovat hylänneet kooditason hämärtämisen kokonaan ja käyttäneet sen sijaan laillisen näköisiä pysyvyystunnisteita. python3-dbus-helper, com.apple.python.runtimeja PyRuntimeBroker ovat oppikirjaesimerkkejä – nimiä, jotka puolustajan silmä ohittaa neljänkymmenen käyttäjäpalvelun listalla. Tämä on halpa ja kestävä hiiviskelyn muoto: poisto on pakettikohtainen, mutta pysyvyystiedostot säilyvät poiston jälkeen, ja aidonnäköisen alustakomponentin mukaan nimetty palvelu ei puhdistu millään muulla kuin eksplisiittisellä tarkastuksella.
Mitä puolustajien tulisi tehdä
- Tarkastele ~/.config/systemd/user/-, ~/Library/LaunchAgents/- ja Get-ScheduledTask-komentoja ulostulo kehittäjäkoneilla IOC-luetteloissa luetelluille merkinnöille. npm-paketin poistaminen jättää nämä paikoilleen; ne on poistettava manuaalisesti.
- Estä siirrot lueteltuihin lompakko-osoitteisiin yritys-, valtiovarainministeriö- ja DeFi-lompakko-rajoilla, joilla osoitteiden sallittujen listaus on käytettävissä.
- Etsi ~/.config/clipboard-guardian/config.json (ja alustavastineita) kehittäjäkoneissa. Tiedoston olemassaolo on erittäin luotettava tartunta riippumatta siitä, mikä pakettiversio sen toimitti.
- Hae node_modules/-tiedostosta clipboard_guardian/guardian.py koontivälimuistin tilannevedoksissa, jotka saattavat olla ennen poistoa. Tiedoston md5-tiedosto on vakaa kaikissa tarkistetuissa versioissa.
- Lukitustiedoston kiinnitys @juggle/resize-observer (laillinen paketti), jotta tulevat asennukset eivät voi ratkaista mitään muuta yhden merkin kirjoitusvirheen vuoksi, varsinkaan lukitustiedostottomissa työnkuluissa, kuten npx.
- Käsittele mitä tahansa npm-asennuksen jälkeistä pip-asennusta kutsuvaa koodia erittäin vakavana rakennuksessapipeline käytäntö. Ei ole mitään perusteltua syytä, miksi npm-paketin pitäisi tarvita pip-komentoa asennuksen aikana — Python-työkalut jakelevat Python-työkaluja.
- Hae process_iter()-vertailukelpoisia valvontatietoja prosesseille nimeltä python3-dbus-helper, jotka tuovat pyperclipin — peitetiedostojen epäsuhta (leikepöytäkirjastoa hallussaan pitävä D-Bus-apuohjelma) on selkein käyttäytymisindikaattori, joka meillä on.
- Kierrätä tartunnan saaneista koneista liitettyjä lompakko-osoitteita. Leikepöydän kaappaaja vaarantaa lompakon käyttöliittymän ja liittämiskohteen välisen polun; tartunnan aikana kopioituja osoitteita voidaan muuttaa huomaamattomasti. Kaikkea tartunta-aikana lähetettyä tulee käsitellä mahdollisesti harhaanjohtavana.
Yhteenvetona voidaan todeta, että pysyvyys kestää kauemmin kuin poisto. Rekisteri poistaa lopulta @jaggle/resizeobserves kaikissa yhdeksässä versiossa; systemd-yksikkö, LaunchAgent ja Scheduled Task eivät poista itseään.
Viitteet
- @juggle/resize-observer npm:ssä — laillinen paketti, jota tämä typosquat matkii; hyödyllinen lähtökohtana tavu tavulta -README-plagioinnille.
- @jaggle/resizeobserves rekisterin metatiedot — julkaisee yhdeksän haitallisen version aikaleimat, jotka ovat hyödyllisiä rikostutkinnan aikataulutuksessa.





