ما الذي غيّرته حادثة 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 خطوة بخطوة
الانتقال إلى `npm ci` وحظر `npm install` في CI
استبدل كل npm install بـnpm ci. يرفض الأمر التنفيذ إذا كان package-lock.json غائبًا أو يتباين.
تفعيل `npm audit` في الوضع الحاجب
أضف npm audit --audit-level=high بعد npm ci وقبل البناء. فرّق تبعيات التطوير بـ--omit=dev.
التحقق من الهاشات بـ`npm audit signatures`
منذ npm 8.8، تتحقق npm audit signatures من صحة توقيع كل حزمة مثبّتة. شغّلها بعد npm ci.
دمج ماسح SCA (Trivy أو OWASP Dependency-Check)
أضف وظيفة SCA مستقلة. يحلّل Trivy package-lock.json مباشرةً (trivy fs --scanners vuln .).
استهلاك شهادات SLSA وإصدارها
لحزمك المنشورة فعّل إثبات منشأ SLSA في سير عمل النشر. للتبعيات الخارجية تحقّق من شهادات الحزم الحرجة.
تثبيت إجراءات CI والصور على digest sha256
في ملفات .github/workflows/*.yml أو .gitlab-ci.yml استبدل الوسوم المتحركة بـ sha256.
لا تُرقّع أبدًا تبعية في الإنتاج بتعديل node_modules يدويًا: سيتباين lockfile وسيعيد النشر التالي من CI إدخال الحزمة الأصلية.
الدمج في سير عمل Git المستضاف
هذه الضوابط خطوات خط أنابيب تنتمي إلى ci.yml أو .gitlab-ci.yml، تشتغل عند كل push وطلب سحب. على المستودع المستضاف ذاتيًا (Gitea أو GitLab CE)، تنطبق الوصفات ذاتها.