RuntimeBroker npm Typosquat Plants Crypto Clipper

RuntimeBroker: un Typosquat npm plantează un Crypto-Clipper cu 40 de lanțuri ca „System Runtime Helper” cross-OS

TL; DR

Pe 21 mai 2026, editorul npm jaggle a lansat nouă versiuni (1.0.0 prin 1.0.8) de @jaggle/resizeobserves într-o fereastră de aproximativ două ore.

Pachetul este o typosquat a legitimului @juggle/resize-observer polyfill — un pachet utilizat pe scară largă cu milioane de descărcări săptămânale — dar nu oferă nicio implementare reală a ResizeObserver.

În schimb, pachetul hook postinstalare instalează o utilă Python inclusă, înregistrează persistența ca un broker runtime cu aspect nativ pentru platformă și implementează un hijacker de clipboard multi-platformă care vizează tranzacțiile cu criptomonede.

Linux persistența apare ca python3-dbus-helper, MACOS as com.apple.python.runtime și ferestre din as PyRuntimeBroker.

Sarcina utilă monitorizează continuu clipboard-ul pentru adrese de portofel în peste 40 de blockchain-uri și înlocuiește în mod silențios adresele copiate cu portofele controlate de atacatori.

Malware-ul operează în întregime local, fără infrastructură C2 de ieșire, ceea ce face ca înlocuirea clipboard-ului să fie mecanismul de exfiltrare.

IOC-ul principal este numele pachetului în sine: @jaggle/resizeobserves — observați vocala omisă în „jaggle” și „s” adăugat în „resizeobserves”.

Severitate: ridicată.

Atacul: Cum funcționează

npm:@jaggle/resizeobserves nu arată ca malware la o privire ocazională vizualizare npm. Ei README.md este fișierul README verbatim al npm:@juggle/resize-observer — aceleași exemple de cod, aceleași instrucțiuni de utilizare, aceleași importă { ResizeObserver } din '@juggle/resize-observer' referințe peste tot. Plagiatul este atât de complet încât oricine ar arunca o privire la documentație ar presupune că citește documentația pachetului legitim.

pachet.json, prin contrast, este rară: nu depozit câmp, un singur bin intrarea indicând spre bin/clipboard-guardian.js, Precum și o postinstalare script care rulează nodul npm-install.jsExemplele de „Utilizare de bază” din fișierul README fac referire la o implementare JavaScript care nu există nicăieri în arhiva tarball. Singurul JavaScript din pachet este scriptul de instalare.

Etapa 1 — npm postinstall bootează o sarcină utilă Python

npm-install.js este conștient de platformă. Localizează un țâfnă executabil de-a lungul unei căi de căutare fixe (/usr/bin/pip3, /usr/local/bin/pip, revenind la python3 -m pip), instalează pachetul Python inclus din directorul tarball și — pe Linux — extrage xclip or xsell de apt-get, pacman, DNF dacă niciunul nu este deja prezent:

Utilizarea –break-system-packages este deliberat: distribuțiile Linux moderne livrează Python cu markerul de mediu gestionat extern al PEP 668 activat, care blochează implicit instalările pip la nivel de site. Scriptul de instalare forțează finalizarea instalării.

Scriptul este, de asemenea, compatibil cu sudo. Când uid-ul care rulează este rezultatul unui instalare sudo npm, scenariul spune SUDO_USER și plătește pentru getentpasswd pentru a găsi real directorul principal al utilizatorului, apoi își scrie fișierele de persistență acolo, în loc să fie în / RădăcinăPersistența este per utilizator, nu la nivel de sistem.

Etapa 2 — Persistență între sisteme de operare sub nume de brokeri de execuție

