سلسلة التبعيات في npm مسؤولية أمنية — والمطورون يستطيعون تقليل المخاطر

مشاركة:
سلسلة التبعيات في npm مسؤولية أمنية — والمطورون يستطيعون تقليل المخاطر

حجم المشكلة: حزمة واحدة، ملايين الضحايا

أظهر هجوم ua-parser-js عام 2021 مدى وصول الحزمة المخترقة بكفاءة قاسية. هذه المكتبة التي تحلل سلاسل user-agent للمتصفحات، كان لديها أكثر من 8 ملايين تحميل أسبوعي، وكانت تبعية غير مباشرة في مشاريع فيسبوك، آبل، أمازون، ومايكروسوفت. اختطف المهاجمون حساب المسؤول على npm، ونشروا ثلاثة إصدارات ضارة متتالية، وأرسلوا برامج تعدين العملات المشفرة وبرمجيات سرقة بيانات الاعتماد لكل من نفّذ npm install خلال تلك النافذة. بقيت الحزمة نشطة لمدة 4 ساعات تقريبًا قبل أن تسحبها npm.

لم تكن ua-parser-js الحادثة الأكبر. تخريب colors.js/faker.js عام 2022 من قبل المسؤول Marak Squires تعمّد كسر التطبيقات احتجاجًا على عدم دفع أجر العمل مفتوح المصدر، وأثر على أكثر من 19000 حزمة تابعة. الباب الخلفي لـ XZ Utils في مارس 2024، المُضمن في نظام بناء مكتبة الضغط بعد قرابة عامين من الهندسة الاجتماعية الصبورة، كان على بعد أيام من الوصول إلى توزيعات لينكس الرئيسية. تغطي هذه الحوادث كامل سطح التهديد: اختراق الحساب، سوء نية المسؤول، والتسلل طويل الأمد.

كيف تتحول أشجار التبعيات إلى أسطح هجوم

تطبيق React نموذجي لديه 6–10 تبعيات مباشرة. عندما تشغّل npm install، كل منها يسحب شجرة تبعياته الخاصة، والتي تسحب أشجارًا أخرى. مشروع create-react-app بسيط يولّد أكثر من 1400 حزمة في node_modules. من بينها، ربما 20–30 حزمة قام فريقك بتقييمها من حيث الثقة. الباقي هي تبعيات غير مباشرة — كود يُشغّل في خط أنابيب البناء (build pipeline) الخاص بك، في CI، وربما في حزمة الإنتاج التي لم يدققها فريقك مطلقًا.

ينمو سطح الهجوم بشكل غير خطي مع عمق التبعية. ثغرة في حزمة على عمق 4 في شجرتك (تبعية من تبعية من تبعية من تبعية) لا يمكن تمييزها عمليًا عن ثغرة في كودك الخاص بمجرد وصولها إلى الإنتاج. ومع ذلك، معظم الفرق تدقق التبعيات المباشرة وليس لديها تغطية منهجية للمستويات الأعمق.

إضافة typosquatting تشكل ناقلًا آخر. سجل npm يحتوي على حزم بأسماء مشابهة عمدًا لحزم شائعة: lodahs (lodash)، crossenv (cross-env)، reqyuest (request). تحسّن كشف typosquatting الآلي في npm منذ 2022، حيث يحجب ما يقدر بـ 15000 حزمة ضارة شهريًا وفقًا لبيانات OpenSSF، لكن المتغيرات الجديدة لا تزال تتسرب.

الأدوات التي تقلل المخاطر فعليًا

تحليل تكوين البرامج (SCA) في CI: أدوات مثل Snyk وSocket.dev وDependabot من GitHub تمسح شجرة التبعيات الخاصة بك مقابل قواعد بيانات CVE المعروفة وتُعلِم عن الإصدارات الضعيفة قبل دمجها. الطبقة المجانية من Snyk تغطي المستودعات العامة ومعظم الفرق الصغيرة. تختلف Socket.dev بتحليل سلوك الحزمة (الوصول الشبكي الجديد، الكود المبهم، نصوص التثبيت) بدلاً من مجرد مطابقة تجزئات CVE — اكتشفت هجمات من نمط ua-parser-js التي تتخلف عنها قواعد بيانات CVE. ادمج أياً منها مباشرة في فحوصات طلب السحب (pull request)، وليس فقط كمسح دوري.

npm audit وفرض ملف القفل: npm audit هو خط أساس، وليس حلاً. فقط يعلّم عن الحزم التي لديها CVE منشورة ويولّد ضوضاء عند مستويات خطورة عالية تتعلم الفرق تجاهلها. الأكثر قيمة: فرض أن package-lock.json مُلتزم (committed) ولا يتم تجاوزه أبدًا. أضف npm ci (بدلاً من npm install) إلى خط أنابيب CI — npm ci يُثبّت بدقة من ملف القفل، ويرفض تحديث أي شيء. ملف قفل معدّل في طلب سحب هو علامة حمراء تستحق المراجعة.

