---
service: "Publicasta"
schema_version: "1.0"
article_id: 290
title: "عندما يصبح npm install مدخلًا للاختراق: ChainDrop بلا ذعر"
language: "ar"
default_language: "en"
canonical_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=ar"
json_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=ar"
api_url: "https://publicasta.com/api/public/v1/channels/cybersecurity/articles/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=ar"
channel_url: "https://publicasta.com/api/public/v1/channels/cybersecurity"
channel_articles: "https://publicasta.com/api/public/v1/channels/cybersecurity/articles"
search_url: "https://publicasta.com/api/public/v1/search"
documentation_url: "https://publicasta.com/api-docs#reading-publicasta"
openapi_url: "https://publicasta.com/api-docs/openapi.json"
published_at: "2026-08-09T18:00:27+00:00"
updated_at: "2026-08-09T18:00:27+00:00"
translations:
  - language: "ar"
    html_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=ar"
    markdown_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=ar"
    json_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=ar"
  - language: "de"
    html_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=de"
    markdown_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=de"
    json_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=de"
  - language: "en"
    html_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=en"
    markdown_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=en"
    json_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=en"
  - language: "es"
    html_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=es"
    markdown_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=es"
    json_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=es"
  - language: "fr"
    html_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=fr"
    markdown_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=fr"
    json_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=fr"
  - language: "pl"
    html_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=pl"
    markdown_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=pl"
    json_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=pl"
  - language: "ru"
    html_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=ru"
    markdown_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=ru"
    json_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=ru"
  - language: "zh"
    html_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=zh"
    markdown_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=zh"
    json_url: "https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=zh"
---

# عندما يصبح npm install مدخلًا للاختراق: ChainDrop بلا ذعر

> شرح هادئ لموجة Shai-Hulud في npm: ما الذي حدث، أين تتوقف provenance، وكيف تراجع الفرق أسرار CI دون تحويل أرقام التنزيل إلى أعداد ضحايا.