După instalarea pachetului Python, scriptul înregistrează o intrare de pornire automată sub un nume diferit pe fiecare sistem de operare:

  • Linux — o unitate utilizator systemd la ~/.config/systemd/user/python3-dbus-helper.serviceUnitatea Descriere is Ajutor pentru rularea Python D-BusScriptul încearcă, de asemenea, să îl activeze prin systemctl –activare utilizator, revenind la o legătură simbolică manuală sub țintă.implicită.dorește/ când systemctl eșuează. Dacă rulează sub sudo, scriptul comută la sudo -u sistemctl –utilizator, Cu XDG_RUNTIME_DIR setat astfel încât apelul magistralei de utilizator să funcționeze.
  • MACOS — o listă LaunchAgent la ~/Bibliotecă/LaunchAgents/com.apple.python.runtime.plist implementate cu ExecutareLaÎncărcare=adevărat și KeepAlive=true, apoi încărcat prin încărcare lansare CTL.
  • ferestre din — o sarcină programată numită PyRuntimeBroker, declanșată AtLogOn, cu o limită de timp de execuție de zero (adică, fără timeout), înregistrată prin PowerShell.

Toate cele trei nume sunt credibile la prima vedere. python3-dbus-helper respectă convenția de denumire a integrării legitime Python-D-Bus pe desktop-urile Linux. com.apple.python.runtime imită etichetarea reverse-DNS a Apple pentru propriile servicii. PyRuntimeBroker face ecou Windows-ului RuntimeBroker.exe — un serviciu Microsoft real, semnat, care gestionează cererile de permisiune pentru aplicațiile UWP. Niciunul dintre acestea nu este un serviciu Apple/Microsoft/Python real în acest context, ci un apărător care efectuează o scanare vizuală rapidă a systemctl –unități-listă utilizatori or Get-sarcină programată este puțin probabil să tresară.

Etapa 3 — Deturnatorul de clipboard

Sarcina utilă Python, instalată la clipboard_guardian/guardian.py, rulează o buclă infinită care interoghează clipboard-ul sistemului la fiecare 400 de milisecunde. La fiecare bifare, extrage conținutul curent al clipboard-ului prin pyperclip.paste() și le rulează pe o listă de peste patruzeci de expresii regulate precompilate care acoperă formate de adrese de portofel pentru 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 și multe altele, criptate, dar goale în configurația implicită (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin).

Când se găsește o potrivire, scriptul citește adresa atacatorului pentru acel lanț de la ~/.config/clipboard-guardian/config.json (sau echivalentele sale pe platformă) și suprascrie clipboard-ul cu textul înlocuit:

Nu există niciun semnalizator de rețea. Clipper-ul nu sună acasă, nu înregistrează gazdele infectate, nu exfiltrează nimic. Exfiltrarea este substituția în sine: atunci când un utilizator copiază o adresă de destinatar din interfața portofelului său și o lipește într-o fereastră de dialog de trimitere, adresa lipită aparține operatorului. Fondurile se pierd în bandă, în mod transparent pentru utilizator.

Ce este nou aici

Câteva detalii ies în evidență în comparație cu șablonul generic crypto-clipper:

1. npm → crossover Python. Majoritatea cripto-clipperelor pe care le vedem în npm sunt JavaScript pur, frecvent ofuscate cu _0x rotația matricei sau eval(atob(…)) stive. Acest exemplu folosește tarball-ul npm ca nimic mai mult decât un wrapper de livrare pentru un pachet Python — Python curat — și permite pip să se ocupe de instalarea dependențelor (pyperclip, psutil, opțional setproctitle) declarat în pachet pyproject.tomlNu există nicio ofuscare JavaScript care să poată fi înlăturată. Clipper-ul în sine este Python simplu și ușor de citit.

2. Etichete de persistență Tri-OS alese pentru plauzibilitate. Mulți instalatori multiplatformă înregistrează persistența sub nume generice (serviciu de actualizare, helper.plist). Acest exemplu își face efortul să aleagă etichete care seamănă cu brokerii de execuție nativi ai platformei pe fiecare sistem de operare. Denumirea este singura încercare de ascundere - nu există rootkit, nu există ascundere a zonei de utilizare, nu există obfuscare a căii. Pariul este că apărătorii rareori auditează ~/.config/systemd/user/ și că un serviciu numit python3-dbus-helper nu va ieși în evidență într-o recenzie superficială.

