حادثة · اختراق حزمة npm
اختراق Nx على npm: ما فعله على Mac الخاص بمطور، وما كان Kilobat سيعرضه
لنحو خمس ساعات يومي 26 و27 أغسطس 2025، حملت ثمانية إصدارات من نظام البناء Nx على npm نصًا برمجيًا يعمل بعد التثبيت، يبحث عن أسرار على أجهزة المطورين ويستعين بأدوات البرمجة بالذكاء الاصطناعي التي يجدها، ثم ينشر ما جمعه في مستودع عام جديد بحساب الضحية نفسه على GitHub.
باختصار
- الحماية: لم يكن ليساعد
لا شيء للحظر. جاءت الشيفرة من registry.npmjs.org وذهبت البيانات إلى api.github.com، وهما غير مدرجين في قوائم التهديدات.
- حارس الوكلاء: لم يكن ليساعد
لم يُستخدم موقع لصق أو نفق أو عنوان IP مباشر، ويتجاوز قطع الرفع المضيفين المعروفين مثل api.github.com عمدًا.
- سجل شبكة الوكلاء: محدودة
كان سيسجل نص تثبيت يتصل بواجهة GitHub API وعمليات أدوات الذكاء الاصطناعي التي بدأها النص، لكن فقط لعمليات التثبيت على هذا Mac ودون حظر.
ما حدث
حصل المهاجم على رمز نشر Nx في npm عبر نظام التكامل المستمر الخاص بالمشروع. وفقًا لتنبيه المشرفين، استخدم سير عمل GitHub Actions دُمج في 21 أغسطس المشغّل pull_request_target ومرر عناوين طلبات السحب إلى الصدفة، مما سمح لعنوان مصمم خصيصًا بتنفيذ أوامر بصلاحيات المستودع. وفي 24 أغسطس استُخدم هذا المسار لبدء سير عمل النشر من إيداع خبيث وإرسال رمز npm إلى webhook.
باستخدام الرمز نشر المهاجم nx بالإصدارات 20.9.0–20.12.0 و21.5.0–21.8.0، بالإضافة إلى إصدارات من @nx/devkit و@nx/js و@nx/workspace و@nx/node و@nx/eslint و@nx/key و@nx/enterprise-cloud. حمل كل منها خطاف postinstall شغّل telemetry.js، الذي لم يعمل إلا على macOS وLinux.
بحث النص عن أدوات سطر الأوامر claude وgemini وq، وحيث كانت مثبتة شغّلها بمعاملات تتجاوز طلبات الإذن (--dangerously-skip-permissions و--yolo و--trust-all-tools) وتعليمات تطلب منها سرد الملفات التي تبدو كمحافظ ومفاتيح وملفات .env في /tmp/inventory.txt. نشرت Snyk وStepSecurity الشيفرة. ورأت Wiz نجاح ذلك في مئات الحالات، مع رفض ضوابط مزودي الذكاء الاصطناعي أحيانًا.
ثم قرأ تلك الملفات وجمع رمز GitHub CLI باستخدام gh auth token ورمز npm من ~/.npmrc، وأنشأ مستودعًا عامًا باسم s1ngularity-repository في حساب الضحية ورفع كل شيء في results.b64 بترميز base64 ثلاث مرات. كما أضاف sudo shutdown -h 0 إلى ~/.zshrc و~/.bashrc، بحيث تطلب كل نافذة طرفية جديدة كلمة مرور وتطفئ الجهاز.
لم يكتب أحد كثيرًا من أوامر التثبيت. وجد المشرفون أن إضافة المحرر Nx Console بالإصدارات 18.6.30 إلى 18.65.1 تتحقق من أحدث nx عند البدء، فكان فتح محرر أثناء الفترة كافيًا. ووجدت Wiz البرمجية تعمل أيضًا في مسارات CI. أحصت Wiz أكثر من ألف رمز GitHub صالح بين البيانات المسرّبة؛ وفي مرحلة ثانية استُخدمت الرموز المسروقة لجعل أكثر من 5,500 مستودع خاص عامًا.
التسلسل الزمني
- 21 أغسطس 2025
دمج سير عمل فيه ثغرة حقن أوامر صدفة في مستودع Nx (تنبيه المشرفين).
- 24 أغسطس 2025
طلب سحب مصمم خصيصًا يبدأ سير عمل النشر من إيداع خبيث يرسل رمز npm إلى webhook.
- 26 أغسطس، 22:32 UTC
نشر
nxبالإصدار 21.5.0 وعدة حزم@nx/*معtelemetry.js؛ وتبعه 20.9.0 بعد سبع دقائق. - 27 أغسطس، 00:30 UTC
فتح مستخدم مشكلة على GitHub بشأن الإصدارات الخبيثة. وظهر الإصداران الأخيران 21.8.0 و20.12.0 عند 00:37.
- 27 أغسطس، 02:44 UTC
أزالت npm الإصدارات المتأثرة ورموز النشر.
- 27 أغسطس، نحو 09:00 UTC
عطّل GitHub المستودعات التي أنشأها المهاجم، بعد نحو ثماني ساعات من ظهور أولها (Wiz).
- 27 أغسطس 2025
أوقف Nx Console 18.66.0 تثبيت أحدث
nx؛ ونقل Nx النشر إلى Trusted Publishers في npm مع المصادقة الثنائية. - 28–29 أغسطس 2025
استُخدمت رموز مسروقة لإعادة تسمية مستودعات خاصة وجعلها عامة؛ وأحصت Wiz أكثر من 400 حساب و5,500 مستودع.
كيف بدا على الشبكة
على Mac استخدم الهجوم مضيفين يتصل بهما جهاز المطور يوميًا. جاءت الحزمة من registry.npmjs.org كالمعتاد. وذهبت البيانات المسروقة إلى api.github.com بصفتها الضحية، باستخدام رمز GitHub CLI الخاص بها: طلب POST /user/repos لإنشاء المستودع، ثم PUT /repos/<owner>/s1ngularity-repository/contents/results.b64 بالبيانات المرمّزة. لم يكن هناك خادم قيادة وتحكم أو وجهة رفع أخرى.
كانت شجرة العمليات قصيرة. شغّل npm أو إضافة المحرر صدفة، وشغّلت الصدفة node telemetry.js، وبدأ node العمليات الفرعية claude أو gemini أو q. اتصلت كل أداة ذكاء اصطناعي بمزودها كما تفعل عادةً؛ وحدثت قراءة الملفات محليًا. وجاء الرفع نفسه من node، واعتمد حجمه كليًا على محتويات الملفات.
المؤشرات
كما توثقها المصادر. النطاقات نصوص وليست روابط، وقد عُطلت صيغتها ([.]) حيث فعل المصدر ذلك. معظم هذه البنية اختفى منذ زمن: تساعد المؤشرات في فحص السجلات والملفات والحسابات القديمة، لا حظر حملات اليوم.
| المؤشر | النوع | أين يظهر | ملاحظة |
|---|---|---|---|
api.github.com | المضيف (مشروع) | جهاز Mac | POST /user/repos ثم PUT …/contents/results.b64 من node أثناء تثبيت npm. |
s1ngularity-repository, s1ngularity-repository-0, s1ngularity-repository-1 | اسم مستودع GitHub | حساب GitHub | كان عامًا عند إنشائه؛ وعطله GitHub في 27 أغسطس. استخدمت المستودعات المعاد تسميتها في المرحلة الثانية s1ngularity-repository- مع خمسة أحرف. |
results.b64 | ملف | مستودع GitHub | البيانات المجمعة، مرمزة بـ base64 مرتين أو ثلاثًا. |
/tmp/inventory.txt, /tmp/inventory.txt.bak | ملف | جهاز Mac | قائمة مسارات الملفات من أدوات الذكاء الاصطناعي. |
sudo shutdown -h 0 | سطر في ~/.zshrc و~/.bashrc | جهاز Mac | يطفئ Mac عند فتح نافذة طرفية وإدخال كلمة المرور. |
nx 20.9.0–20.12.0, 21.5.0–21.8.0 | إصدارات npm | ملفات القفل وذاكرة npm المؤقتة | وكذلك @nx/devkit و@nx/js و@nx/workspace و@nx/node بالإصدارين 20.9.0 و21.5.0، و@nx/eslint بالإصدار 21.5.0، و@nx/key و@nx/enterprise-cloud بالإصدار 3.2.0. |
ما كان Kilobat سيعرضه أو يحظره
- سجل شبكة الوكلاء. عندما يشغّل وكيل عملية التثبيت، مثل تشغيل Claude Code للأمر
npm install، كانت جلسته ستعرضnodeتحتnpmيرسل إلىapi.github.comأثناء التثبيت: يستحق نص تثبيت يتصل بواجهة GitHub API المراجعة. لم يكن سيُعلَّم بأنه أول مرة لأن api.github.com مضيف معروف، ولم يكن سيُعلَّم بأنه رفع كبير إلا فوق 10 MB. - سجل شبكة الوكلاء. يتعرف Kilobat على Claude Code وGemini CLI من ملفاتهما التنفيذية لا ممن بدأهما، لذا كانت العمليات التي بدأها النص ستظهر كجلسات مستقلة في مجلد المشروع، في وقت لم تبدأ فيه وكيلًا. أما
qمن Amazon فليس من الوكلاء الذين يتعرف عليهم Kilobat. - الحماية. لا شيء. لا يشكل registry.npmjs.org وapi.github.com تهديدًا، ولا ينبغي لـ Kilobat حظرهما مطلقًا.
- حارس الوكلاء. لا شيء أيضًا. تغطي قواعد الحارس مواقع اللصق ومشاركة الملفات والأنفاق ومستقبلات الطلبات وعناوين IP المباشرة، ولم يظهر أي منها؛ ويتجاوز قطع الرفع المضيفين المعروفين حتى يواصل
git pushالعمل.
أين لم يكن Kilobat ليساعد
- يبدو تسريب البيانات إلى github.com باستخدام رمز الضحية نفسه مماثلًا لعمل GitHub CLI المعتاد. يرى Kilobat المضيفين وعدد البايتات، ولا يرى ما أُرسل.
- سُرق رمز npm في GitHub Actions الخاصة بـ Nx على مشغلات GitHub، ونُفذت المرحلة الثانية من جانب المهاجم باستخدام رموز مسروقة. لم يمس أي منهما جهاز Mac الخاص بك.
- لا تُنسب عمليات التثبيت التي تبدأها إضافة محرر في VS Code إلى وكيل، فلا تحصل على جلسة وكيل؛ وفي Cursor وWindsurf تُحسب ضمن التطبيق.
- قراءة الملفات وتشغيل بحث أدوات الذكاء الاصطناعي في الملفات وتعديل
~/.zshrcليست أحداث شبكة. - يحتفظ سجل شبكة الوكلاء ببيانات 30 يومًا، فلا يمكنه إخبارك الآن إن كان هذا قد عمل على Mac في أغسطس 2025.
تحقق من Mac الآن
في كل مشروع، تحقق مما إذا كان إصدار متأثر من Nx مثبتًا وحدّثه إن وجد.
npm ls nxابحث عن الملفات التي تركها النص. يمسح macOS
/tmpعند إعادة التشغيل، لذا فإن عدم العثور على شيء لا يثبت الكثير.ls -la /tmp/inventory.txt /tmp/inventory.txt.bakتحقق من ملفات بدء تشغيل الصدفة بحثًا عن سطر إيقاف التشغيل واحذفه إن وجد.
grep -n "shutdown" ~/.zshrc ~/.bashrcفي سجل أمان GitHub، ابحث عن حدث
repo.createيتضمنs1ngularity-repositoryفي الاسم: github.com/settings/security-log. ربما يكون المستودع نفسه قد عُطّل بالفعل.إذا تأثرت، فألغِ وصول GitHub CLI من الإعدادات ‹ التطبيقات ‹ تطبيقات OAuth المصرح بها، وسجّل الدخول مجددًا باستخدام
gh auth login، وبدّل رموز npm وكل سر في ملفات.envوبيئتك.امسح ذاكرة npm المؤقتة حتى لا يمكن تثبيت نسخة قديمة مجددًا.
npm cache clean --forceفي المرة القادمة: مع تسجيل سجل شبكة الوكلاء في Kilobat، انظر إلى ما اتصلت به كل عملية تثبيت شغّلها وكيل. راقب اتصال npm أو node بـ api.github.com وجلسات الوكلاء التي لم تبدأها.
kilobat agent-log --all
الأسئلة
هل انقلبت أدوات الذكاء الاصطناعي على مستخدميها؟
لا. بدأها النص الخبيث بنفسه بمعاملات تعطل طلبات الإذن، وأعطاها تعليماته الخاصة. وهذه المعاملات نفسها سبب للحذر عند تشغيل الوكلاء دون مراقبة وبصلاحيات كاملة.
لماذا لا يحظر Kilobat عمليات الرفع الكبيرة إلى GitHub؟
لأن رفع الشيفرة والإصدارات والحزم إلى GitHub عمل عادي، وقطعه سيعطل git push. يعرض السجل عملية الرفع وعدد بايتاتها وعمليتها بدلًا من ذلك لتتمكن من رؤيتها.
المصادر
- تنبيه أمان nrwl/nx GHSA-cxm3-wv7p-598c: نُشرت إصدارات خبيثة من Nx وبعض الإضافات المساندة
- مدونة Nx: S1ngularity، ما حدث وكيف استجبنا وما تعلمناه
- StepSecurity: اختراق حزمة نظام البناء الشهير Nx ببرمجية تسرق البيانات
- Wiz: s1ngularity، هجوم على سلسلة التوريد يسرّب الأسرار على GitHub
- Snyk: تسخير وكلاء البرمجة بالذكاء الاصطناعي للبرمجيات الخبيثة في حزمة Nx الخبيثة
- Socket: اختراق حزم Nx على npm في هجوم على سلسلة التوريد يسخّر أدوات الذكاء الاصطناعي
تم التحقق في 1 نوفمبر 2026.
اعرف ما تتصل به وكلاؤك وتطبيقاتك
Kilobat تطبيق لشريط قوائم Mac يحدد التطبيق والعملية والوكيل وراء كل اتصال، ويبعدها عن المضيفين المعروفين بسوئهم، ويسجل الوجهات التي بلغتها كل جلسة وكيل.
brew install seifip/kilobat/kilobat