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

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

يتم شحن الحزم تحت أسماء مثل charlie-kirk، وilovefemboys، وmiguelphonk، ويحمل كل منها تطبيق وكيل يحمل العلامة التجارية “Lucide” ويرتدي زي صفحة مقصودة للدروس الخصوصية تسمى Riverbend Tutoring أو Northstar Tutoring.

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

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

حصدت دودة Shai-Hulud ذاتية التكرار، والتي وصلت إلى أكثر من 500 حزمة في سبتمبر 2025، أسرار المطورين وأعادت نشر نفسها باستخدام الرموز المسروقة. قبل أيام من ذلك، قام هجوم تصيد احتيالي على المشرف المعروف باسم qix بإدخال كود استنزاف المحفظة إلى الطباشير وتصحيح الأخطاء و16 حزمة أخرى مع مليارات التنزيلات الأسبوعية فيما بينها.

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

قامت شركة SafeDep بفهرسة 141 من الحزم في شهر مايو، وقرأت العملية على أنها برامج إعلانية وإساءة استخدام للسجل: إعلانات منبثقة، ونصوص برمجية لتحقيق الدخل من طرف ثالث، وتتبع Google Analytics مثبتة على وكيل Scramjet الذي يستهدف الطلاب. وهذا ما صمد لما كان مرئيًا على السطح.

قام JFrog بسحب الخيط إلى أبعد من ذلك. قام الفريق بإزالة التشويش من حزمة إدخال التطبيق، وهي سطر واحد بحجم 5.4 ميغابايت من JavaScript تم تفكيكه في أكثر من 20600 سطر من التعليمات البرمجية القابلة للقراءة، واستعاد الحمولات المؤرشفة من Wayback Machine لإعادة بناء الجدول الزمني للحملة.

توجد وحدتان تحت برنامج الإعلانات المتسللة، ويتم تشغيلهما قبل عرض واجهة React.

الأول، الذي يدعو JFrog G2، عبارة عن أداة تحميل البرامج النصية عن بعد، وتقوم بجلب التعليمات البرمجية بشكل غير آمن قدر الإمكان. فهو يسحب JavaScript من مستودع GitHub من خلال jsDelivr CDN، ويشير إلى الفرع الرئيسي القابل للتغيير بدلاً من الالتزام المثبت، ولا يشحن أي فحص لتكامل الموارد الفرعية، ويشغل كل ما يعود بامتيازات الأصل الخاصة بموقع الوكيل: الوصول الكامل إلى ملفات تعريف الارتباط والتخزين المحلي ونقاط النهاية ذات الأصل نفسه.

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

الروبوتات DDoS

كان المستودع يعيد 404 بحلول الوقت الذي ظهر فيه JFrog، ولكن نسخة مؤرشفة من 30 مايو حافظت على ما كان يقدمه: فيضان HTTP الخام. كل 500 ميلي ثانية، يبني البرنامج النصي سلسلة جديدة مكونة من مليون حرف ويطلقها على شكل مشاركة بدون كور على cdn.caan.edu، والتي يحددها JFrog على أنها المجال العام لمدرسة التمريض في ماتيسون، إلينوي.

الطلبات لا تنتظر الرد أبدًا، لذا فهي تتراكم. يقوم JFrog بتسجيل كل زائر نشط بمعدل 2 ميجا بايت تقريبًا في الثانية من التحميل، مما يعني أن ألف علامة تبويب وكيل مفتوحة ستدفع حوالي 2 جيجا بايت في الثانية نحو الهدف. تهزم معلمة الاستعلام العشوائية وكلاء التخزين المؤقت، ولا يتخطى no-cors الاختبار المبدئي لـ CORS، لذلك لا شيء يخنق الحزم.

الوحدة الثانية، I2، هو الأكثر حدة. فهو يجلب ملفًا نصيًا عاديًا، websocket.txt، ويحمل عنوان URL المستهدف لـ WebSocket وعدد مقابس يتراوح بين 1 و1024، ثم يفتح العديد من الاتصالات في حلقة متداخلة. استهدف التكوين المؤرشف كل متصفح بـ 30 اتصالاً بنقطة نهاية Wisp على القمر[.]أعلى، وهو في حد ذاته وكيل مباشر مشغول بإدخال إعلانات ضارة.

Wisp عبارة عن بروتوكول Mercury Workshop منخفض الحمل لتوصيل العديد من مقابس TCP وUDP عبر WebSocket واحد، ومن الشائع تقليد هذه الحزم في نفس مشهد الخادم الوكيل.