كان تثبيت الاعتماديات يفترض أن يكون خطوة مملة. في موجة ChainDrop الجديدة المرتبطة بـ Shai-Hulud، أصبحت هذه الخطوة اليومية هي موضع الخطر: runner في CI أو حاسوب مطور يختار حزمة npm مخترقة، الحزمة تشغل lifecycle script أثناء التثبيت، والبيئة التي تحتوي غالبًا على رموز نشر ومفاتيح سحابية تتحول إلى سطح هجوم.

 ![رسم اعتماديات مع عقدة تحذير وCI runner وأسرار محمية](https://publicasta.com/storage/projects/9/pages/290/2026/08/97750d89-bcf8-4d9f-8916-37c6bd3565a3.webp)

 ## ما الذي حدث بين 4 و9 أغسطس

 نشرت فرق مثل Aikido وSocket وSafeDep وJFrog وUnit 42 وWiz وEndor Labs تحليلات لحملة supply chain سريعة في npm مرتبطة بعائلات Keyv وCacheable. بحسب Aikido، بدأ التجمع الأول من مسار نشر مخترق لـ `keyv@6.0.0` وحزم مرتبطة مثل `flat-cache` و`file-entry-cache` و`cacheable-request` و`cacheable` و`@cacheable/memory` و`cache-manager`. لاحقًا وصف The Hacker News الأسبوع نفسه كحملة ذات سلوك يشبه الدودة امتدت إلى مئات إصدارات الحزم.

 الأرقام اختلفت بين المصادر لأن الوضع كان يتغير أثناء الكتابة. تحدث JFrog عن أكثر من 400 حزمة، ونشرت SafeDep وUnit 42 أعدادًا أعلى للحزم أو الإصدارات في لحظات أخرى، وركز Endor Labs على حجم التنزيلات لبعض مسارات الاعتماديات. لا ينبغي جمع هذه الأرقام أو اعتبارها عدد الضحايا. هي تقيس حزمًا أو إصدارات أو حجم تنزيل، لا عدد الأجهزة التي شغلت البرمجية الخبيثة.

 ## لماذا ليست مجرد حزمة خبيثة أخرى

 كثير من حوادث npm تبدأ بحزمة مقلدة الاسم أو مكتبة قليلة الاستخدام. ChainDrop أكثر إزعاجًا لأن نقطة الدخول شملت اعتماديات تصل إلى الفرق بصورة غير مباشرة. قد لا يختار المطور `keyv` أبدًا بشكل صريح، لكنه يحصل عليه عبر framework أو طبقة cache أو linter أو أداة build أو مكتبة خادم. لذلك يصبح lockfile أهم من الذاكرة: الإصدار الخطر قد يكون عدة مستويات تحت الحزمة التي يظن الفريق أنه ثبتها.

 ضربت الحملة أيضًا إشارات ثقة يعتمد عليها المهندسون. قالت التقارير إن بعض الإصدارات الخبيثة نُشرت عبر release workflows تبدو شرعية وقد تظهر provenance صحيحة. هذه الآلية مفيدة، لكنها تجيب عن سؤال محدود: أي workflow أنتج الحزمة، وتحت أي هوية، ومن أي سياق مستودع. لا تثبت أن حساب maintainer أو commit الإصدار أو مدخلات workflow أو credentials كانت سليمة.

 ## كيف عمل مسار التثبيت

 تصف التقارير العامة سلسلة واضحة. الإصدار المخترق أضاف أمرًا من نوع `preinstall` يشغل `node setup.mjs`. بعد ذلك حمّل السكربت JavaScript مموهًا؛ ذُكرت أسماء مثل `Math_Symbol.js` و`math_init.js`، واستُخدم Bun كـ runtime ملائم في بعض الأجزاء. Bun نفسه لم يكن مخترقًا، بل كان أداة استعملها payload.

 عند التشغيل داخل CI أو محطة تطوير، بحثت البرمجية الخبيثة عن أسرار: npm وGitHub tokens، credentials سحابية، مواد Vault وKubernetes، SSH keys، ملفات `.env`، Terraform state، إعدادات Docker وHelm، وحتى أسرار مؤقتة في GitHub Actions runners. بيئة البناء حساسة لأن credentials قصيرة العمر وOIDC-derived tokens قد تظهر في environment variables أو الذاكرة أثناء job نفسه.

 الانتشار الشبيه بالدودة جاء من حقوق النشر. إذا حصل payload على npm publishing tokens، يمكنه نشر إصدارات مصابة من حزم أخرى يملكها الضحية. وإذا حصل على GitHub access، وصفت التحليلات تغييرات في المستودعات وسطوح استمرارية مثل ملفات VS Code tasks وClaude Code settings. ليست كل هذه الملفات تعمل تلقائيًا، لكنها تكشف نية تحويل أتمتة التطوير المعتادة إلى مدخل جديد.

 ## كيف تتحقق وتستجيب بهدوء

 ابدأ بالأدلة. ابحث عن أسماء الحزم والإصدارات الدقيقة التي نشرتها Aikido وSafeDep وSocket وJFrog وUnit 42 وغيرها داخل `package-lock.json` و`npm-shrinkwrap.json` و`pnpm-lock.yaml` و`yarn.lock` وBun lockfiles والمرايا الداخلية وسجلات فحص الاعتماديات. لا تكتف بالاعتماديات المباشرة؛ المشكلة هنا في الاعتماديات العابرة.

 ثم حدد هل حدث install فعليًا خلال النافذة المعنية. سجلات CI، أوقات build، إنشاء cache لمدير الحزم، تاريخ طبقات container، وتاريخ shell على محطات العمل تساعد على الفصل بين وجود نظري في lockfile وبين تنفيذ كود فعلي. إذا ظهر الإصدار المتأثر فقط في lockfile ولم يُثبت، قد تكفي عملية pin وتحديث وتوثيق. إذا نُفذ في بيئة تحمل أسرارًا، فتعامل مع البيئة كأنها exposed.

 لا تغلق الحادثة بعبارة “حدّثنا إلى latest”. التحديث يمنع تثبيت الإصدار السيئ مستقبلًا، لكنه لا يستعيد token نُسخ بالفعل. اعزل runner أو workstation، احتفظ بالسجلات المفيدة، أعد بناء runners المؤقتة من صور نظيفة، وافحص cache والمتغيرات وأدوات التطوير والمستودعات. ألغِ npm وGitHub tokens، راجع maintainers و2FA والصلاحيات، ثم دوّر مفاتيح cloud وVault وKubernetes وSSH وsecrets النشر التي كانت متاحة.

 الدرس الدائم هو اعتبار install scripts تنفيذًا ذا صلاحيات. استخدم `--ignore-scripts` حيث يمكن، ووافق صراحة على السكربتات الضرورية، واختبر ضوابط npm 12 وما يقابلها في pnpm وYarn وBun، واضبط حدًا أدنى لعمر الإصدار في التثبيت الآلي، واجعل runners قابلة لإعادة البناء، وافصل install عن test وعن publish. ChainDrop لا يثبت فشل open source؛ إنه يذكرنا بأن `npm install` ليس تنزيلًا فقط، بل تنفيذ كود بجانب المفاتيح.
