التطوير7 دقيقة قراءة

تأمين سلسلة توريد npm في CI بعد حادثة AsyncAPI

في يوليو 2026، نُشرت عدة حزم من مشروع AsyncAPI على npm بتوقيعات OIDC صالحة دون أن ترصد أدوات الكشف المعتادة أي شيء. كشف هذا الحادث أن خط CI الذي يكتفي بالتحقق من lockfile أو التوقيع يظل عرضة للاختراق من الجانب الأعلى.

ما الذي غيّرته حادثة AsyncAPI

خلال أسبوعين في يوليو 2026، تداولت خمس إصدارات من حزم AsyncAPI مع إثبات منشأ OIDC موقَّع. كان المهاجمون قد اخترقوا خط النشر، لا مفتاح التوقيع. النتيجة: أعادت npm audit signatures نتيجة نظيفة.

إجراءات ملموسة لتطبيقها

  • **سياسة --frozen-lockfile** — منع أي تعديل صامت على ‎package-lock‎.json‎ في CI.
  • **التحقق من الهاشات في CI** — إضافة وظيفة تقارن هاشات SHA-512 من lockfile بسجل npm.
  • **فحص SCA التلقائي** — دمج ماسح تحليل تركيبة البرمجيات كخطوة حاجبة في الخط.
  • **إثبات منشأ SLSA بالمستوى 2 كحد أدنى** — عند النشر أنشئ شهادات SLSA؛ وعند الاستهلاك تحقّق منها.
  • **تثبيت صور CI على digest sha256** — أرسخ كل صورة Docker بدلاً من وسم متحرك.
  • **تنبيهات عند إصدارات غير مجدوَلة** — هيّئ Dependabot أو Renovate للإشعار بأي إصدار جديد.

ما يضمنه lockfile وما لا يضمنه

يسجّل ‎package-lock‎.json‎ الإصدار الدقيق وهاش كل تبعية. لكنه لا يتحقق من أن محتوى الحزمة لم يتغيّر في السجل بعد حله الأولي، ولا من أن الخط الذي أنتجها كان سليمًا.

تصليب خط CI خطوة بخطوة

01

الانتقال إلى `npm ci` وحظر `npm install` في CI

استبدل كل npm install بـnpm ci. يرفض الأمر التنفيذ إذا كان ‎package-lock‎.json‎ غائبًا أو يتباين.

02

تفعيل `npm audit` في الوضع الحاجب

أضف npm audit --audit-level=high بعد npm ci وقبل البناء. فرّق تبعيات التطوير بـ--omit=dev.

03

التحقق من الهاشات بـ`npm audit signatures`

منذ npm 8‎.8، تتحقق npm audit signatures من صحة توقيع كل حزمة مثبّتة. شغّلها بعد npm ci.

04

دمج ماسح SCA (Trivy أو OWASP Dependency-Check)

أضف وظيفة SCA مستقلة. يحلّل Trivy ‎package-lock‎.json‎ مباشرةً (trivy fs --scanners vuln .).

05

استهلاك شهادات SLSA وإصدارها

لحزمك المنشورة فعّل إثبات منشأ SLSA في سير عمل النشر. للتبعيات الخارجية تحقّق من شهادات الحزم الحرجة.

06

تثبيت إجراءات CI والصور على digest sha256

في ملفات ‎.github/workflows/*‎.yml‎ أو ‎.gitlab-ci‎.yml‎ استبدل الوسوم المتحركة بـ sha256.

لا تُرقّع أبدًا تبعية في الإنتاج بتعديل ‎node_modules‎ يدويًا: سيتباين lockfile وسيعيد النشر التالي من CI إدخال الحزمة الأصلية.

الدمج في سير عمل Git المستضاف

هذه الضوابط خطوات خط أنابيب تنتمي إلى ‎ci‎.yml‎ أو ‎.gitlab-ci‎.yml‎، تشتغل عند كل push وطلب سحب. على المستودع المستضاف ذاتيًا (Gitea أو GitLab CE)، تنطبق الوصفات ذاتها.

بيئات CI معزولة لخطوط البناء

انشر مشغّلات CI على VPS سحابي مخصّص: عزل شبكي وتحكم كامل في التبعيات.

بحاجة إلى مساعدة؟

تصفّح مركز المساعدة والأسئلة الشائعة، أو راسل فريقنا — الدعم بـ العربية والفرنسية والإنجليزية.