SlowMist: برنامج JavaScript خبيث لـ Udesk يسرق البيانات ويغير عناوين التحويل

iconMetaEra
مشاركة
AI summary iconملخص
كشفت SlowMist عن نص JavaScript ضار في نظام Udesk، مرتبط بأخبار سلسلة الكتل حول منصات مخترقة مثل mgbx.com و bitxex.io. النص، الذي يُحمّل عبر udeskApi.2026-10-16.cached.js وdeeps.js، يسرق بيانات الجلسة ويغيّر عناوين الإيداع. يستخدم المهاجمون عامل تحميل عن بُعد لحقن الكود، مما يعرض الأموال لخطر السرقة. قد تُضخم بيانات التضخم والتقلبات السوقية الخسائر للمستخدمين المتضررين. وتُبرز هذه الخرق مخاوف أمنية عاجلة عبر عدة بورصات.
كيف يمكن لسكريبت مسموم أن يستهدف بيانات المستخدم والأموال المحولة في نفس الوقت؟

كاتب المقال، المصدر: Slow Mist Tech

السياق

في الآونة الأخيرة، رصد فريق أمني من SlowMist أثناء استكشافه اليومي لبيانات التهديدات، نشاطًا هجوميًا يتضمن تسميم سكريبتات مرتبطة بنظام خدمة العملاء Udesk. وحصل الفريق لاحقًا على عينتين من JavaScript هما udeskApi.2026-10-16.cached.js وdeeps.js، وبدأ تحليلهما لتعقب كيفية استخدام الكود الخبيث لسكريبتات خدمة العملاء للدخول إلى الصفحات، وماذا فعل هذا الكود ببيانات المستخدمين وعمليات الأعمال.

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

استجابة MistEye

MistEye هو نظام متكامل للتهديدات الاستخباراتية والمراقبة الأمنية الديناميكية للويب3، تم تطويره ذاتيًا من قبل SlowMist، ويدمج قدرات المراقبة الأمنية وتجميع الاستخبارات لتقديم تحذيرات فورية عن المخاطر وحماية الأصول للمستخدمين.

تم تحديث المخاطر عبر قنوات إرسال المعلومات وإنذارات العملاء في أسرع وقت ممكن من قبل MistEye.

حمّال ضار وآلية تحميل الحمل عن بُعد

بعد فتح ملف udeskApi.2026-10-16.cached.js، يمكنك رؤية كود الوظائف مثل زر الخدمة، إطار المحادثة، تتبع الزوار، ونقل الرسائل. استمر في فحص نهاية الملف، حيث يوجد دالة مستقلة بعد انتهاء الهيكل الرئيسي: تقوم هذه الدالة بفك تشفير سلسلتين عبر _ud()، وإنشاء عناصر وإدراجها في رأس المستند الحالي.

هذه القطعة لم تكتب اسم العلامة ورابط URL البعيد بشكل مباشر. إذا تم البحث فقط عن اسم النطاق النصي، فقد يُفوّت نقطة التحميل. قمنا بمراجعة تنفيذ _ud() ووجدنا أنه يأخذ حرفين سداسي عشريين في كل مرة، ثم يحولهما إلى حرف؛ بعد توسيع الثوابت، أصبح هدف التحميل واضحًا.

تم فك تشفير 736372697074 إلى script، وتم فك تشفير ثابت آخر إلى https[:]//udeskqlobal[.]com/deeps.js. يجب الحفاظ على التهجئة qlobal التي تبدأ بالحرف q أثناء البحث. يقوم المُحمّل بتعيين السكريبت كغير متزامن، ثم إدراجه في الصفحة؛ عندما يصل التنفيذ إلى هذا الموضع، ويسمح سياسة المتصفح والشبكة، يمكن للرمز البعيد الدخول إلى المستند الحالي.

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

آلية جمع بيانات الويب ونطاق التأثير

يبدأ deeps.js بقراءة window.location.hostname، ثم يولد التكوين C وفقًا لقواعد المواقع الثلاثة. لتحديد الصفحات التي سيتم جمعها، فإن هذه المجموعة من التكوينات وحدها غير كافية: يجب متابعة موقع اتخاذ قرار الخروج لمعرفة ما إذا كانت هذه القواعد تقيّد السكريبت بأكمله أو فقط وحدة معينة منه.

بالنظر إلى تدفق التحكم، نرى أن قراءة ملفات تعريف الارتباط وتخزين الويب، وإرسال لقطة التشغيل، وخطافات النماذج وطلبات المصادقة تظهر جميعها قبل if (!C) return; يتم أخذ أسطر إرسال اللقطة وخطاف XHR في النهاية حسب ترتيب المصدر؛ تشير التعليقات إلى الكود المُحذوف بينهما، والذي يتوافق مع العرض المنسق D:L100 وD:L151–L166.