بمجرد الاتصال، يقوم كل متصفح بتعيين المقبس الخاص به على الوضع الثنائي، ويرسل كل 100 مللي ثانية إطار Wisp CONNECT صالحًا متبوعًا بإطار CLOSE، وكلاهما يشير إلى المضيف المحلي:1. الإطارات عبارة عن حزم Wisp صحيحة، وبالتالي فإن الهدف ليس جهاز الطالب الخاص. إنه خادم Wisp البعيد الموجود في الطرف البعيد من الاتصال.

وهذا يجعله هجومًا بطائرة تحكم وليس هجومًا حجميًا. يمكن لمتصفح واحد يشغل 1024 مأخذًا كاملاً أن يدفع خادم Wisp لتخصيص وتمزيق حوالي 10240 اتصالًا في الثانية أثناء كتابة أكثر من 20000 سطر سجل في نفس الامتداد.

يلاحظ JFrog أن عقدة خادم wisp الخاصة بـ Mercury Workshop تفتح مقبسًا جديدًا لكل إطار CONNECT دون التحقق مما إذا كانت الوجهة عبارة عن استرجاع أو عنوان خاص، وتقوم بتسجيل كل محاولة. يؤدي ذلك إلى استنفاد واصفات الملفات، وزيادة تخزين السجلات، وإسقاط الوكيل. تم إهمال عقدة خادم wisp بالفعل؛ يقوم المشرفون عليها بتوجيه المستخدمين إلى مكان آخر حول هذه الفئة من مشكلات الأمان والاستقرار بالضبط.

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

البنية التحتية متجمعة بإحكام وليست مبنية للاختباء. تتبعت JFrog التصميمات إلى مؤسسة GitHub تُدعى lucideproxy والتي تم تسجيل حساباتها بفارق ثوانٍ، مرتبطة ببريد إلكتروني للالتزام على geeked[.]وتف ومقبض الخلاف. تم العثور على تسعين من أسماء مضيفي النشر البالغ عددها 93 والتي تم حلها لعنوان IP واحد، 92.38.177[.]17، باستضافة G-Core Labs.

بين أسماء حزم الأحداث، ونص برمجي تلقائي للنشر داخل كرات القطران، وتعليق “TY WAVES + CHTGPT ILY” الذي وجدته SafeDep في عامل الخدمة، قرأت الشركتان المشغل على أنه شاب. أرسل أحد الحسابات 116 حزمة في أقل من 35 دقيقة، ولم يفعل npm شيئًا لإبطائه.

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

أدت الموجة الثانية في 8 يوليو، بموجب حساب جديد، إلى رفع العدد الإجمالي إلى 148 حزمة وشحن النسخة المنظفة والمخصصة لبرامج الإعلانات المتسللة فقط. لا يزال التطبيق غامضًا، ولا يزال يقوم بتحميل البرامج النصية للجهات الخارجية من نطاقات المهاجم، ولا يزال المُحمل يشير إلى فرع قابل للتغيير. لم تختف قدرة DDoS، بل تم إيقافها فقط. يلاحظ JFrog أن المشغلين يحتفظون بالقدرة على إعادة تسليحه: يلتزم أحدهم بهذا الفرع القابل للتغيير، ولا يلزم تحديث الحزمة.

تم منذ ذلك الحين سحب العديد من حزم الحملة من npm واستبدالها بالعنصر النائب القياسي للأمان 0.0.1 الخاص بالسجل. تم العثور على فحص مفاجئ أجرته The Hacker News عبر عائلات الحزم في 14 يوليو 2026، ولكن تشارلي كيرك لا يزال يقدم الإصدارين اللذين تم وضع علامة JFrog عليهما على أنهما ضاران، 2.0.0 و3.0.1.

نظرًا لأن التهديد يأتي كتطبيق ويب من جانب العميل بدلاً من عملية زرع وقت التثبيت، فإن علاج JFrog يتبع طريقة التسليم.

يجب على المسؤولين في شبكات المدارس والشركات، حيث يجذب هؤلاء الوكلاء أكبر قدر من حركة المرور، حظر نطاقات الحملة على مستوى DNS. لا يزال الإصدار الحالي من المضيفين لتحقيق الدخل والبرنامج النصي يصل، من بينهم woofbeginner[.]كوم وc.vipersfutbol[.]com، هم من يجب حظرهم أولاً.

يجب على أي شخص قام بتحميل أحد مواقع الوكيل أن يقوم بمسح ذاكرة التخزين المؤقت للمتصفح والتخزين المحلي وإلغاء تسجيل أي عامل خدمة تركه مجال التدريس أو الوكيل. يجب على الفرق التي جلبت بيئات البناء الخاصة بها الحزم المسماة أن تسحبها من البيانات وملفات القفل وتعيد البناء بشكل نظيف. تحتوي كتابة JFrog على قائمة كاملة تضم 148 حزمة ومجالًا وعناوين IP وتجزئة.

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

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

شاركها.
اترك تعليقاً