في 14 يوليو 2026، فتح أحد المهاجمين 37 طلب سحب إلى مستودع مولد AsyncAPI. حاول الجميع تقريبًا إضافة صفحة تبرعات خيرية مزيفة. تمويهًا في الضوضاء، استغل مسؤول علاقات عامة واحد سير عمل GitHub Actions الذي تم تكوينه بشكل خاطئ لسرقة رمز وصول شخصي مميز للغاية.
تم نشر أربع حزم npm ضارة (خمسة إصدارات إجمالية) ضمن @asyncapi مساحة الاسم. تحتوي الحزم على حمولة متعددة المراحل تثبت الثبات وتتصل بالبنية التحتية للقيادة والتحكم. تشهد هذه الحزم مجتمعة أكثر من 140.000 عملية تنزيل يوميًا. في هذه الحالة، يتم تنفيذ الحمولة عند الاستيراد/الطلب، وليس عند التثبيت.
لا يبدو أن هذا مرتبط بشكل مباشر بالتسوية السابقة @asyncapi في هجوم شاي خلود 2.0.
ماذا حدث؟
استغل المهاجم فئة الثغرة الأمنية المعروفة باسم “طلب pwn” في إجراءات GitHub. ال asyncapi/generator يحتوي المستودع على ملف سير العمل الذي تم استخدامه pull_request_target لتشغيل طلبات السحب، ولكن بعد ذلك قم بفحص رمز طلب السحب بدلاً من الفرع الأساسي.
وهذا أمر خطير لأن pull_request_target يعمل في سياق المستودع الأساسي مع إمكانية الوصول الكامل إلى الأسرار. عندما يقوم سير العمل بفحص التعليمات البرمجية التي يتحكم فيها المهاجم من طلب السحب وتنفيذها، يصبح الوصول إلى هذه الأسرار ممكنًا.
لسوء الحظ، احتمال وجود هذه الثغرة الأمنية تم التعرف عليها قبل أشهر من الهجوم. في 29 أبريل، فتح أحد المساهمين العلاقات العامة للتحقيق في المشكلة باستخدام حمولة إثبات المفهوم. وفي 17 مايو، تابعوا إصلاحًا مقترحًا يقسم سير العمل إلى وظيفتين منفصلتين لعزل الوصول السري عن التعليمات البرمجية غير الموثوق بها. كان هذا الإصلاح لا يزال مفتوحًا، وغير مدمج، عندما ضرب المهاجم بعد 58 يومًا.
في الساعة 05:08 بالتوقيت العالمي، فتح المهاجم PR #2155 الذي يحتوي على ملف تخفيض السعر مع JavaScript غامض مخفي بعد حوالي 1000 بايت من المسافة البيضاء. تم تصميم الحمولة لفحص بيئة تشغيل GitHub Actions بحثًا عن الأسرار وإخراجها إلى عنوان URL ميت على ملف لصق Rentry.co.
أشارت المراجعة الآلية إلى التشويش، وعلى الرغم من أنه لم يتم دمج العلاقات العامة مطلقًا، إلا أن الضرر قد حدث بالفعل. اكتمل سير العمل في الساعة 05:16 بالتوقيت العالمي وتمكن المهاجم من استرداد بيانات الاعتماد المسروقة.
يبدو أن الرمز المميز الذي تم اختراقه هو PAT ينتمي إليه asyncapi-bot، حساب خدمة يتمتع بإمكانية الوصول عبر مؤسسة AsyncAPI.
تم نشر الحزم الضارة
باستخدام تقنية PAT المسروقة، أرسل المهاجم التزامًا ضارًا مباشرةً إلى الفرع “التالي” في الساعة 06:58 بالتوقيت العالمي المنسق. أدى هذا إلى تشغيل سير عمل الإصدار، والذي نشر الحزم الثلاث الأولية المخترقة إلى npm في الساعة 07:10 بالتوقيت العالمي.
ثم تحول المهاجم إلى asyncapi/spec-json-schemas المستودع، ودفع 11 التزامًا بين الساعة 07:51 والساعة 08:28 بالتوقيت العالمي المنسق. نسختان ضارتان إضافيتان من @asyncapi/specs تم نشرها.
تحتوي جميع الإصدارات الخمسة على نفس الحمولة التي تم حقنها في ملفات مختلفة. يتم إخفاء التعليمات البرمجية الضارة في السطر الأول من ملفات المصدر الشرعية، مع ترك مسافة بيضاء عليها لدفعها خارج الشاشة في معظم المحررين.
اتصالات لهجمات أخرى
تشترك الحمولة في بعض الخصائص التقنية مع إطار عمل البرامج الضارة Miasma الذي تم توثيقه مسبقًا في هجمات سلسلة التوريد. تستخدم طبقة التشويش javascript-obfuscator مع أبجدية Base64 مخصصة، نفس التكوين الذي شوهد في الحوادث السابقة.
يُعرّف وقت تشغيل المرحلة 3 بشكل صريح بأنه "M-RED-TEAM v6.4" في تعليقات التعليمات البرمجية التي تصف تشفير المنارة وبروتوكولات الاتصال C2. مجموعات ملفات التكوين المستخرجة giteaPackagesOrg ل "miasma-test-org." تستخدم الحمولة miasma-monitor.service ضمن رمز الثبات. يستخدم Nostr Relay C2 "miasma” العلامات ذات العلامات التجارية.
ومع ذلك، فإن عنوان URL الخاص بـ Rentry يستخدم الارتباط التقريبي "elzotebo," مطابقة أنماط التسمية من حملة prt-scan، والتي تم ربطها بهجمات سابقة تعتمد على طلب السحب. ال prt-scan لم يتم ربط الحملة بـ Miasma.
وبعيدًا عن المراجع وطريقة التشويش الأولية، تحتوي الحمولة على الحد الأدنى من التشابه مع حمولات Miasma وShai-Hulud السابقة. بدلاً من الفيروس المتنقل، يبدو أنه يحتوي على إطار أوامر كامل مع إمكانيات حصان طروادة الكلاسيكية (Dirlist, GetFile, PutFileوما إلى ذلك) مع اتصال مباشر بالبنية التحتية للقيادة والسيطرة.
في هذا الوقت، نحن لا نقوم بأي إسناد نهائي.
الحمولة
تتبع الحمولة سلسلة عدوى مرحلية:
-
يتم تنفيذ المرحلة الأولى عند استيراد الحزمة. إنه يولد عملية فرعية منفصلة تقوم بتنزيل المرحلة التالية من IPFS، وحفظها في دليل خاص بالنظام الأساسي:
-
لينكس:
~/.local/share/NodeJS/sync.js -
ماك:
~/Library/Application Support/NodeJS/sync.js -
ويندوز:
%LOCALAPPDATA%\NodeJS\sync.js
-
-
المرحلة الثانية عبارة عن حزمة مشفرة بحجم 8.25 ميجابايت تم استردادها من IPFS. أنه يحتوي على بيانات التكوين ووقت التشغيل الرئيسي.
-
المرحلة الثالثة عبارة عن إطار عمل ضار مكون من 92000 سطر مع بنية معيارية. إنه يؤسس للاستمرارية عبر خدمات مستخدم systemd على Linux ويتواصل مع البنية التحتية للقيادة والتحكم عبر قنوات متعددة بما في ذلك HTTP، ومرحلات Nostr، وعقود Ethereum الذكية، وشبكة libp2p الشبكية.
تتضمن الحمولة إمكانات سرقة بيانات الاعتماد التي تستهدف كلمات المرور وملفات تعريف الارتباط المحفوظة في المتصفح (Chrome وBrave وFirefox وEdge) ومفاتيح SSH ورموز npm وGitHub وبيانات اعتماد AWS وmacOS Keychain ومحافظ العملات المشفرة. بمجرد التثبيت، يبدو أن البرنامج الضار يقبل الأوامر عن بعد لعمليات الملفات، وقائمة الدليل، واستخلاص البيانات.
ما هي الخطوات التي يجب على فرق الأمن اتخاذها؟
اكتشفت Wiz هذا الهجوم من خلال نظامها الآلي لمراقبة الحزم الضارة وأضافت على الفور الكشف القائم على التجزئة إلى قاعدة بيانات السمعة الخاصة بها متبوعًا بإصدار استشاري واكتشاف قائم على الحزم، مما يتيح الحماية السريعة لعملاء Wiz قبل الكشف على نطاق أوسع.
-
يجب على المؤسسات التحقيق على الفور في محطات عمل المطورين وبيئات CI/CD والمستودعات بحثًا عن علامات التسوية. يجب على الفرق مراجعة الأنظمة للحزم المتأثرة.
| طَرد | إصدار |
|---|---|
| @asyncapi/generator | 3.3.1 |
| @asyncapi/generator-helpers | 1.1.1 |
| @asyncapi/generator-components | 0.7.1 |
| @asyncapi/المواصفات | 6.11.2 |
| @asyncapi/المواصفات | 6.11.2-alpha.1 |
-
نظرًا لأن البرامج الضارة تستهدف بيانات اعتماد المطورين وأسرارهم، يجب على المؤسسات افتراض التعرض المحتمل لرموز GitHub المميزة ومفاتيح SSH وبيانات الاعتماد السحابية وأسرار CI/CD وتدويرها وفقًا لذلك.
-
أخيرًا، يجب على المؤسسات تعزيز دفاعات سلسلة توريد البرامج من خلال تنفيذ قائمة التبعية المسموح بها، وإنشاء SBOM، والتحقق من الحزمة، وتحسين مراقبة بيئات التطوير والبناء.
كيف يمكن أن يساعد الحذق؟
يجب على عملاء Wiz الرجوع إلى النصائح المعدة مسبقًا في Wiz Threat Intel Center للحصول على خطوات قابلة للتنفيذ للتحقيق في بيئاتهم ومعالجتها وتقويتها. ستواصل Wiz Research تحديث هذه النصائح مع تطور الوضع.
مؤشرات التسوية
| فئة | مؤشر | تفاصيل |
|---|---|---|
| SHA1 | 22bf76fe317ea6769bd38619bd440e42d119bd6b | الملف الضار validator.js (المولد) |
| SHA1 | a7e18d96efd3cdb127ef4cdcad9e3ad26c482bf2 | ملف utils.js الضار (مساعدو المولدات) |
| SHA1 | 9890950adcbc2478e7a080234f053214adbad44e | الملف الضار ErrorHandling.js (مكونات المولد) |
| SHA1 | c70e105e212ff3c1daa04bb2a62507717f296b0b | ملف Index.js الضار (المواصفات) |
| SHA1 | c8cb3f6d5b90c46686d2bf531dc1a5786e27edc5 | حمولة sync.js المرحلة الثانية |
| الملكية الفكرية | 85.137.53.71 | خادم C2 (المنافذ 8080، 8081) |
| ايثريوم | 0x12c37A86a0Ed0beBe5d1d6a43E42f07860eAc710 | العقد الاحتياطي C2 |
| ايثريوم | 0x1969ab05d67b67fdcaa26240f738ccb077e1cd84 | عقد احتياطي |
| ايثريوم | 0x92d4C5413e4F7B258a114964101F9e1C6d64C6Ba | محفظة الناشر |
| إيبفس | QmQobZSp1wRPrpSEQ56qnyq7ecZh5Bg5k1fnjt4SUwwHb9 | حمولة المرحلة 2 |
| إيبفس | Qmet4fhsAaWMBUxNDfREHwgiyDeSWy4YSYs9wiKUW5jGyf | حمولة المرحلة الثانية (متغير React-sdk) |
| ملف | ~/.local/share/NodeJS/sync.js | الحمولة المستمرة |
| خدمة | miasma-monitor.service | ثبات النظام |
| اِختِصاص | ipfs[.]io | تسليم الحمولة |
| اِختِصاص | Rentry[.]شركة | الترشيح الرمزي |