تم تحديد موقع قرار الخروج ونطاق التأثير: حتى لو لم يتطابق اسم المضيف مع قواعد المواقع الثلاثة، سيقوم السكريبت أولاً بدخول مسار جمع البيانات وتثبيت الـ hooks، ثم يخرج من وحدة العنوان. عند التحقق من الصفحات المكشوفة، لا يمكن الاقتصار على البحث حول تكوينات هذه المواقع الثلاثة فقط.

عند التشغيل، يقرأ الحمل ملفات تعريف الارتباط (Cookie) وlocalStorage وsessionStorage المتاحة على الصفحة الحالية. يمكن لهذه المواقع تخزين حالة تسجيل الدخول وملف المستخدم والبيانات التجارية؛ إذا احتوت على رموز تسجيل دخول لا تزال سارية ويمكن إعادة استخدامها، فقد يستخدم المهاجمها لانتحال جلسة المستخدم. كما يرفق السكريبت عنوان URL للصفحة الرئيسية وأصل المستند الحالي، لتقديم هذه البيانات مع صفحة المصدر.

يتم عملية جمع البيانات مع التحمل خطوة بخطوة. عند فشل قراءة عنوان URL الرئيسي من مصدر خارجي، يستخدم النص البديل "x" ويستمر في معالجة الحقول الأخرى؛ يتم تسلسل نوعي تخزين الصفحات إلى JSON. ويتوقف نطاق ملفات تعريف الارتباط على المحتوى القابل للقراءة من document.cookie، ولا تشمل ملفات تعريف الارتباط HttpOnly.

يحتفظ النص أيضًا بمنافذ للبيانات المقدمة لاحقًا. عند تقديم المستخدم للنموذج، فإنه يمر عبر عناصر input و select و textarea، وينسخ المحتوى غير الفارغ، ثم يستمر في عملية التقديم الأصلية. قد تدخل حقول الموقع التي يملؤها المستخدم فعليًا، مثل اسم المستخدم وكلمة المرور ورمز التحقق، مسارات إضافية لإرسال البيانات، ويمكن استخدامها عند تسريبها للوصول إلى الحساب أو الاستيلاء عليه.

يتم تنفيذ هذا المسار عن طريق تغليف HTMLFormElement.prototype.submit والاستماع إلى أحداث submit في مرحلة التقاط. بالنسبة للصفحات التي ترسل البيانات مباشرة عبر واجهة برمجة التطبيقات، يقوم السكريبت أيضًا بتغليف fetch وXHR: عندما يكون الطلب يحتوي على جسم ويتضمن URL كلمات مفتاحية مثل login|signin|auth|register|signup|password، يتم نسخ المحتوى المقابل والاحتفاظ بالاستدعاء الأصلي للطلب. كما يتطلب فرع fetch أن يكون URL سلسلة نصية، وأن يكون الجسم مستمدًا من خيارات الطلب؛ عند تسلسل FormData وغيرها من الكائنات مباشرة إلى JSON، قد تفتقر البيانات المجمعة إلى الحقول الفعلية.

آلية تسريب البيانات والقنوات الاحتياطية

يُستدعى مدخل جمع البيانات المذكور أعلاه في النهاية نفس الدالة _send(). عند متابعة تتبع هذه الدالة، يمكن ملاحظة أن نقطة الاستقبال الثابتة هي https[:]//udeskqlobal[.]com/c.php. يتم استخدام حقول s و o و c و l و ss في لقطة التشغيل لحمل عنوان الصفحة ومصدرها الحالي وCookie القابل للقراءة وأنواع تخزين الويب؛ ثم تُرسل طلبات النموذج والمصادقة عند تفعيلها كل على حدة.

تقوم الدالة بفصل المعلمات بعد علامة الاستفهام في عنوان URL وإدخالها في جسم طلب POST غير متزامن، مع تعيين Content-Type: application/x-www-form-urlencoded. فيما يلي الحفاظ الكامل على دالة الإرسال (D:L45–L60):

يحتوي مسار الإرسال أيضًا على احتياطي طلب صورة: عند حدوث خطأ في XHR أو حدوث خلل مزامن أثناء الإرسال، ينشئ السكريبت كائن Image، ويعيّن URL مع المعلمات إلى src، ويسعى لنقل البيانات مرة أخرى عبر GET. يُقصَّر URL إلى أول 8,000 حرف جافاسكريبت، وقد لا تكون المحتويات الأطول كاملة.

