الدودة التي علّمت سلسلة التوريد أن تتكاثر بنفسها
الخلاصة
- كانت Shai-Hulud أول دودة npm ذاتية التكاثر: كل حزمة مصابة تسرق بيانات الاعتماد وتستخدمها لنشر الدودة في بقية حزم المشرف.
- بلغت موجة نوفمبر نحو 25,000 مستودع خبيث، وحملت مفتاح رجلٍ ميت مُدمِّراً.
- ما كان الفحص الخارجي سيُظهره لأي موقع: أيّ نصوص خارجية تحمّلها، وهل CSP وسلامة الموارد الفرعية مفعّلتان، والنطاقات المشابهة للنصوص.
في هذه الصفحة
طوال معظم تاريخها، احتاجت هجمة سلسلة توريد البرمجيات إلى إنسان عند المِقوَد: اخترق حزمة، ثم انتظر، وراقبها وهي تنتشر مع تحديث المطوّرين. وفي خريف 2025، شاهدت منظومة npm ذلك الافتراض يموت. فقد تعلّمت دودةٌ أن تتولّى الانتشار بنفسها.
أشهرٌ سيئة لـ npm install
جاء التصعيد على موجات، كلٌّ أبشع من سابقتها.
في أواخر أغسطس، اخترق المهاجمون أداة البناء الشهيرة Nx (تُتبَّع بـ CVE-2025-10894) في ما سمّاه الباحثون أول هجمة سلسلة توريد مُسلَّحة بالذكاء الاصطناعي: إذ استدعت البرمجية فعلاً مساعدي البرمجة بالذكاء الاصطناعي المثبَّتين محلياً — Claude Code و Gemini CLI و Amazon Q — وطلبت منهم البحث عن الأسرار على القرص. وحصدت ما يُقدَّر بـ 2,349 سرّاً مميّزاً من أكثر من ألف جهاز مطوّر، وألقتها في مستودعات عامة داخل حسابات GitHub الخاصة بالضحايا أنفسهم.
وبعد أسبوعين، تعرّض مشرف chalk وdebug — وهما حزمتان، مع شقيقاتهما، بينهما أكثر من
ملياري تنزيل أسبوعياً — للتصيّد عبر نطاق مشابه، npmjs.help، سُجِّل قبل ثلاثة أيام
فقط من الهجمة. ونشر المهاجم إصدارات خبيثة تحمل مُستنزِف محافظ عملات يعمل في المتصفح. وكان
المدى مذهلاً؛ قدّرت Wiz
أن الشيفرة السيئة لامست نحو 10% من البيئات السحابية خلال نافذة
الساعتين تقريباً. أمّا السرقة الفعلية؟ تتبّعها الباحثون عند نحو 600 دولار. لم يكن
الضرر في الغنيمة، بل في البرهان أن ملياري تنزيل أسبوعي يمكن أن تنقلب عدائيةً في ست عشرة
دقيقة.
Shai-Hulud: الجزء الذي يتحرّك بنفسه
ثم، في 15 سبتمبر 2025، جاءت Shai-Hulud — المسمّاة، على نحوٍ لائق، تيمّناً بديدان الرمل
في Dune. كانت أول دودة npm ذاتية التكاثر. أمّا حمولتها، التي تعمل عند التثبيت،
فاستخدمت أداة فحص الأسرار TruffleHog للعثور على بيانات الاعتماد على المضيف؛ وبرمز npm
مسروق كانت تصادق المطوّر كذلك، وتجد حزمه الأخرى، وتحقن نفسها فيها، ثم تعيد نشرها. كل
إصابةٍ تصنع التالية. وكانت نقطة الصفر @ctrl/tinycolor، وهي حزمة بملايين التنزيلات
الأسبوعية، وخلال 24 ساعة كان نحو 200 حزمة تحملها.
أمّا تتمّة نوفمبر، “Sha1-Hulud: The Second Coming"، فبُنِيت لتؤذي أكثر. نقلت مُحفّزها من
postinstall إلى preinstall، فصارت تعمل قبل أن يفشل التثبيت أصلاً. وثبّتت بيئة تشغيل
Bun لتُنفّذ حمولتها بعيداً عن المراقبة المُهيّأة لـ Node.js. وسجّلت الأجهزة المصابة
مُشغّلاتٍ لـ GitHub Actions كي تبقى. وحملت مفتاح رجلٍ ميت: إن عجزت عن التسريب وعن الانتشار
معاً، حاولت أن تمسح مجلد المستخدم الرئيسي. والتقت Datadog
و Wiz عند نحو 750–800 حزمة
مسمومة فريدة وأكثر من 25,000 مستودع خبيث، مع حزم مؤكَّدة الإصابة من مؤسسات منها
Zapier و ENS و PostHog و Postman و AsyncAPI.
النسخة التي تشرح موقعك
معظم ما سبق مشكلة مطوّر. لكن لهذه الهجمة نسخةً تطال أيّ أحد يملك موقعاً، ولها اسم تعلّمه
الجميع في 2024: polyfill.io. فلسنوات، حمّلت مئات الآلاف من المواقع رقعة JavaScript
صغيرة من cdn.polyfill.io بوسم <script> بسيط. وفي فبراير 2024 بِيع النطاق وحساب GitHub
الخاص به. وبحلول يونيو، كان المالك الجديد يستخدم ذلك العنوان الموثوق نفسه ليقدّم برمجيةً
خبيثة — بشروط، لمستخدمي الجوال، يُخمِدها حين يكتشف مسؤولاً ينظر. أبلغت Sansec
عن أكثر من
100,000 موقع متأثر، وما زالت Censys
تَعُدّ 384,773 مضيفاً يحمّل النص البرمجي في أوائل يوليو.
لم يتغيّر النص البرمجي الذي ضمّنته المواقع قبل سنوات؛ تغيّر مالكه.
هذا هو الخيط الجامع من Shai-Hulud إلى polyfill: الشيفرة التي يحمّلها موقعك من غيرك جزءٌ من سطح هجومك، و"أضفناه قبل سنوات وما زال يعمل” ليس الطمأنينة التي يبدو عليها.
ماذا كان المنظور الخارجي سيُظهِر
لا تستطيع أن تدقّق دواخل npm من خارج موقع أحدهم. لكنّ النسخة المواجِهة للويب من خطر سلسلة التوريد ظاهرةٌ بشكل لافت من الخارج، وهي بالضبط ما تنظر إليه مراجعةٌ خارجيةٌ لموقع:
- ماذا تحمّل، ومن أين. كل وسم
<script src>خارجي علاقةُ ثقة. وجردٌ من الخارج لتلك المصادر — وهل يشير أيٌّ منها إلى نطاق متوقّف أو منتهٍ أو نُقِلت ملكيته حديثاً — هو نظام الإنذار المبكر لحادثة من نوع polyfill. - سياسة أمان المحتوى1. قائمةٌ مُحكَمة (
script-src) كانت لتمنع حقن polyfill من التسريب إلى أيّ مكان يشاء. وغياب هذه السياسة، أو امتلاؤها بـunsafe-inline، نتيجةٌ بذاتها. راجع شرح ترويسات أمان HTTP . - سلامة الموارد الفرعية2. وسم نص برمجي خارجي ببصمة
integrity=يفشل بأمان: فإن تغيّر الملف، رفض المتصفح تشغيله. كانت هجمة polyfill لتكسر الصفحة بدل أن تسرق الزائر. وغياب هذه البصمة عن الموارد الخارجية ثغرةٌ نظيفة قابلة للقياس. - النطاقات المشابهة.
npmjs.help، المُسجَّل قبل ثلاثة أيام من استخدامه، هو المؤشر نفسه لنطاق جديد يشبه علامتك. ومراقبتها رخيصة عالية القيمة.
كانت ديدان 2025 جرس إنذار لطريقة بناء البرمجيات. أمّا الدرس الأهدأ، لكل من يُشغّل موقعاً فحسب، فهو أن لتبعيّاتك وجهاً عاماً، وذلك الوجه يمكن أن يُراجَع من الخارج قبل أن ينقلب عليك. وتلك المراجعة هي ما يُبنى له زمام.
المصادر
- Nx، “s1ngularity post-mortem”: https://nx.dev/blog/s1ngularity-postmortem
- Wiz، “Shai-Hulud npm supply chain attack”: https://www.wiz.io/blog/shai-hulud-npm-supply-chain-attack
- Datadog Security Labs، “Shai-Hulud 2.0 npm worm”: https://securitylabs.datadoghq.com/articles/shai-hulud-2.0-npm-worm/
- Aikido، “npm debug and chalk packages compromised”: https://www.aikido.dev/blog/npm-debug-and-chalk-packages-compromised
- Sansec، “Polyfill supply chain attack”: https://sansec.io/research/polyfill-supply-chain-attack
- Censys، “Polyfill.io supply chain attack”: https://censys.com/blog/july-2-polyfill-io-supply-chain-attack-digging-into-the-web-of-compromised-domains/
الهامش
— قراءة