تثبيت الإصدارات (Dependency pinning) مقابل الإصدارات الدلالية: معظم ملفات package.json تستخدم نطاقات الإصدارات caret (^)، التي تسمح بتحديثات تلقائية للإصدارات الثانوية والتصحيحية. هجوم سلسلة توريد ينشر إصدارًا تصحيحيًا ضارًا سيتم سحبه تلقائيًا في التثبيت التالي. تثبيت الإصدارات بدقة (إزالة ^) يمنع الترقيات الصامتة؛ أدوات مثل Renovate Bot أو Dependabot يمكنها أتمتة انضباط مراجعة وتطبيق التحديثات بشكل صريح بدلاً من الصامت.

سلامة الموارد الفرعية (SRI) للنصوص المحملة من CDN: إذا حملت أي JavaScript من CDN في HTML (مثل jQuery، مقتطفات تحليلات، محملات خطوط)، استخدم تجزئات SRI. تجزئة SRI تخبر المتصفح برفض النص إذا كان محتواه لا يتطابق مع التجزئة المتوقعة. يمنع ذلك تعرض CDN من التأثير على مستخدميك. إنشاء تجزئات SRI يستغرق 30 ثانية باستخدام openssl dgst -sha384 -binary script.js | base64؛ نسبة التكلفة إلى الفائدة استثنائية.

إطار SLSA وإثبات المصدر (Provenance Attestation)

إطار Supply chain Levels for Software Artifacts (SLSA، يُنطق salsa)، الآن في الإصدار 1.0 وتديره OpenSSF، يوفّر نموذج نضج من أربعة مستويات لأمن سلسلة التوريد. في المستوى SLSA 2، تُولّد أنظمة البناء تصديقات إثبات مصدر موقعة: سجلات تشفيرية تربط قطعة أثرية معينة (حزمة منشورة) بالتزام معين وبيئة بناء معينة. في المستوى 3، بيئة البناء نفسها مُصلّبة لمنع التلاعب.

أضافت npm دعمًا لتصديقات إثبات المصدر في مايو 2023. الحزم المنشورة مع إثبات المصدر تتضمن تصديقًا قابلًا للتحقق يربط حزمة npm بسير عمل GitHub Actions الذي بناه، وتجزئة التزام محددة، ورابط المستودع. كمستهلك، يمكنك التحقق من ذلك باستخدام npm audit signatures. اعتبارًا من أوائل 2026، حوالي 8% من أفضل 10000 حزمة npm تُنشر مع إثبات مصدر — رقم منخفض يجب أن ينمو مع تحسن الوعي والأدوات.

تحديد الأولويات الواقعية للمخاطر: أين تركّز

ليس كل تطبيق لديه تعرض متساوٍ. API من جانب الخادم Node.js تعالج معاملات مالية لديها نموذج تهديد مختلف تمامًا عن مدونة ثابتة مبنية بإطار JavaScript. قبل الاستثمار في أدوات SCA شاملة، أجب عن ثلاثة أسئلة: هل يعمل هذا البرنامج بصلاحيات مرتفعة أو يصل إلى بيانات حساسة؟ هل يعالج مدخلات غير موثوقة؟ هل يُنشر في بيئات حيث الاختراق سيكون له عواقب حقيقية لاحقة؟

للتطبيقات عالية المخاطر، بطاقة OpenSSF Scorecard (github.com/ossf/scorecard) تقدم تقييم أمني آلي للحزم مفتوحة المصدر عبر 18 فحصًا أمنيًا بما في ذلك حماية الفروع، أتمتة تحديث التبعيات، وسياسة الإفصاح عن الثغرات. تشغيل Scorecard على تبعياتك المباشرة الرئيسية قبل إضافتها يستغرق دقائق ويُظهر الحزم ذات الصيانة السيئة قبل دخولها شجرتك.

نقاط عملية قابلة للتنفيذ

  • أضف Socket.dev أو Snyk إلى خط أنابيب CI هذا الأسبوع — ليس كمسح دوري، بل كبوابة (gate) لطلبات السحب. تحليل سلوك Socket.dev يلتقط تهديدات تفوتها أدوات CVE فقط.
  • حوّل من npm install إلى npm ci في CI وألتزم (commit) ملف package-lock.json إذا لم تفعل بعد. هذا يمنع انحراف ملف القفل وترقيات التبعيات الصامتة في البيئات الآلية.
  • ثبّت التبعيات الحرجة إلى إصدارات دقيقة واستخدم Renovate Bot لإدارة انضباط التحديثات الصريحة. العبء التشغيلي منخفض؛ الفائدة الأمنية حقيقية.
  • شغّل npm audit signatures على تبعياتك الرئيسية للتحقق من أي منها يُنشر مع إثبات المصدر. فضّل الحزم المثبتة المصدر للتطبيقات عالية الحساسية عندما توجد بدائل.
  • أضف تجزئات SRI إلى جميع النصوص المحملة من CDN في HTML الخاص بك. هذا يستغرق دقائق ويزيل تعرض CDN كناقل هجوم للكود المنفذ في المتصفح.
  • قيّم نصف قطر الانفجار الفعلي لديك قبل الإفراط في الهندسة. مشروع شخصي لا يحتاج إلى خط أنابيب SLSA كامل. خدمة معالجة مدفوعات تحتاج. طابق الاستثمار مع المخاطر الفعلية.
مشاركة:
سلسلة التبعيات في npm مسؤولية أمنية — والمطورون يستطيعون تقليل المخاطر | IRCNF - Intelligent Reliable Custom Next-gen Frameworks