عند فهم هذا المسار، يجب التمييز بين "إرسال الطلب" و"قراءة الاستجابة". لا يقرأ السكريبت استجابة c.php؛ يمكن إرسال طلب POST عبر المصادر المتنوعة الذي يستوفي شروط الطلب البسيط أولاً، ثم يُقيّد المتصفح قراءة الاستجابة، لذا يمكن أن تحدث أخطاء CORS وإرسال الطلب في نفس الوقت. يجب أن تشمل التحقيقات فحص محتوى POST وبارامترات GET للصورة، بينما يجب التحقق من سياسات الخروج بشكل منفصل لـ connect-src و img-src. كما يمكن أن تؤثر النماذج العادية التي تُثير تصفح المستند على إمكانية إكمال الطلبات غير المتزامنة.

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

استبدال عنوان الإيداع وآلية اختراق الحافظة

بعد if (!C) return;، يدخل السكريبت إلى وحدة العنوان. الآن لديها وظيفة محددة للقواعد الثلاثة الأولى لاسم المضيف: مطابقة mgbx[.]com وbikingex[.] وbitxex[.]io لاختيار منتقيات العناصر الخاصة بالعنوان وزر النسخ لكل صفحة.

لا تحتوي هذه التعبيرات العادية على روابط بداية ونهاية، لذا فإن نطاق مطابقتها أوسع من مقارنة اسم النطاق الدقيق. كما أن قاعدة الصفحة تتحقق أيضًا من location.href الكامل، وتشمل معايير مثل "deposit" و"recharge" و"assets" في معلمات الاستعلام أو الشظايا في عملية التقييم. بعد تطابق الصفحة أو العنصر أو تنسيق العنوان، يقوم السكريبت بمسح كل 200 مللي ثانية، ويحول العناوين المكتشفة للإيداع إلى القيمة المُحددة في الإعدادات. إذا استخدم المستخدم العنوان المستبدل لإتمام تحويل صالح، فسيصبح الوجهة المستقبلة لهذا العنوان.

تستخدم ثلاث فروع مواقع ستة قيم تكوين، مُعلمة بالرمز BTC وEVM وTRON وSolana وLTC وDOGE. يتم التعرف على العناوين بناءً على الشكل الحرفية وترتيب التطابق فقط، دون التحقق من الشبكة التي يختارها المستخدم أو رمز التحقق من العنوان، وقد يؤدي ذلك إلى التعرف الخاطئ على معرفات الأعمال العادية.

استمر في فحص الكود المنسوخ، حيث يمكنك رؤية العينة تؤثر في وقت واحد على عرض الصفحة ومحتوى الحافظة. وهكذا، حتى لو قارن المستخدم عنوان الصفحة مع النتيجة المنسوخة، فقد يحصل على قيم مُعدَّلة متطابقة. المسارات الثلاثة هي:

  • حزمة واجهة برمجة تطبيقات الحافظة. يُستدعى navigator.clipboard.writeText أولاً R() لاستبدال المعلمة، ثم يُمرر إلى الطريقة الأصلية. هذا المسار يخضع فقط لقيود اسم المضيف، ولا يتحقق مرة أخرى من شروط صفحة الإيداع، ولا يعتمد على مسح DOM للعناصر المُصابة.
  • استبدال زر النسخ. يقوم السكريبت بنسخ الزر المطابق، وتثبيت مستمع نقر جديد، واستبدال العقدة الأصلية. يمنع المستمع الجديد الإجراء الافتراضي وانتشار الحدث، ويسعى إلى نسخ العنوان المحفوظ في المتغير المشترك _cur.
  • اعتراض حدث النسخ. عندما يكون _cur غير فارغ وتنطبق قواعد الصفحة، سيتم تغيير محتوى النسخ على document إلى _cur، دون التحقق مما إذا كانت النصوص المحددة من قبل المستخدم هي عناوين.

فيما يتعلق بذلك، فإن واجهة برمجة تطبيقات الحافظة والمستمع copy متجاوران في الشفرة المصدرية (D:L260–L275)، لكن شروط التشغيل مختلفة:

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

كما تم اكتشاف عيب تنفيذي يؤثر على تقييم السلوك في التحليل: يحاول النص قراءة وصف الخاصية الخاص لـ textContent من Element.prototype، بينما يتم تعريف الخاصية القياسية في Node.prototype. في علاقة النموذج القياسية، سيؤدي الوصول اللاحق إلى .set إلى رمي استثناء. بعد فشل هذا الفرع، يتم ابتلاع الاستثناء بواسطة catch؛ ومع مراجعة الشيفرة قبل وبعد، يتضح أن الاستطلاع تم تسجيله بالفعل، وسيتم تثبيت خطافات النسخ اللاحقة وفقًا لشروطها الخاصة. لم يُوقف الخطأ في فرع واحد وحدة اختطاف العنوان.

Summary