3. Deghizarea titlului procesului este reală, dar anti-analiza este latentă. Sarcina utilă Python definește un _proces_de_deghizare() funcție care setează titlul procesului prin setproctitle (Linux/macOS) sau SetConsoleTitleW (Windows) — și main () o numește. Deci ps la va transmite python3-dbus-helper în loc de python3 …/guardian.pyTotuși, același modul definește un monitorul_funcționează() funcție care enumeră instrumentele cunoscute de monitorizare a proceselor (Htop, btop, Manager de activități, Monitor de activitate, Process Hacker, Monitor de resurse, monitoare de sistem GNOME / KDE / Xfce / MATE și așa mai departe) — și main () nu o apelează niciodată. Bucla de substituție rulează necondiționat, indiferent dacă utilizatorul are sau nu un monitor de proces deschis. Funcția este cod mort în versiunea livrată. Cel mai probabil este o rămășiță dintr-o iterație anterioară sau o schelă pentru o caracteristică care nu este încă configurată. În orice caz, suprafața anti-analiză a sarcinii utile publicate este o redenumire a titlului unui proces, nu o evitare activă a monitorului.

4. Comportamentul de tip „config-merge” inclus în pachet. npm-install.js scrie lista implicită de portofele în ~/.config/clipboard-guardian/config.json și, dacă există deja un fișier de configurare, îmbină orice chei a căror valoare existentă este goală. Aceasta înseamnă un utilizator care a fost infectat anterior și a curățat parțial configurația - de exemplu, prin golirea ethereum valoare — va fi repopulată de fiecare instalare ulterioară a unui pachet malițios. Nu există nicio curățare a fișierului de persistență în nicio cale de cod.

Data / Ora (UTC) eveniment
2026-05-21 18:50:32 @jaggle/resizeobserves@1.0.0 publicat.
2026-05-21 19:55:55 1.0.1 publicată — prima versiune semnalată prin scanare externă.
2026-05-21 19:58:10 1.0.2 publicat.
2026-05-21 20:05:03 1.0.3 publicat.
2026-05-21 20:09:24 1.0.4 publicat.
2026-05-21 20:13:48 1.0.5 publicat.
2026-05-21 20:41:52 1.0.6 publicat.
2026-05-21 20:43:56 1.0.7 publicat — adaugă o try/catch încapsulare în jurul pasului de scriere pentru configurarea portofelului npm-install.js.
2026-05-21 20:46:15 1.0.8 publicat — instalator redenumit npm-install.jsnpm-install.cjs (conținut identic cu octeții).
2026-05-22 Verdicte și CIO-uri publicate. Versiunile sunt încă în registru la momentul publicării (în desfășurare).

Nouă versiuni într-o oră și cincizeci și șase de minute este rapid chiar și pentru un typosquat. Modelul este consistent cu un campanie de publicare și ardere — inundați registrul sub un singur identificator, lăsați detectarea să-și urmeze cursul și treceți la un identificator nou odată ce o singură versiune este eliminată. Deltele vizibile pe parcursul rulării sunt cosmetice: 1.0.1 a adăugat explicit /usr/bin/pip3căi în stilul - către lista de căutare pip (compatibilitate cu sudo), versiunea 1.0.7 a inclus scrierea configurației wallet într-un try/catch, iar versiunea 1.0.8 a redenumit programul de instalare din .js la .cjs păstrând în același timp conținutul identic la octeți. .cjs redenumiți pistele cu avertismente npm despre rezoluția ambiguă a modulelor în pachete fără o funcție explicită "tip" câmp și ar putea fi o încercare de a suprima zgomotul din timpul instalării care ar putea atrage atenția. Sarcina utilă Python - singura parte care fură de fapt - este neschimbată în toate cele nouă versiuni.

Indicatori de compromis

Pachete

SnowGem Pachet versiuni Stare
NPM @jaggle/resizeobserves 1.0.0 prin 1.0.8 Live la publicare; se solicită eliminarea.

Fișiere și hash-uri

