TL; DR
На 21.05.2026 г. издателят на npm jaggle пусна девет версии (1.0.0 чрез 1.0.8) на @jaggle/resizeobserves в рамките на приблизително два часа.
Пакетът е печатна грешка на легитимното @juggle/resize-observer polyfill — широко използван пакет с милиони седмични изтегляния — но не предлага реална имплементация на ResizeObserver.
Вместо това, пакетът кука след инсталиране инсталира пакетен Python полезен товар, регистрира персистентност като платформено-ориентиран брокер по време на изпълнение и внедрява междуплатформен клипборд хайджакър, насочен към криптовалутни транзакции.
Linux постоянството се проявява като python3-dbus-helper, macOS as com.apple.python.runtime, и Windows as PyRuntimeBroker.
Полезният товар непрекъснато следи клипборда за адреси на портфейли повече от 40 блокчейна и тихомълком замества копираните адреси с портфейли, контролирани от нападателя.
Зловредният софтуер работи изцяло локално, без изходяща C2 инфраструктура, което прави самото заместване в клипборда механизъм за извличане.
Основният IOC е самото име на пакета: @jaggle/resizeobserves — обърнете внимание на изпуснатата гласна в „jaggle“ и добавеното „s“ в „resizeobserves“.
Тежест: висока.
Атаката: Как работи
npm:@jaggle/resizeobserve не изглежда като зловреден софтуер на случаен принцип изглед на npm. Негов README.md е дословният README файл на npm:@juggle/resize-observer — същите примерни кодове, същите инструкции за употреба, същите импортиране на { ResizeObserver } от '@juggle/resize-observer' препратки навсякъде. Плагиатството е толкова пълно, че всеки, който погледне документацията, би предположил, че чете документацията на легитимния пакет.
- package.json, за разлика от това, е рядко: не хранилище поле, едно-единствено кофа за боклук вход, сочещ към bin/clipboard-guardian.jsи след инсталиране скрипт, който се изпълнява възел npm-install.jsПримерите за „Основно използване“ в README файла препращат към JavaScript имплементация, която не съществува никъде в tarball-а. Единственият JavaScript в пакета е инсталационният скрипт.
Етап 1 — npm postinstall зарежда Python полезен товар
npm-install.js е платформено-ориентиран. Той локализира пиукам изпълним файл по фиксиран път за търсене (/usr/bin/pip3, /usr/local/bin/pip, връщайки се към python3 -m pip), инсталира пакета Python от tarball директорията и — в Linux — го изтегля xclip or xsell от ап-да, Pacman или DNF ако нито едно от двете не е налично:
Използването на –пакети-за-счупване-на-системата е умишлено: съвременните Linux дистрибуции доставят Python с активиран маркер за външно управлявана среда на PEP 668, който блокира инсталирането на pip на целия сайт по подразбиране. Инсталационният скрипт принуждава инсталацията да се извърши.
Скриптът е и sudo-aware. Когато изпълняваният uid е резултат от sudo npm инсталиране, гласи сценарият SUDO_USER и се изплаща за парола за getent да намеря реален домашната директория на потребителя, след което записва своите файлове за персистентност там, вместо в / КоренУстойчивостта е за всеки потребител, а не за цялата система.
Етап 2 — Устойчивост между операционни системи под имена на runtime-broker
След инсталирането на Python пакета, скриптът регистрира запис за автоматично стартиране под различно име на всяка операционна система:
- Linux — потребителска единица на systemd на адрес ~/.config/systemd/user/python3-dbus-helper.serviceУстройството Описание is Помощник за изпълнение на Python D-BusСкриптът също се опитва да го активира чрез systemctl – активиране на потребителя, връщайки се към ръчна символична връзка под по подразбиране.target.wants/ когато systemctl се провали. Ако се изпълнява под sudo, скриптът превключва към sudo -u systemctl –потребителс XDG_RUNTIME_DIR настроено така, че повикването към потребителската шина да работи.
- macOS — plist файл на LaunchAgent на ~/Библиотека/LaunchAgents/com.apple.python.runtime.plist с RunAtLoad=true намлява KeepAlive=true, след което се зарежда чрез зареждане на launchctl.
- Windows — планирана задача с име PyRuntimeBroker, задействана от AtLogOn, с ограничение за време на изпълнение нула (т.е. без таймаут), регистрирана чрез PowerShell.
И трите имена са правдоподобни от пръв поглед. python3-dbus-helper следва конвенцията за именуване на легитимната интеграция на Python-D-Bus на Linux настолни компютри. com.apple.python.runtime имитира етикетирането на обратния DNS на Apple за собствените си услуги. PyRuntimeBroker повтаря това на Windows RuntimeBroker.exe — истинска, подписана услуга на Microsoft, която посредничи за заявки за разрешения за UWP приложения. Нито една от тях не е истинска услуга на Apple/Microsoft/Python в този контекст, а защитник, който извършва бързо визуално сканиране systemctl –user list-units or Get-ScheduledTask е малко вероятно да трепне.
Етап 3 — Похитителят на клипборда
Полезният товар на Python, инсталиран на clipboard_guardian/guardian.py, изпълнява безкраен цикъл, който проверява системния клипборд на всеки 400 милисекунди. На всеки такт, той извлича текущото съдържание на клипборда чрез pyperclip.paste() и ги сравнява със списък от над четиридесет предварително компилирани регулярни израза, обхващащи формати на адреси на портфейли за 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 и няколко други, запушени, но празни в конфигурацията по подразбиране (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin).
Когато се открие съвпадение, скриптът прочита адреса на атакуващия за тази верига от ~/.config/clipboard-guardian/config.json (или неговите еквиваленти на платформата) и презаписва клипборда със заместения текст:
Няма мрежов маяк. Клипърът не се обажда до дома, не регистрира заразени хостове, не извлича нищо. Извличането е самото заместване: когато потребител копира адрес на получател от потребителския интерфейс на портфейла си и го постави в диалогов прозорец за изпращане, поставеният адрес принадлежи на оператора. Средствата се губят в мрежата, прозрачно за потребителя.
Какво е новото тук
Няколко детайла се открояват в сравнение с общия шаблон за крипто-клипер:
1. npm → кросоувър на Python. Повечето крипто-клипъри, които виждаме в npm, са чист JavaScript, често обфускиран с... _0x ротация на масива или оценка(atob(…)) стекове. Този пример използва npm tarball като нищо повече от обвивка за доставка на Python пакет — чист Python — и позволява на pip да обработва инсталирането на зависимости (пайпърклип, псутил, по избор setproctitle) декларирани в пакета pyproject.tomlНяма JavaScript обфускация, която да се преодолее. Самият клипър е обикновен, четим на Python.
2. Етикети за персистентност на Tri-OS, избрани за правдоподобност. Много междуплатформени инсталатори регистрират персистентност под общи имена (услуга за актуализиране, helper.plist). Този пример си прави труда да избере етикети, които наподобяват платформено-ориентираните брокери по време на изпълнение на всяка операционна система. Именуването е единственият опит за скритост – няма руткит, няма скриване на потребителска област, няма обфускация на пътя. Обзалогът е, че защитниците рядко извършват одит ~/.config/systemd/потребител/ и че услуга, наречена python3-dbus-helper няма да се открои в случаен преглед.
3. Прикриването на заглавието на процеса е реално, но антианализът е спящ. Полезният товар на Python дефинира a _процес_на_прикриване() функция, която задава заглавието на процеса чрез setproctitle (Linux/macOS) или SetConsoleTitleW (Windows) — и Основната () го нарича. Така че ps aux ще покаже python3-dbus-helper вместо python3 …/guardian.pyСъщият модул обаче дефинира е_монитор_работи() функция, която изброява известни инструменти за наблюдение на процеси (htop, btop, Диспечер на задачи, Монитор на активността, Process Hacker, Монитор на ресурси, системни монитори на GNOME / KDE / Xfce / MATE и т.н.) — и Основната () никога не го извиква. Цикълът на заместване се изпълнява безусловно, независимо дали потребителят има отворен монитор на процесите. Функцията е мъртъв код в изпратената версия. Най-вероятно е остатък от по-ранна итерация или скеле за функция, която все още не е свързана. Така или иначе, повърхността за анти-анализ на публикувания полезен товар е едно преименуване на заглавие на процес, а не избягване на активен монитор.
4. Вграденото поведение при сливане на конфигурации. npm-install.js записва списъка с портфейли по подразбиране в ~/.config/clipboard-guardian/config.json и, ако вече съществува конфигурационен файл, слива всички ключове, чиято съществуваща стойност е празна. Това означава потребител, който преди това е бил заразен и е частично почистил конфигурацията — например, чрез изпразване на ethereum стойност — ще я попълва отново при всяка следваща инсталация на зловреден пакет. Няма почистване на файла за персистентност в нито един кодов път.
| Дата / Час (UTC) | събитие |
|---|---|
2026-05-21 18:50:32 | @jaggle/resizeobserves@1.0.0 публикуван. |
2026-05-21 19:55:55 | 1.0.1 публикувана — първата версия, маркирана чрез външно сканиране. |
2026-05-21 19:58:10 | 1.0.2 публикуван. |
2026-05-21 20:05:03 | 1.0.3 публикуван. |
2026-05-21 20:09:24 | 1.0.4 публикуван. |
2026-05-21 20:13:48 | 1.0.5 публикуван. |
2026-05-21 20:41:52 | 1.0.6 публикуван. |
2026-05-21 20:43:56 | 1.0.7 публикувано — добавя try/catch обвивка около стъпката за писане в конфигурацията на портфейла npm-install.js. |
2026-05-21 20:46:15 | 1.0.8 публикувано — инсталаторът е преименуван npm-install.js → npm-install.cjs (байтово идентично съдържание). |
2026-05-22 | Публикувани са присъди и международни наказателни решения. Версиите все още са в регистъра към момента на публикуване (в процес на разработка). |
Девет версии за един час и петдесет и шест минути са бързи дори за типослот. Моделът е в съответствие с кампания за публикуване и изгаряне — запълване на системния регистър под един дескриптор, оставяне на откриването да си свърши работата и преминаване към нов дескриптор, след като една версия бъде премахната. Видимите делти в целия регистър са козметични: 1.0.1 е добавен изричен код /usr/bin/pip3пътища в стил -style до списъка за търсене на pip (sudo-съвместимост), 1.0.7 обви записа на конфигурацията на портфейла в try/catch, а 1.0.8 преименува инсталатора от . Js да се .cjs като същевременно запазва байтово идентично съдържание. .cjs преименувайте песни с npm предупреждения за двусмислена резолюция на модулите в пакети без изрично указание "Тип" поле и може да е опит за потискане на шума по време на инсталиране, който би могъл да привлече внимание. Полезният товар на Python — единствената част, която всъщност краде — е непроменен във всичките девет версии.
Индикатори за компромис
Услуги
| Екосистема | Пакет | Версии | Статус |
|---|---|---|---|
| NPM | @jaggle/resizeobserves | 1.0.0 чрез 1.0.8 | Актуализирано в момента на публикуване; поискано премахване. |
Файлове и хешове
| Път | бележки |
|---|---|
clipboard_guardian/guardian.py(md5 f7935c2c82bc881288611ab6cd634f17) | Идентично във всичките девет публикувани версии (1.0.0 чрез 1.0.8). Полезният товар на машинката за подстригване. |
npm-install.js (1.0.0 – 1.0.7)npm-install.cjs (1.0.8) | Инсталатор за постоянство; едно и също поведение от край до край. 1.0.7's .js намлява 1.0.8's .cjs са байтово идентични. |
~/.config/clipboard-guardian/config.json | Конфигурация за постоянство на Linux и пакет портфейл. |
~/Library/Application Support/clipboard-guardian/config.json | конфигурация за постоянство на macOS и пакет портфейл. |
%APPDATA%\clipboard-guardian\config.json | Конфигурация за постоянство на Windows и пакет портфейл. |
~/.config/systemd/user/python3-dbus-helper.service | Устойчивост на автоматично стартиране на Linux. |
~/Library/LaunchAgents/com.apple.python.runtime.plist | Устойчивост на LaunchAgent на macOS. |
~/Library/Logs/com.apple.python.runtime.log | macOS stdout/stderr лог за агента. |
Scheduled Task PyRuntimeBroker | Задача за автоматично стартиране на Windows (AtLogOn, без таймаут). |
Поведенчески показатели
| Сигнал | Описание |
|---|---|
pip install --break-system-packages от npm след инсталиране | Принуждава инсталирането на Python в целия сайт, заобикаляйки защитите на PEP 668. |
apt-get install -y xclip (или pacman/не успях да спечеля) | Инсталира помощни програми за клипборда в Linux по време на инсталирането на пакета. |
python3-dbus-helper.service потребителска единица systemd | Устойчивост, регистрирана под правдоподобно изглеждащо име на помощник по време на изпълнение. |
com.apple.python.runtime LaunchAgent | Етикет за постоянство извън легитимните системни пътища на Apple. |
PyRuntimeBroker Планирана задача | Фалшиво постоянство на брокера за изпълнение на Windows без легитимен източник на инсталатора. |
Процес на Python, озаглавен python3-dbus-helper вносител pyperclip намлява psutil | Несъответствие в поведението между показаното име на процес и импортираните библиотеки. |
| Клипбордът се променя ~0.4 секунди след копиране на адреса на портфейла | Поведение на подписа при заместване на адреси в криптовалута. |
Пакет портфейл за атакуващи (списък за лов на защитници)
Списъкът с портфейли се доставя твърдо кодиран npm-install.js намлява clipboard_guardian/guardian.pyЗащитниците могат да използват списъка както като списък с блокирани данни (да третират всеки трансфер към тези адреси от корпоративни портфейли като подозрителен), така и като ключ за търсене (да третират наличието на някой от тези низове в неудостоверен конфигурационен файл, артефакт на компилация или машина на разработчика като индикатор за инфекция).
Пакет портфейл на атакуващ
| верига | Адрес |
|---|---|
| Етериум / BSC | 0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Ронин (EVM) | ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Bitcoin | bc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y |
| Bitcoin Cash | bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt |
| Litecoin | ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe |
| Dogecoin | DNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy |
| Тире | XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS |
| Zcash | t1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M |
| DigiByte | DPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH |
| Monero | 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf |
| Солана | DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5 |
| TRON | TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2 |
| TON | UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr |
| Ripple | r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H |
| polkadot | 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG |
| NEAR | 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364 |
| Космос | cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e |
| осмоза | osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t |
| Челестия | celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5 |
| Инжективно | inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh |
| Кава | kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux |
| Хармония | one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a |
| Земя | terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x |
| Algorand | XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI |
| звезден | GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE |
| Cardano | addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f |
| MultiverseX | erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0 |
| Аптос | 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e |
| Sui | 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78 |
| Nano | nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn |
| Filecoin | f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui |
| Tezos | tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk |
| Следователно | 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA |
| Hedera | 0.0.10488092 |
Вериги с покритие на регулярни изрази, но с празни слотове за портфейли в конфигурацията по подразбиране — Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB — не се заместват активно в тази компилация, но се откриват. Третирайте ги като обхват за наблюдение, а не като обхват за заместване.
Атрибуция и мотивация
Кампанията предлага тънка повърхност за атрибуция. Не успяхме да потвърдим самоличността на оператора. Какво можем да запишем:
- Метаданни на издателя. NPM акаунтът дрънкам посочва имейла си като olgascarlet@deltajohnsons.comДомейнът deltajohnsons.com не се свързва с корпоративна идентичност, която можем да потвърдим. NPM акаунтът не показва потвърждение по имейл и не SCM проверка. Няма свързано публично присъствие в GitHub.
- Поле за хранилище. - package.json не носи хранилище поле. Легитимният npm:@juggle/resize-observer сочи към истинско хранилище на GitHub с хиляди звезди и активни задачи. Липсата на връзка към хранилище е най-бързият визуален признак в потребителския интерфейс на npm.
- Плагиатство в README. Пакетът README е легитимният @juggle/resize-observer README байт по байт, включително внос примери, които препращат @juggle/resize-observer самия пакет (не пакета за публикуване). Операторът дори не си е направил труда да пренапише импортираните файлове — често срещан сигнал, че readme файлът е бил премахнат, а не адаптиран.
- Няма инфраструктура, на която да се разчита. Няма C2 крайна точка, няма DNS търсене, няма IP адрес. Злонамереното поведение е напълно капсулирано в локалния клипър плюс твърдо кодирания пакет портфейли. Това прави базираното на домейн или ASN превключване недостъпно. Защитниците, които превключват между кампании, трябва да съпоставят хеш данните на портфейлите с всеки предишен клипър, който имат във файла; повторното използване на портфейл в различни пакети е най-лесно проследимата връзка между кампании.
- Избор на именуване. @jaggle/resizeobserve е с един символ по-различно от @жонглирай и с една интонация разстояние от добре познатото наблюдател на преоразмеряванеКомбинираното разстояние за редактиране е два глифа. Това е умишлен визуален сблъсък, а не общо клекване.
Мотивация, основана на поведението на полезния товар: чиста монетизация чрез опортюнистично заместване на клипборда. Няма събиране на идентификационни данни, няма снемане на пръстови отпечатъци на хоста, няма четене на променливи на средата. Операторът не се интересува коя е жертвата - той се интересува, че следващото прехвърляне на жертвата сочи към един от изброените адреси. Покритието с четиридесет вериги е лотарийният модел в действие: хвърляй широко, надявай се, че един висококачествен пасат ще се приземи веднъж на N инсталации.
Операторът изглежда не се интересува от премахването. Публикуването на девет версии в рамките на два часа под един и същ обхват се чете като дескриптор за публикуване и записване: максимизирайте отпечатъка в системния регистър, преди латентността за премахване да се увеличи, след което продължете напред. Не сме наблюдавали @jaggle препубликуване под нов обхват към момента на писане, но бихме очаквали подобни обхвати (@джаги, @жонглирам-, @джогъл) да се появи през следващите дни, ако операторът е все още активен.
Въздействие, тенденции и какво трябва да правят защитниците
Въздействие
Количественото определяне на въздействието в реални пари не е възможно от текущия набор от данни. Клипърът не записва телеметрия и портфейлите все още не са наблюдавани да получават заместващи преводи към крайния срок за анализ (последващо проучване на изброените вериги е в нашия списък). Легитимните npm:@juggle/resize-observer средно достига седемцифрени седмични изтегляния - цел с висок трафик, грешна типография - и злонамереният пакет е бил активен по-малко от 24 часа към момента на разкриването, което ограничава изложената популация, но не я нулира.
Радиусът на взрива, който си струва да се следи, не е директно изтегляне на @jaggle/resizeobserve — вероятно са малки. Става въпрос за **транзитивни инсталации**: разработчик добавя пакета към sandbox проект, изпълнявайки npm инсталиране...и след това забравяне дали инсталационната кука някога е била изпълнена. Всяка машина, която е обработила слединсталационната операция, сега има похитител на клипборда при автоматично стартиране за всеки потребител, независимо дали проектът все още е на диска. Премахване на директорията на пакета от... модули_възел **не** премахва постоянството.
Възникващи модели
Две тенденции, които тази кампания илюстрира.
npm като обвивка за доставяне на полезен товар на Python. npm tarball е инсталатор от 4 реда; действителният stealer е Python, инсталиран в цялата система от пиукам от пакетната директория. Това не е новост — виждали сме npm пакети да премахват Python и преди — но се превръща в значително по-често срещана форма в крипто-клипър кампаниите. Предимството за оператора е двойно: Python клипборд библиотеки (пайпърклип първи сред тях) са по-чисти и по-платформени от еквивалентите на JavaScript и Повечето автоматизирани npm скенери натоварват JavaScript файловете и Python. .py леко се свръзва. Цената е, че инсталационният отпечатък е много по-шумен - нов pip инсталиране е трудно да се скрие на машина на разработчик, която обикновено не го прави pip инсталиране по време на npm инсталиране.
Платформено-ориентирани имена като единствената стелт технология. Няколко скорошни инструменти за подрязване и кражба на малък полезен товар изцяло се отказаха от обфускацията на ниво код в полза на легитимно изглеждащи етикети за персистентност. python3-dbus-helper, com.apple.python.runtime, и PyRuntimeBroker са учебникарски примери — имена, които един защитник би пропуснал в списък с четиридесет потребителски услуги. Това е евтина, издръжлива форма на скритост: премахването е за всеки пакет, но файловете за съхранение оцеляват след премахването, а услуга, кръстена на реално изглеждащ компонент на платформата, няма да бъде почистена от нищо друго освен от изричен одит.
Какво трябва да направят защитниците
- Одит ~/.config/systemd/user/, ~/Library/LaunchAgents/ и Get-ScheduledTask продукция на машините на разработчиците за записите, изброени в IOC. Премахването на npm пакета ги оставя на място; те трябва да бъдат премахнати ръчно.
- Блокиране на преводи към посочените адреси на портфейли на границите между корпоративния сектор, финансовия отдел и DeFi портфейла, където е наличен списък с разрешени адреси.
- Търсете ~/.config/clipboard-guardian/config.json (и еквиваленти на платформата) в целия парк от машини на разработчика. Наличието на файла е високодостоверна инфекция, независимо от коя версия на пакета го е доставила.
- Търсене в node_modules/ за clipboard_guardian/guardian.py в моментни снимки на кеша за изграждане, които може да са предшествали премахването. MD5 файлът е стабилен във всички рецензирани версии.
- Заключване на заключен файл @juggle/resize-observer (легитимният пакет), така че бъдещите инсталации да не могат да се разрешат с нищо друго при едносимволен печат, особено в работни потоци без lockfile като npx.
- Третиране на всяко извикване на pip install от npm след инсталиране като с висока степен на тежест в строеж-pipeline политика. Няма основателна причина npm пакет да се нуждае от pip по време на инсталиране — Python tooling разпространява Python tooling.
- Търсене на данни за мониторинг, сравними с process_iter(), за процеси с име python3-dbus-helper, които импортират pyperclip — несъответствието в маскировката (D-Bus помощникът, съхраняващ библиотека от клипборда) е най-чистият поведенчески индикатор, който имаме.
- Ротирайте адресите на портфейли, поставени от заразени машини. Похитител на клипборда компрометира пътя между потребителския интерфейс на портфейла и целта за поставяне; адресите, копирани по време на заразяването, могат да бъдат променени незабелязано. Всичко, изпратено по време на прозореца за заразяване, трябва да се третира като потенциално погрешно насочено.
Изводът: постоянството надживява премахването. Регистърът в крайна сметка ще премахне @jaggle/resizeobserve Във всичките девет версии; модулът systemd, LaunchAgent и Scheduled Task няма да се премахнат сами.
Източници
- @juggle/resize-observer на npm — легитимният пакет, който тази типосквот олицетворява; полезен като основа за плагиатството байт по байт в README файла.
- @jaggle/resizeobserves метаданни за системния регистър — публикуване на времеви отпечатъци за деветте злонамерени версии, полезни за криминалистично определяне на времевата линия.





