Transcript
00:00:00يعود شاي هولود (Shai Hulud) مجدداً في جزء رابع.
00:00:02هذه المرة يستهدف حزمًا مثل تان ستاك (TanStack)،
00:00:04حرفيًا بعد ساعات من نشري لهذا الفيديو عن نيكست جي إس (Next.js)،
00:00:07وهو توقيت كان رائعًا مني.
00:00:08هذا الهجوم هو في الواقع هجوم ضخم على سلسلة توريد NPM
00:00:11تؤثر على أكثر من مجرد TanStack.
00:00:13كما طال حزمًا مثل يو آي باث (UiPath)، وميسترال (Mistral)،
00:00:15و160 حزمة أخرى،
00:00:17وحتى حزم بايباي (PyPy) مثل Guardrails.ai.
00:00:20ما يجعل هذا الهجوم أكثر إثارة
00:00:22هو احتواؤه على مفتاح قتل (Deadman switch)،
00:00:24لذا إذا اكتشف أنك قمت بتغيير مفاتيحك المسروقة،
00:00:26فإنه سيمسح جهاز الكمبيوتر الخاص بك بالكامل،
00:00:28وحتى أنه تضمن بعض السياسات العالمية.
00:00:30فلنبدأ الغوص في التفاصيل.
00:00:36في هذا الجزء، لدى الدودة نفس الهدف،
00:00:39سرقة بيانات الاعتماد من أجهزة المطورين ومشغلات CI/CD،
00:00:42ثم استخدام تلك البيانات للوصول إلى المزيد من الحزم.
00:00:44بالنسبة لـ TanStack، عنى ذلك نشر 84 إصداراً ضاراً
00:00:47عبر 42 حزمة من حزم TanStack في دقائق معدودة فقط.
00:00:51الآن، سأشرح كيف تمكنوا
00:00:52من اختراق TanStack في المقام الأول،
00:00:54ولكن دعونا نرى أولاً ما تفعله البرمجية الضارة
00:00:56إذا قمت بتثبيت إحدى هذه الحزم المتضررة.
00:00:58داخل الحزم الضارة،
00:00:59ستجد ملفاً جديداً يسمى routerinit.js،
00:01:02بالإضافة إلى تبعية اختيارية تم حقنها،
00:01:04والتي تؤدي إلى ما يبدو
00:01:05كرابط GitHub شرعي لجهاز توجيه TanStack،
00:01:08لكنه في الواقع التزام (commit) يتيم على نسخة المهاجم.
00:01:10هذه هي الطريقة التي يتعامل بها GitHub مع روابط النسخ (forks)،
00:01:13لذا يمكن أن يبدو الرابط وكأنه
00:01:14ينتمي إلى المشروع الأصلي،
00:01:16على الرغم من أن الالتزام هو في الواقع من نسخة فرعية.
00:01:18في تلك النسخة، يوجد نص برمجي لدورة الحياة،
00:01:20وهو 'prepare'، يقوم بتشغيل 'bun run task runner JS'،
00:01:22وينتهي بأمر 'exit one'.
00:01:24هذه مجرد طريقة ذكية لجعل التبعية الاختيارية تفشل
00:01:27بعد تشغيل الحمولة البرمجية،
00:01:28ليستمر التثبيت بشكل طبيعي،
00:01:30ويترك آثارًا أقل وضوحًا في سجلات التثبيت الخاصة بك.
00:01:33أيضًا، قد تلاحظ أن هذا ليس تشغيلًا
00:01:35لملف routerinit.js الذي قلت إنه تم حقنه
00:01:37في الحزم في البداية،
00:01:38ولكن في الوقت الحالي، فقط فكر في هذين الملفين
00:01:40على أنهما يؤديان نفس الدور تمامًا بأسماء مختلفة.
00:01:42الخلاصة هي، عندما تقوم بتثبيت هذا،
00:01:44فإنه سيقوم بتشغيل هذا النص البرمجي.
00:01:46أول شيء يحاول النص البرمجي القيام به
00:01:47هو فصل نفسه عن تدفق التثبيت الواضح،
00:01:50لذا سيتحقق مما إذا كان يعمل بالفعل
00:01:51في الخلفية، وإذا لم يكن كذلك،
00:01:53فإنه يقوم بإنشاء نسخة منفصلة من نفسه
00:01:54وينهي النص البرمجي الرئيسي بشكل نظيف.
00:01:57بهذه الطريقة، سجلات تثبيت npm الخاصة بك
00:01:58لا تظهر أيًا من مخرجات النص البرمجي
00:02:00لأن البرمجيات الخبيثة قد فصلت نفسها الآن
00:02:01عن تلك العملية وتعمل في الخلفية.
00:02:04بعد ذلك، يقوم بشيء ذكي حقًا.
00:02:06يكتب نسخًا من نفسه
00:02:07داخل مجلد خطافات (hooks) كود كلود (Claude Code) الخاص بك،
00:02:08ثم يقوم بتهيئة إعدادات كلود الخاصة بك
00:02:10لتشغيل هذا الخطاف في أي وقت تستخدم فيه كلود كود
00:02:12في ذلك المشروع.
00:02:13بهذه الطريقة، يمكنه البقاء بعد التثبيت الأصلي
00:02:16والاستمرار في إعادة التشغيل في كل مرة
00:02:17تفتح فيها كلود كود في ذلك المشروع.
00:02:20إنه في الواقع يفعل الشيء نفسه مع مشغل مهام في إس كود (VS Code)،
00:02:22حيث ينسخ نفسه هناك،
00:02:23لذا إذا كنت تستخدم ميزات التشغيل التلقائي لمساحة عمل في إس كود،
00:02:26فأنت تواجه نفس المشكلة تمامًا.
00:02:28حتى أنه يقوم بإعداد خدمة على مستوى نظام التشغيل
00:02:29تسمى مراقب رموز غيت هاب (GitHub Token Monitor)،
00:02:31لكننا سنعود إلى ذلك لاحقًا
00:02:32لأن ذلك الأمر شيطاني تمامًا.
00:02:34إنه أمر شيطاني أيضًا
00:02:35أنك لم تشترك بعد.
00:02:37الشيء التالي الذي تفعله الحمولة البرمجية
00:02:38هو البدء في سرقة بيانات اعتمادك،
00:02:40وهو يحاول فعل كل شيء.
00:02:41في إجراءات غيت هاب (GitHub Actions)، يبحث عن بيانات الاعتماد
00:02:43والأسرار في بيئة التشغيل.
00:02:45وبشكل أكثر تحديدًا، يقوم بمسح ذاكرة عملية
00:02:47تشغيل إجراءات غيت هاب
00:02:48للحصول على أسرار سير العمل الخاصة بك
00:02:50بما في ذلك الأسرار المخفية (masked secrets)،
00:02:52بل إنه يدرج سير عمل مزيفاً على GitHub يبدو كأنه أداة CodeQL
00:02:55يقوم بتسلسل أسرار المستودع الخاصة بك
00:02:57ويقوم باستخراجها لاحقًا.
00:02:58كما أنه يبحث عن أسرار خدمة أمازون (AWS)،
00:03:00حيث يبدأ أولاً بمتغيرات البيئة
00:03:02وملفات التكوين المحلية،
00:03:03ولكنه ينتقل أيضًا إلى خدمات بيانات وصف أمازون
00:03:06مثل IMDS v2 وبيانات وصف مهمة نظام حاويات أمازون (ECS).
00:03:09بالنسبة لـ كوبيرنيتيس (Kubernetes)، فإنه يسرق رموز حساب الخدمة
00:03:11والشهادات التي تسمح له بالوصول إلى واجهة برمجة التطبيقات داخل الكتلة
00:03:14لأي صلاحيات تحكم في الوصول المستندة إلى الأدوار (RBAC)
00:03:17التي كان يمتلكها حساب خدمة تلك الحاوية،
00:03:19والتي في الكتل سيئة التكوين
00:03:21يمكن أن تكون واسعة النطاق للغاية،
00:03:22في بعض الأحيان تصل إلى صلاحيات المدير.
00:03:24ولجعل الأمر أسوأ،
00:03:25فهو يستهدف أيضاً HashiCorp Vault،
00:03:27حيث يجمع كل متغيرات البيئة والرموز
00:03:29الخاصة بـ Vault،
00:03:30ثم يستخدم أي صلاحيات وصول لـ Kubernetes يمتلكها
00:03:32لاسترجاع كل الأسرار التي يديرها Vault.
00:03:34وكل ذلك مجرد ما يفعله
00:03:35ببيئات النشر الخاصة بك.
00:03:37إذا كان على محطة عملك،
00:03:38فإنه يستهدف كل مفاتيح SSH الخاصة بك،
00:03:39وبيانات اعتماد NPM،
00:03:41وبيانات اعتماد Git،
00:03:42وسجل الأوامر،
00:03:43وبيانات اعتماد مزود السحابة،
00:03:44ومفاتيح التشفير،
00:03:45وملفات Signal،
00:03:45وSlack،
00:03:45وملفات Discord.
00:03:46وفوق كل ذلك،
00:03:47يستخرج سجل جلسات Claude Code.
00:03:49لذا إذا سبق وأعطيت Claude بيانات اعتماد
00:03:51أو سمحت له بقراءة ملفات تحتوي على بيانات اعتماد،
00:03:53فإن لديه صلاحية الوصول إليها أيضاً.
00:03:55لذا نعم، كما قلت،
00:03:56كانوا يسعون خلف كل شيء
00:03:57يمكنهم وضع أيديهم عليه،
00:03:58ثم يقومون بتسريب هذه البيانات
00:04:00عبر شبكة المراسلة Session.
00:04:02وكخطوة احتياطية،
00:04:02قاموا أيضاً بوضع هذه البيانات المسروقة
00:04:04في مستودعات GitHub.
00:04:05وتماشياً مع طابع هجماتهم،
00:04:07تمت تسمية هذه الفروع بأسماء مستوحاة من رواية “كثيب” (Dune).
00:04:09لقد حصلوا على بيانات اعتمادك.
00:04:11لا يمكن أن يزداد الأمر سوءاً، أليس كذلك؟
00:04:12حسناً، نعم.
00:04:13نعم، يمكن ذلك.
00:04:14وفوق كل ذلك،
00:04:15إذا تذكرت الخدمة
00:04:16التي قلت أنها تُثبّت على جهازك،
00:04:18حسناً، تلك الخدمة تراقب رموز GitHub الخاصة بك
00:04:19وتستمر في إعادة تسريبها.
00:04:21ولكن أيضاً في كل دقيقة،
00:04:22تتحقق مما إذا كان الرمز لا يزال صالحاً.
00:04:24وإذا لم يكن كذلك،
00:04:25تقوم بتنفيذ أمر الحذف (rm -rf) على دليل المستخدم الخاص بك،
00:04:27ما يؤدي لمسح كل شيء.
00:04:28تحاول أيضاً إنشاء رمز NPM
00:04:30باستخدام بيانات اعتمادك،
00:04:31مع وصف يقول:
00:04:32إذا قمت بإلغاء هذا الرمز،
00:04:33سنقوم بمسح كمبيوتر المالك،
00:04:35مما يعني أنها تفعل الشيء نفسه
00:04:36بالنسبة لرموز NPM أيضاً.
00:04:38لذا إذا قمت بإلغاء هذه الرموز
00:04:39قبل عزل جهازك
00:04:40وإزالة تلك العملية الخلفية،
00:04:42فيمكن للبرمجية الخبيثة أن تدمّر جهازك ذاتياً،
00:04:44وهو أمر شيطاني تماماً.
00:04:46وكإشارة جانبية هنا،
00:04:47نسخة بايثون من هذا الهجوم
00:04:48تفعل الشيء نفسه تقريباً،
00:04:49لكنها تتضمن أيضاً فحصاً
00:04:51لمعرفة ما إذا كانت لغة جهازك هي الروسية.
00:04:53إذا كانت كذلك،
00:04:53فإنها تتوقف ببساطة.
00:04:54وإذا بدا أن جهازك
00:04:55من إسرائيل أو إيران،
00:04:56فإنها تولد رقماً عشوائياً
00:04:58بين 1 و 6.
00:04:59وإذا كان هذا الرقم هو 2،
00:05:00فإنها تقوم بتنفيذ أمر مسح تدميري
00:05:01وتحاول تشغيل ملف MP3
00:05:03بأعلى صوت ممكن.
00:05:04للأسف،
00:05:05لم أستطع معرفة
00:05:05ما هو ملف الـ MP3 ذلك.
00:05:07على أي حال،
00:05:07الآن وقد فعلت كل ذلك،
00:05:08الأسوأ لم يأتِ بعد
00:05:09لأن تلك كانت المرحلة الأولى فقط.
00:05:11المرحلة الثانية هي الانتشار الذاتي
00:05:13وهذا هو الجزء الأكثر خطورة
00:05:15في هذا الهجوم.
00:05:16أولاً،
00:05:16ستبحث على جهازك
00:05:17عن أي رموز NPM صالحة
00:05:19حيث يمكنها النشر
00:05:19بدون مصادقة ثنائية.
00:05:21وإذا وجدت واحدة،
00:05:22فسوف تفحص كل الحزم
00:05:24التي يمكن لذلك الحساب الوصول إليها،
00:05:26ثم تستخدم بيانات الاعتماد تلك
00:05:26لتضيف نفسها إلى تلك الحزم
00:05:28وتنشر إصدارات جديدة مصابة.
00:05:30هذا أمر سيء للغاية بالطبع،
00:05:32ولكن ربما لا ينبغي عليك
00:05:33أن تترك رموزاً منشورة
00:05:33في متناول اليد
00:05:34التي يمكنها تجاوز
00:05:35المصادقة الثنائية.
00:05:36لذا فإن النسخة الأكثر رعباً
00:05:38من هذا الأمر
00:05:39هي ما يحدث عند تشغيله داخل بيئة التطوير والتشغيل المستمر (CI/CD).
00:05:41لأنه في بيئة CI،
00:05:42لا يحتاج المهاجم
00:05:43إلى رمز NPM طويل الأمد
00:05:44لأن الإعدادات الجيدة
00:05:45غالباً ما تعتمد على OIDC،
00:05:47والتي يُفترض أنها أكثر أماناً.
00:05:48بشكل أساسي،
00:05:49بدلاً من تخزين
00:05:50رمز NPM كسرّ،
00:05:51تقوم GitHub Actions بإثبات هويتها لـ NPM،
00:05:53مرحباً،
00:05:53أنا هذا المستودع
00:05:54أقوم بتشغيل سير العمل هذا
00:05:55على هذا الفرع،
00:05:56ثم تمنحها NPM
00:05:57رمز نشر قصير الأمد.
00:05:59المشكلة في هذا، رغم ذلك،
00:06:00هي أنه إذا حصل البرنامج النصي
00:06:01على وصول إلى بيئة GitHub Actions موثوقة،
00:06:03يمكنه الحلول في نفس المكان
00:06:04الذي يشغله ناشر شرعي.
00:06:06لذا يمكن للبرمجيات الخبيثة استخدام
00:06:07البيئة المرتبطة بـ OIDC
00:06:08التي يكشفها GitHub للوظيفة
00:06:10لطلب رمز OIDC JWT
00:06:12من نقطة نهاية الرموز الخاصة بـ GitHub،
00:06:14ثم تبادل رمز JWT ذلك
00:06:16مع NPM
00:06:17مقابل رمز نشر قصير الأمد
00:06:18من خلال نظام النشر
00:06:19الموثوق لدى NPM،
00:06:20والآن يمكنه النشر
00:06:22دون سرقة
00:06:22رمز NPM دائم
00:06:24والظهور بمظهر شرعي تماماً.
00:06:26في هذه الحالة،
00:06:26تقوم البرمجيات الخبيثة بحزم نسخة
00:06:27من ملف router init.js ذلك
00:06:29داخل جدول الحزمة،
00:06:30ثم تضيف التبعية
00:06:31الاختيارية الخبيثة،
00:06:32ثم تنشر كل ذلك
00:06:33كأحدث علامة
00:06:34لهذه الحزمة،
00:06:35لذا عندما يقوم شخص ما
00:06:35أو خط أنابيب CI/CD ما
00:06:37بتثبيت تلك الحزم،
00:06:38تبدأ الحلقة من جديد،
00:06:40منتشرة إلى أبعد حد
00:06:40ممكن لها.
00:06:42إذاً، كل هذا
00:06:42جنوني جداً، أليس كذلك؟
00:06:43ولكن الآن دعونا نركز
00:06:44على المريض صفر،
00:06:46TanStack.
00:06:46كيف أصيبوا
00:06:47في المقام الأول؟
00:06:48حسناً،
00:06:49وفقاً للتقرير التحليلي الخاص بهم،
00:06:50قام المهاجم بإساءة استخدام
00:06:51خط أنابيب GitHub Actions ذلك.
00:06:53لقد بدأوا اليوم
00:06:53قبل نشر الحزم الخبيثة
00:06:54فعلياً،
00:06:56حيث قاموا بإنشاء تشعّب (fork)
00:06:57من TanStack router،
00:06:58لكنهم قاموا فعلياً بإعادة تسمية
00:06:59هذا إلى configuration
00:06:59لمحاولة جعل العثور عليه أصعب
00:07:01إذا كنت تبحث
00:07:02من خلال أسماء التشعّبات الواضحة.
00:07:04ثم قاموا بإضافة
00:07:04التزام (commit) خبيث
00:07:05إلى هذا التشعّب،
00:07:06الذي قاموا بتزييف مؤلفه
00:07:07باسم Claude،
00:07:07وكانت له رسالة التزام
00:07:08مسبوقة بـ
00:07:09skip CI،
00:07:10لذا لن يتم تشغيل CI فوراً
00:07:11عند حدث الدفع (push event).
00:07:13في اليوم التالي،
00:07:13قاموا بفتح طلب سحب (PR)
00:07:14ضد TanStack router
00:07:15باسم Work in Progress
00:07:16Simplify History Build.
00:07:18وهنا حدث
00:07:18الهجوم الفعلي.
00:07:20خلاصة القول هي أن
00:07:21TanStack كان لديه سير عمل
00:07:22GitHub Actions لقياس الحجم
00:07:23استخدم pull request target،
00:07:25وهذا ملحوظ
00:07:26لأن pull request target
00:07:27يعمل فعلياً
00:07:28في سياق أمان
00:07:29المستودع الأساسي،
00:07:30وليس التشعّب.
00:07:31هذا يعني أنه يتمتع بالوصول
00:07:32إلى نطاق ذاكرة التخزين المؤقت للمستودع الأساسي
00:07:33ورمز GitHub الخاص به.
00:07:35لذا قام سير العمل هذا
00:07:35بالتحقق من طلب السحب،
00:07:36وتثبيت تبعياته،
00:07:38وتشغيل اختبار أداء.
00:07:39المشكلة، رغم ذلك، هي أن
00:07:40أن ذلك الفرع
00:07:40احتوى على برمجيات خبيثة.
00:07:41في هذه الحالة،
00:07:42كان نص إعداد
00:07:43قام بتسميم
00:07:44مخزن حزم PMPM
00:07:45تحت مفتاح التخزين المؤقت الدقيق
00:07:47الذي سيستخدمه إجراء الإصدار
00:07:48لاحقاً.
00:07:49لقد قاموا فعلياً بحساب ذلك
00:07:50مسبقاً من ملف قفل
00:07:51PMPM العام
00:07:52باستخدام نفس المعادلة بالضبط
00:07:54التي يستخدمها سير العمل أيضاً.
00:07:56بمجرد حفظ ذلك التخزين المؤقت
00:07:57المسموم،
00:07:57قاموا فعلياً بإعادة ضبط
00:07:58ذلك الفرع
00:07:59ليطابق الفرع الرئيسي
00:07:59الحالي،
00:08:00لذا بدا طلب السحب المرئي
00:08:01كعملية فارغة لا تغير شيئاً،
00:08:02ثم قاموا بإغلاق طلب السحب
00:08:03هذا وحذف
00:08:04الفرع الخبيث.
00:08:05لذا من الخارج،
00:08:06يبدو وكأن
00:08:07لم يحدث
00:08:07أي شيء على الإطلاق،
00:08:08لكنهم سمموا
00:08:09مخزن GitHub المؤقت الخاص
00:08:10بذاك الإجراء.
00:08:11هذا يعني أنه
00:08:12بعد ثماني ساعات،
00:08:13عندما قام أحد المشرفين العاديين
00:08:14بدمج طلب سحب غير ذي صلة
00:08:15في الفرع الرئيسي،
00:08:16تم تفعيل سير عمل الإصدار
00:08:17الخاص بـ Tanstack،
00:08:18والذي قام باستعادة
00:08:19مخزن PMPM المسموم،
00:08:20والآن تم تشغيل كود تحكم المهاجم
00:08:22داخل
00:08:23إجراء الإصدار هذا.
00:08:24ثم استخدم المنطق نفسه
00:08:25مع OIDC
00:08:26للحصول على رمز نشر NPM،
00:08:28وتمكن من نشر
00:08:2984 إصداراً من نفسه
00:08:30عبر 42 حزمة Tanstack،
00:08:32ولم يحتج حتى للوصول
00:08:33إلى خطوة
00:08:34نشر الحزمة
00:08:35في الإجراء.
00:08:36ومن المضحك،
00:08:36أن الإجراء فشل فعلياً
00:08:37لأن بعض الاختبارات فشلت،
00:08:39لذا لم يصل أبداً إلى تلك الخطوة،
00:08:40ولكن الكود الخبيث تم تشغيله
00:08:41ونشر كل تلك الإصدارات
00:08:43بغض النظر.
00:08:43وهكذا تمكن المهاجم
00:08:44من تجاوز ثلاث حدود ثقة.
00:08:46أولاً،
00:08:47تمكن كود طلب سحب الفرع
00:08:47من تسميم
00:08:48مخزن المستودع الأساسي،
00:08:49ثم تم استعادة ذلك المخزن
00:08:51داخل
00:08:52سير عمل الإصدار الحقيقي،
00:08:53ثم امتلك سير عمل الإصدار الحقيقي
00:08:54صلاحيات OIDC،
00:08:56والتي تحولت إلى
00:08:57وصول لنشر NPM،
00:08:58لذا تمكنوا من نشر
00:08:59ما يبدو أنه
00:08:59حزم شرعية تماماً.
00:09:01وهذا ما أعتقد أنه
00:09:02يصبح مخيفاً حقاً
00:09:03بشأن هجمات سلسلة التوريد.
00:09:05إنهم ينتقلون من
00:09:05سرقة
00:09:06رمز مشرف واحد
00:09:07إلى إساءة استخدام
00:09:08نظام CI-CD بأكمله ذاته،
00:09:10وهذا يعني
00:09:11أن جميع إشارات الثقة الخاصة بنا
00:09:12بدأت تعمل
00:09:13لصالح المهاجم.
00:09:14كانت هذه حزمة موقعة
00:09:15ذات مصدر موثوق صالح
00:09:16تم نشرها بواسطة سير عمل حقيقي.
00:09:18إذاً، هذا كل شيء،
00:09:19هذا هو ShaiHalud4،
00:09:20وإذا كنت ترغب في التحقق
00:09:21مما إذا كنت قد تعرضت للاختراق
00:09:21بسبب أي من هذه الحزم،
00:09:23سأترك روابط
00:09:23لمنشورات مدونة بالأسفل،
00:09:25والتي ستغطي
00:09:25كيف يمكنك معرفة ذلك
00:09:26وما يمكنك فعله
00:09:27إذا كنت قد قمت بتثبيت
00:09:28إحداها.
00:09:29أخبروني في التعليقات
00:09:30ما رأيكم
00:09:30في كل هذا
00:09:31وفي نظام NPM البيئي،
00:09:33وبينما أنتم هناك بالأسفل،
00:09:33اشتركوا،
00:09:34وكما دائماً،
00:09:34نراكم في الفيديو القادم.
Community Posts
No posts yet. Be the first to write about this video!
Write about this video