بعد تتبع مُحمّل في نهاية سكريبت خدمة العملاء، حددنا هدف الهجوم العيني: جمع البيانات القابلة لاستخدام في انتحال الجلسات أو تسجيل الدخول إلى الحسابات، مع تغيير عناوين الاستلام في صفحات الإيداع وعمليات النسخ إلى القيم المُهيأة. لا تخضع الأولى للقيود المُطبقة على تكوين المواقع الثلاثة، بينما تُفعّل الثانية حسب الموقع ومسار النسخ المحدد، ويجب تغطية سيناريوهات التعرض المختلفة أثناء التحقيق.

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

Recommendation

  1. تأمين وإيقاف توزيع الموارد الملوثة. إذا استمر الإنتاج في تحميل السكريبتات ذات الصلة، فقم بقطع الاتصال في أسرع وقت ممكن بعد حفظ الاستجابة الفعلية، وسلسلة طلب البدء، ومعلومات التخزين المؤقت، ووقت الجمع؛ واستعادة النسخة الموثوقة من مصدر مستقل مُتحقق منه، وتحقق من إعدادات استضافة الموقع وCDN والبناء وإدارة العلامات.
  2. استرجاع تحميل السجلات الخارجية. استعلام مشترك لDomains الخبيثة، مسارين، وقيم تجزئة الملفات؛ تتحقق السجلات الخارجية من محتوى POST وبارامترات GET. عند فحص السكريبتات المضغوطة، ابحث أيضًا عن عناوين URL بالتنسيق السداسي عشري داخل المُحمّل، لتجنب التفويت الناتج عن الفحص فقط للنص العادي.
  3. أوقف المستند الملوث وقم بالتخلص من البيانات المكشوفة. أغلق الصفحات أو مستندات WebView ذات الصلة بالكامل لتجنب إعادة تحميل الموارد القديمة. بناءً على نطاق التعرض الفعلي، ألغِ الجلسات وغيّر الرموز المميزة وكلمات المرور من بيئة نظيفة؛ حذف علامات script لن يلغِي الـ hooks والمؤقتات المثبتة بالفعل.
  4. تحقق بشكل مستقل من عنوان الإيداع والمعاملة. بالنسبة للصفحة التي تنفذ الحملة، تحقق من عنوان الإيداع الأصلي والمعاملات ذات الصلة وهدف التحويل الفعلي عبر قنوات موثوقة، وقم بتقييم التأثير بناءً على سجلات المعاملات.
  5. تحقق من السكريبتات وقيود تصدير البيانات. دمج إعدادات العمل للتحكم في مصدر السكريبتات وسلامتها، وتحقق من سياسات connect-src وimg-src على التوالي، وقيّد تحميل السكريبتات وتصدير البيانات لـ udeskqlobal[.]com.

IOC

Domain

udeskqlobal[.]com

URL

https[:]//udeskqlobal[.]com/deeps[.]js

https[:]//udeskqlobal[.]com/c[.]php

Wallet address

BTC: bc1qhzppfj69ywp22swj50jwcfxdamg3ym245srng9

EVM: 0x9B6EcD0023a28E1391c5124eCe578A9751A337b2

TRON: TH4L5YAhhxtC8qALbZKbPZZgausbGi25nF

سولانا: AFmCUe3nNbjTaC585CcdA3vvC9iWVR8YunooFKpaQx2Z

LTC: ltc1qwz0zp39ywl34kahvn9lyk7j5x63wsy9tcxhm3w

DOGE: DAoy2w8uvFtZ92q87s9qKEoHbWgV7mVThj

ملف ضار

اسم الملف: udeskApi.2026-10-16.cached.js

SHA256: 45b4e8f160d8d5177819f6c1dc67acc7abbdc65eeaffc909e668799dc778bcf6

اسم الملف: deeps.js

SHA256: 57c1441c4f5bb3260981a2df64f9ff35f117abde0d8667c8c66a047880074c59

حول MistEye

MistEye هي منصة متطورة للذكاء الاستخباراتي للتهديدات وأمن الويب3 تم تطويرها ذاتيًا من قبل SlowMist، وتقدم عبر واجهة برمجة التطبيقات قدرات الكشف عن الأنشطة الضارة وتنبيهات مخاطر سلسلة التوريد لبيئة حزم المصدر المفتوح.

تم دمج جميع الحزم الضارة ومؤشرات التهديد (IOCs) المتعلقة بهذه الحملة في محرك كشف التهديدات MistEye، حيث يمكن للمطورين استخدام API للكشف التلقائي عن تبعيات المشروع، وتحديد بسرعة ما إذا كانت تتطابق مع حزم ضارة معروفة، والحصول على توصيات للتعامل معها.

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