RuntimeBroker npm Typosquat Kasvit Crypto Clipper

RuntimeBroker: npm Typosquat asentaa 40-ketjuisen Crypto-Clipperin käyttöjärjestelmien väliseksi "järjestelmän ajonaikaiseksi auttajaksi"

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.jsnpm-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

sca-työkalut-ohjelmisto-koostumusanalyysityökalut
Priorisoi, korjaa ja suojaa ohjelmistoriskisi
Hanki ilmainen tili.
Luottokorttia ei vaadita.

Turvaa ohjelmistokehityksesi ja -toimituksesi

Xygeni-tuotepaketin kanssa