Cale notițe
clipboard_guardian/guardian.py
(md5 f7935c2c82bc881288611ab6cd634f17)
Identic în toate cele nouă versiuni publicate (1.0.0 prin 1.0.8Încărcătura utilă a clipperului.
npm-install.js (1.0.0 – 1.0.7)
npm-install.cjs (1.0.8)
Instalator persistent; același comportament end-to-end. 1.0.7's .js și 1.0.8's .cjs sunt identice la nivel de octeți.
~/.config/clipboard-guardian/config.json Configurație de persistență Linux și pachet de portofel.
~/Library/Application Support/clipboard-guardian/config.json Configurație de persistență macOS și pachet portofel.
%APPDATA%\clipboard-guardian\config.json Configurație de persistență Windows și pachet portofel.
~/.config/systemd/user/python3-dbus-helper.service Persistența pornirii automate în Linux.
~/Library/LaunchAgents/com.apple.python.runtime.plist Persistența macOS LaunchAgent.
~/Library/Logs/com.apple.python.runtime.log Jurnalul macOS stdout/stderr pentru agent.
Scheduled Task PyRuntimeBroker Sarcină de pornire automată Windows (AtLogOn, fără timeout).

Indicatori comportamentali

Semnal Descriere
pip install --break-system-packages din postinstalare npm Forțează instalarea Python la nivel de site, ocolind protecțiile PEP 668.
apt-get install -y xclip (sau pacman/dnf) Instalează utilitarele clipboard pe Linux în timpul instalării pachetului.
python3-dbus-helper.service unitate utilizator systemd Persistența a fost înregistrată sub un nume de ajutor la execuție cu aspect plauzibil.
com.apple.python.runtime LaunchAgent Etichetă de persistență în afara căilor legitime de sistem Apple.
PyRuntimeBroker Activitate programata Persistență falsă a brokerului de runtime Windows, fără o sursă legitimă de instalare.
Procesul Python intitulat python3-dbus-helper importatoare pyperclip și psutil Neconcordanță de comportament între numele procesului afișat și bibliotecile importate.
Modificări ale clipboard-ului ~0.4s după copierea adresei portofelului Comportamentul semnăturii în cazul substituirii adresei criptomonedei.

Pachet portofel pentru atacatori (listă de vânătoare a apărătorilor)

Lista de portofele este livrată codificată fix în npm-install.js și clipboard_guardian/guardian.pyApărătorii pot folosi lista atât ca listă de blocare (tratând orice transfer către aceste adrese din portofelele corporative ca fiind suspect), cât și ca cheie de vânătoare (tratând prezența oricăruia dintre aceste șiruri într-un fișier de configurare neautentificat, un artefact de compilare sau o mașină de dezvoltator ca indicator de infecție).

Pachet Portofel Attacker

Lanţ Adresă
Ethereum / BSC 0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18
Ronin (EVM) ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18
Bitcoin bc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y
Bitcoin Cash bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt
Litecoin ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe
dogecoin DNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy
Liniuţă XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS
Zcash t1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M
DigiByte DPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH
Monero 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf
suntrap DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5
TRON TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2
TON UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr
Ripple r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H
Buline 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG
NEAR 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364
Cosmos cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e
Osmoză osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t
Celestia celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5
injective inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh
Kava kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux
Armonie one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a
Terra terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x
Algorand XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI
Stelar GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE
Cardano addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f
MultiverseX erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0
Aptos 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e
Pe 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78
Nano nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn
Filecoin f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui
Tezos tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk
Ergo 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA
Hedera 0.0.10488092

Lanțurile cu acoperire regex, dar sloturi goale pentru portofel în configurația implicită — Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB — nu sunt înlocuite activ în această compilare, dar sunt detectate. Tratați-le ca domeniu de monitorizare, mai degrabă decât ca domeniu de substituție.

Atribuire și motivație

Campania oferă o suprafață de atribuire redusă. Nu am putut confirma identitatea operatorului. Ce putem înregistra:

  • Metadate ale editorului. Contul npm zdruncinătură își listează adresa de e-mail ca olgascarlet@deltajohnsons.com. Domeniul deltajohnsons.com nu se traduce printr-o identitate corporativă pe care o putem verifica. Contul npm nu afișează nicio verificare a adresei de e-mail și nici SCM verificare. Nu există nicio prezență publică asociată pe GitHub.
  • Câmp de repozitoriu. pachet.json poartă nr depozit câmp. Legitimitatea npm:@juggle/resize-observer indică un depozit GitHub real cu mii de stele și probleme active. Absența unui link către depozit este cel mai rapid indicator vizual din interfața npm.
  • Plagiat README. Pachetul README este legitim @juggle/resize-observer README octet cu octet, inclusiv import exemple care fac referire @juggle/resize-observer în sine (nu pachetul de publicare). Operatorul nici măcar nu s-a obosit să rescrie importurile — un semnal comun că fișierul readme a fost eliminat, nu adaptat.
  • Fără infrastructură pe care să se poată pivota. Nu există un endpoint C2, nicio căutare DNS, nicio adresă IP. Comportamentul rău intenționat este complet încapsulat în clipperul local plus pachetul de portofel codat hard. Acest lucru face ca pivotarea bazată pe domeniu sau ASN să nu fie disponibilă. Apărătorii care pivotează între campanii ar trebui să compare portofelele cu orice clipper anterior pe care îl au înregistrat; reutilizarea unui portofel între pachete este cea mai ușor de gestionat legătură între campanii.
  • Alegerea denumirii. @jaggle/resizeobserves este cu un caracter diferit de @jongla și o inflexiune față de binecunoscutul observator de redimensionareDistanța de editare combinată este de două glife. Aceasta este o coliziune vizuală deliberată, nu o așezare generică.

Motivație, bazată pe comportamentul payload-ului: monetizare pură prin substituție oportunistă a clipboard-ului. Nu există recoltare de acreditări, amprentare digitală a gazdei, citire a variabilelor de mediu. Operatorului nu-i pasă cine este victima - îi pasă ca următorul transfer al victimei să fie direcționat către una dintre adresele listate. Acoperirea cu patruzeci de lanțuri este modelul loteriei în acțiune: distribuire largă, sperând că o singură pastă de valoare mare va ajunge o dată la N instalări.

Operatorul pare să nu fie preocupat de eliminarea versiunilor. Publicarea a nouă versiuni în decurs de două ore, sub același domeniu de aplicare, este interpretată ca un control de publicare și inscripționare: maximizați amprenta registrului înainte ca latența eliminării să ajungă la limită, apoi continuați. Nu am observat... @jaggle republicare sub un nou domeniu de aplicare la momentul scrierii, dar ne-am aștepta la domenii de aplicare similare (@jaggie, @jongla-, @joggle) să apară în următoarele zile dacă operatorul este încă activ.

Impact, tendințe și ce ar trebui să facă apărătorii

 Impact

Cuantificarea impactului în bani reali nu este posibilă din setul de date actual. Clipper-ul nu scrie date telemetrice, iar portofelele nu sunt încă observate primind transferuri substituite la data limită de analiză (o verificare ulterioară a lanțurilor listate se află pe lista noastră). npm:@juggle/resize-observer are o medie de descărcări săptămânale de șapte cifre — o țintă typosquat cu trafic ridicat — iar pachetul malițios era activ mai puțin de 24 de ore la momentul dezvăluirii, ceea ce limitează populația expusă, dar nu o reduce la zero.

Raza exploziei care merită urmărită nu este reprezentată de descărcări directe ale @jaggle/resizeobserves — acestea sunt probabil mici. Este vorba de **instalări tranzitorii**: un dezvoltator care adaugă pachetul la un proiect sandbox, rulează npm install, și apoi uitând că hook-ul de instalare a rulat vreodată. Fiecare mașină care a procesat postinstalarea are acum un hijacker de clipboard per utilizator la pornirea automată, indiferent dacă proiectul este încă pe disc. Eliminarea directorului pachetului din nod_module nu elimină persistența.

Tipare emergente

Două tendințe exemplifică această campanie.

npm ca un wrapper de livrare a sarcinii utile Python. Arhiva tarball npm este un instalator de 4 linii; cel care fură de fișiere este Python, instalat la nivel de sistem de țâfnă din directorul inclus. Acest lucru nu este nou - am mai văzut pachete npm care elimină Python - dar devine o formă mult mai comună în campaniile crypto-clipper. Avantajul pentru operator este dublu: bibliotecile de clipboard Python (pyperclip primul dintre ele) sunt mai curate și mai compatibile cu mai multe platforme decât echivalentele JavaScript și majoritatea scanerelor NPM automate pun multă greutate pe fișierele JavaScript, iar Python PY fascicule ușor. Costul este că amprenta instalației este mult mai zgomotoasă - o nouă pip install este greu de ascuns pe o mașină de dezvoltator care în mod normal nu pip install în timpul npm install.

Numele native ale platformei sunt singura modalitate de a fi ascunse. Mai multe programe recente de tip „clipper” și „small-payload stealers” au renunțat complet la ofuscarea la nivel de cod în favoarea unor etichete de persistență cu aspect legitim. python3-dbus-helper, com.apple.python.runtime și PyRuntimeBroker sunt exemple de manual — nume pe care un apărător le va trece cu vederea pe o listă de patruzeci de servicii pentru utilizatori. Aceasta este o formă ieftină și durabilă de stealth: eliminarea se face per pachet, dar fișierele de persistență supraviețuiesc eliminării, iar un serviciu numit după o componentă reală a platformei nu va fi curățat decât printr-un audit explicit.

Ce ar trebui să facă apărătorii

  • Auditează ~/.config/systemd/user/, ~/Library/LaunchAgents/ și Get-ScheduledTask producție pe mașinile dezvoltatorilor pentru intrările listate în IOC-uri. Eliminarea pachetului npm le lasă pe acestea la locul lor; acestea trebuie eliminate manual.
  • Blocați transferurile către adresele de portofel listate la granițele dintre trezoreria corporativă și portofelul DeFi, unde este disponibilă listarea adreselor cu permisiuni.
  • Căutați ~/.config/clipboard-guardian/config.json (și echivalentele platformei) în flota de dezvoltatori-mașini. Prezența fișierului reprezintă o infecție cu grad ridicat de încredere, indiferent de versiunea pachetului care l-a livrat.
  • Căutați în node_modules/ clipboard_guardian/guardian.py în instantaneele din memoria cache a build-ului care pot fi anterioare eliminării. Fișierul md5 este stabil în toate versiunile analizate.
  • Lockfile-pin @juggle/resize-observer (pachetul legitim), astfel încât instalările viitoare să nu poată fi rezolvate în nimic altceva sub o greșeală de tipărire de un caracter, în special în fluxurile de lucru fără fișier de blocare, cum ar fi npx.
  • Tratați orice postinstalare npm care invocă pip install ca severitate ridicată în construcțiepipeline politică. Nu există niciun motiv legitim pentru ca un pachet npm să necesite pip în momentul instalării — instrumentele Python distribuie instrumentele Python.
  • Căutați date de monitorizare comparabile cu process_iter() pentru procesele numite python3-dbus-helper care importă pyperclip — nepotrivirea de deghizare (helperul D-Bus care conține o bibliotecă de clipboard) este cel mai curat indicator de comportament pe care îl avem.
  • Rotește adresele portofelului lipite de pe mașinile infectate. Un piratat de clipboard compromite calea dintre interfața de utilizare a portofelului și o țintă de lipire; adresele copiate în timp ce sunteți infectat pot fi modificate silențios. Orice mesaj trimis în timpul ferestrei de infectare ar trebui tratat ca fiind potențial direcționat greșit.

Concluzia: persistența este mai puternică decât eliminarea. Registrul va elimina în cele din urmă @jaggle/resizeobserves În toate cele nouă versiuni, unitatea systemd, LaunchAgent și Scheduled Task nu se vor elimina singure.

Referinte

sca-tools-software-instrumente-de-analiză-a-compoziției
Prioritizați, remediați și securizați riscurile software
Obține-ți contul gratuit.
Nu este necesar un card de credit.

Securizează-ți dezvoltarea și livrarea de software

cu suita de produse Xygeni