TL؛ DR
يُعدّ العثور على ثغرات حزم npm أمرًا سهلاً. npm audit يقوم بذلك في أربع ثوانٍ ويقدم لك 400 نتيجة. الجزء الصعب هو السؤالان التاليان: أي منهما يمكن الوصول إليه فعليًا في تطبيقك، وأي ترقية تحل المشكلة دون تعطيل عملية البناء.
- معظم ما ورد في القائمة ليس من مشكلتك. إن تطبيق إمكانية الوصول وسياق وقت التشغيل على النتائج "الحرجة" لا يُبقي إلا نسبة ضئيلة منها حرجة. ويُحدد تحليل مخطط الاستدعاءات أيها تبقى حرجة.
npm audit fix --forceليست هذه استراتيجية إصلاح. يقوم النظام بحل المشكلات عن طريق الانتقال إلى الإصدارات الرئيسية، وهذا هو السبب في أن مهمة أمنية ما تتحول إلى انقطاع في الخدمة.- توجد التبعيات المتعدية في مكان وجود وحدة التخزين. لم تخترها، وغالبًا لا يمكنك ترقيتها مباشرة، وهي تهيمن على عدد النتائج.
- قم بإصلاح المشكلة قبل الدمج، وليس بعد الإصدار. بوابة في التكامل المستمر ونظام آلي pull request يستغرق الأمر دقائق. أما تحديث الإنتاج فيستغرق عطلة نهاية أسبوع.
لماذا لا يمثل عدد النتائج المشكلة؟
كل مشروع Node يتجاوز عامه الأول يُنتج نفس التجربة. تُجري فحصًا، فتجد مئات الثغرات الأمنية في حزم npm، والقائمة طويلة جدًا لدرجة أن الرد المنطقي هو إغلاق نافذة الأوامر.
هذا رد فعل صحيح، وهذا هو الجانب المقلق. ما يقارب ثلاثة أرباع قواعد البيانات البرمجية تحتوي على مكونات مفتوحة المصدر عالية المخاطر، ومعظم ما يُبلغه الماسح الضوئي في أي يوم يكون موجودًا بالفعل في شجرة التبعيات. القائمة دقيقة، لكنها ليست قائمة مهام.
إن الفجوة بين القائمة الدقيقة والقائمة القابلة للتنفيذ هي السياق، وتتلخص في عدد قليل من الأسئلة.
- هل يمكن الوصول إلى الكود المعرض للاختراق من تطبيقي؟
- هل يستغل أحد هذا الأمر في الواقع؟
- هل الشيء الذي يؤثر عليه هذا الأمر مهم للشركة؟
جهاز مسح ضوئي لا يستطيع الإجابة على تلك الأسئلة، يعطيك قائمة جرد ويسميها تقريرًا.
كيفية فحص حزم npm بحثًا عن الثغرات الأمنية
هناك أربع طرق عملية للتحقق من حزم npm بحثًا عن الثغرات الأمنية، وهي تجيب على أسئلة مختلفة.
| الأسلوب | ما الذي يمنحك إياه؟ | حيث يتوقف الأمر |
|---|---|---|
npm audit | فوري، مدمج، لا يحتاج إلى إعداد. نصائح عبر شجرة التبعيات الكاملة | لا إمكانية للوصول، ولا سياق للاستغلال. فقط مستوى الخطورة، و --force سوف يكسر الأشياء |
| تنبيهات Dependabot | تنبيهات تلقائية على مستودعك، مع الترقية pull requests | يعتمد على التوصيات. فهو لا يعلم ما إذا كان الكود الخاص بك يستدعي الدالة المعرضة للخطر. |
| OSV أو ال قاعدة بيانات جيثب الاستشارية | موثوق، مجاني، قابل للاستعلام حسب الحزمة والإصدار. مناسب للفحوصات الفردية | قاعدة بيانات، وليست سير عمل. ما زلت تقوم بالفرز والإصلاح يدويًا. |
| SCA مع إمكانية الوصول | نفس التوصيات، مع تصفية النتائج حسب إمكانية استدعاء الكود المعرض للخطر، بالإضافة إلى احتمالية الاستغلال ومسار الترقية الآمن. | يتطلب أداة في pipeline |
تبدأ npm audit لأنه لا يكلف شيئاً ويستغرق ثوانٍ. لا تتوقف عند هذا الحد، لأن الإجابة التي يقدمها هي "هذا كل شيء"، وكل شيء ليس خطة.
إذا كنت تعتمد على خلاصات التنبيهات، فمن المهم أن تعرف أن قاعدة بيانات GitHub للتنبيهات تحتوي على تنبيهات بشأن البرامج الضارة لنظام npm البيئي، لكن Dependabot لا يُصدر تنبيهات بشأنها عمدًا، لأن المستخدم النهائي عادةً لا يستطيع حلها بالتحديث. هذه ثغرة هيكلية، وليست إعدادًا يمكنك تفعيله. تحتاج الحزم الضارة إلى آلية تحكم مختلفة: الكشف عنها عند النشر وليس بعد الكشف عنها. Xygeni's الإنذار المبكر بالبرامج الضارة يحلل هذا البرنامج الحزم المنشورة حديثًا عبر npm وPyPI وMaven وغيرها من سجلات الحزم فور ظهورها، باستخدام تحليل السلوك وتحليل الشذوذ بدلًا من انتظار التوقيع، وهو مُضمّن في خطة المطور المجانية. سنتناوله في خبيث حزم npm.
المرشحات التي تحول 400 نتيجة إلى قائمة مختصرة
هذا هو الجزء الذي يغير طريقة عمل الفريق.
| تصفية | السؤال الذي يجيب عليه | ما يزيله عادةً |
|---|---|---|
| وسائل الأتصال | هل يمكن لتنفيذ البرنامج في تطبيقي الوصول فعلياً إلى الوظيفة المعرضة للخطر؟ | أكبر تخفيض. معظم التنبيهات موجودة في التعليمات البرمجية التي لا يستدعيها التطبيق أبدًا. |
| توافر الثغرات | هل توجد ثغرة أمنية عامة قابلة للاستخدام، وهل يتم استغلالها في الوقت الحالي؟ | يفصل هذا النظام بين المخاطر النظرية والمخاطر المُستغلة. ويُعطى اكتشافٌ يتضمن ثغرةً أمنيةً مُعلنةً الأولوية بغض النظر عن درجة خطورتها. |
| احتمالية الاستغلال (EPSS) | ما مدى احتمالية الاستغلال في البرية خلال الثلاثين يومًا القادمة؟ | نتائج بالغة الخطورة لا يستغلها أحد، وهي نادراً ما تكون من ضمن أعمال هذا الأسبوع |
| سياق الأعمال | هل الخدمة المتأثرة مهمة، وهل هي معرضة للخطر؟ | نتائج قابلة للاستكشاف والاستغلال في أنظمة لا تنطوي على أي مخاطر حقيقية |
| توافر الإصلاح | هل هناك إصدار يحل هذه المشكلة دون أن يسبب لي أي مشاكل؟ | يفصل هذا بين ما يمكنك إنجازه اليوم وما يحتاج إلى حل بديل. |
- وسائل الأتصال يُعدّ هذا أول وأكبر خفض. لا يُمكن استغلال ثغرة أمنية في حزمة تعتمد عليها إلا إذا كان التنفيذ قادرًا على الوصول فعليًا إلى الدالة المُعرّضة للخطر. يُجيب تتبع مخطط الاستدعاءات على هذا السؤال على مستوى الدالة بدلًا من التخمين من ملف البيان، كما أنه يُميّز بين المكونات التي تستخدمها بالفعل وتلك الموجودة فقط. يُقلّل تحليل إمكانية الوصول في Xygeni من النتائج الإيجابية الخاطئة بنسبة تصل إلى 70%.
توافر الثغرات أما الثاني، فهو حقيقة لا مجرد تنبؤ. فاستغلال ثغرة أمنية علنية، أو استغلال مؤكد في بيئة حقيقية، يُغير أولوية الاكتشاف بغض النظر عن درجة خطورته. لم يعد هذا التمييز مجرد ممارسة جيدة، بل أصبح التزامًا: فبموجب قانون الأمن السيبراني، يُلزم المُصنِّع الذي يكتشف ثغرة أمنية مُستغلة في منتجه بالإبلاغ عنها خلال 24 ساعة. ولا يُمكن لأي برنامج لا يستطيع التمييز بين "الاستغلال النشط" و"الخطورة العالية وفقًا لنظام CVSS" الوفاء بهذا الالتزام.
يُعدّ احتمال الاستغلال المعيار الثالث، وهو نفس السؤال مع إضافة عنصر التنبؤ. يُقيّم نظام EPSS احتمالية استغلال ثغرة أمنية في بيئة حقيقية خلال الثلاثين يومًا القادمة، وهو سؤال يختلف تمامًا عن مدى خطورة الاستغلال. نادرًا ما يكون الحصول على درجة عالية في نظام CVSS مع درجة EPSS ضئيلة إنجازًا يُذكر هذا الأسبوع.
- سياق الأعمال أما الثالث فهو الذي لا يمكن لأي مصدر بيانات عام توفيره. إن وجود ثغرة أمنية قابلة للاستغلال في خدمة دفع عبر الإنترنت لا يُعد اكتشافًا مماثلاً لوجود نفس الثغرة الأمنية (CVE) في أداة إعداد تقارير داخلية.
عند تطبيق هذه المرشحات معًا، فإنها تحوّل بشكل روتيني قائمةً لا يقرأها أحد إلى قائمة يُكملها أحدهم. عادةً ما يُبقي سياق وقت التشغيل وإمكانية الوصول نسبةً ضئيلةً فقط من النتائج "الحرجة" على حالها. يتعامل برنامج Xygeni مع إمكانية الوصول، وتوافر الاستغلال، وEPSS، وسياق العمل كمراحل قابلة للتكوين في مسار تحديد الأولويات، يصل عددها إلى ثماني مراحل، بحيث يصبح "قابل للوصول ومستغل بنشاط" قائمة انتظار ثابتة بدلاً من استعلام يُنفّذه أحدهم يدويًا.
إصلاح ثغرات حزمة npm دون تعطيل عملية البناء
يُعدّ اكتشاف الثغرات الأمنية الجزء الأسهل. والسبب في بقاء ثغرات حزم npm دون حل لأشهر هو أن إصلاحها ينطوي على مخاطر، والمطورون يدركون ذلك.
| خيار الإصلاح | عندما يكون ذلك صحيحاً | ما الذي يجب التحقق منه أولاً |
|---|---|---|
npm audit fix | يتم حل المشكلة الاستشارية ضمن نطاق متوافق مع الإصدارات الدلالية | عادةً ما يكون آمنًا. أعد تشغيل الاختبارات، ثم ادمجها. |
npm audit fix --force | نادراً ما يكون ذلك بدون حراسة | هذا التغيير يشمل الإصدارات الرئيسية. تعامل مع كل نتيجة على أنها تغيير جذري حتى يثبت العكس. |
| ترقية مباشرة مستهدفة | أنت تملك التبعية، وهناك نسخة معدلة منها. | ما هي الثغرات الأمنية التي تختفي، وما هي الثغرات الجديدة التي تظهر، وما إذا كان الانتقال سيؤدي إلى تعطيل التعليمات البرمجية الخاصة بك |
| دقة انتقالية | الحزمة المعرضة للخطر موجودة على بعد أربعة مستويات وليست لك | أقصر مسار ترقية في الشجرة يحل المشكلة، أو تجاوزها إذا لم يكن هناك مسار ترقية موجود. |
| لا يوجد حل متاح | لم يقم المسؤول عن الصيانة بتصحيحها | هل يمكن الوصول إليه أصلاً؟ إذا لم يكن ذلك ممكناً، فقم بتوثيق المشكلة وانتقل إلى حل آخر بدلاً من فرض الترقية. |
| قم بإزالة التبعية | العبوة بالكاد مستخدمة أو مهجورة | سواء كان هناك من لا يزال ينادي به أم لا. المكونات غير المستخدمة هي أرخص الحلول المتاحة. |
السؤال الأهم قبل أي ترقية ليس "هل تُصلح هذه الترقية ثغرة CVE؟"، بل ثلاثة أسئلة في آن واحد: ما هي الثغرات التي تختفي مع هذا الإصدار، وما هي الثغرات الجديدة التي تظهر معه، وهل تُسبب هذه الترقية أي خلل في الكود الخاص بي؟
زيجيني يعرض الخيارات الثلاثة جميعها لكل تبعية معرضة للخطر، لذا فإن الاختيار يكون بين خيارات مرئية بدلاً من اتخاذ قرار متسرع. ثم يقوم برنامج Autofix بإنشاء pull request مع الإصدار المُحدَّث، تُطبِّق عملية المعالجة الجماعية إصلاحات متعددة في إجراء واحد، ويعمل برنامج Xygeni Bot عند الطلب. pull requests أو يومياً، وبالتالي يتقلص حجم العمل المتراكم دون أن يقوم أحد بجدولة ذلك.
بالنسبة للتبعيات المتعدية، حيث لا يمكنك ببساطة ترقية إصدار لم تختره، فإن الناتج المفيد هو أقصر مسار ترقية في الشجرة الذي يحل المشكلة الاستشارية، وليس تنبيهًا يخبرك بأن حزمة ما على بعد أربعة مستويات معرضة للخطر.
قبل الشحن: مكان الشيك
"قبل شحنها" هو ادعاء يتعلق بجدولة المواعيد، ويتلخص في ثلاثة مواضع.
- في بيئة التطوير المتكاملةلذلك يرى المطور المشكلة أثناء اختيار التبعية، وهو الوقت الأرخص لتغييرها.
- على pull requestحيث يُعلّق برنامج آليّ مُوضّحًا التغييرات ويُفعّل الإصلاح، وحيث يُمكن لبوابة أمنية أن تُفشل عملية البناء عند وجود ثغرات تتجاوز الحدّ المُعيّن. إنّ التقييد بناءً على خطورة الثغرة فقط هو ما يدفع الفرق إلى تعطيل البوابة، بينما التقييد بناءً على سهولة الوصول إلى الثغرات واستغلالها هو ما يدفعهم إلى الإبقاء عليها.
- بشكل مستمر بعد الإصدار، لأنّ التبعية التي كانت سليمة عند الدمج تصبح عرضة للاختراق في اليوم الذي يُنشر فيه التنبيه. والمراقبة المستمرة عبر السجلات هي ما يكشف ذلك، دون الحاجة إلى أن يتذكر أحد إعادة الفحص.
ويجب وضع مخرجات الثلاثة جميعها في قائمة انتظار واحدة ذات أولوية بجانب قائمة انتظارك. SAST, أسرارو نتائج الحاويات، بما في ذلك تلك التي يتم استيرادها من الأدوات التي تستخدمها بالفعل. قائمة الثغرات الأمنية القائمة التي توجد في وحدة تحكم خاصة بها هي قائمة تتنافس على جذب الانتباه مع العمل الذي كان من المفترض أن تفيد فيه.
أرسل الحل، لا النتائج.
إنّ الماسح الضوئي الذي يُظهر لك 400 ثغرة أمنية في حزم npm لم يقم بالعمل المطلوب، بل قام بنقل العمل.
يُضيّق برنامج Xygeni نطاق نتائج التبعيات بناءً على إمكانية الوصول، واحتمالية الاستغلال، وسياق العمل، ويُبيّن ما يُصلحه كل تحديث وما قد يُعطّله، ويفتح المجال لـ pull request مع النسخة المُعدّلة. يعمل في جهازك pipeline، ينتج عنه SBOM وإخراج VDR في SPDX و CycloneDX، والأدلة التي تطلبها CRA و NIS2 و DORA، ويضع نتائج التبعية في نفس قائمة الانتظار ذات الأولوية مثل بقية المخاطر الخاصة بك، بما في ذلك النتائج من الماسحات الضوئية التي لا تقوم باستبدالها.
ابدأ مجانًا ومسح مستودع، أو انظر كيف تؤثر إمكانية الوصول على القائمة.
الأسئلة الشائعة
كيف يمكنني فحص حزم npm بحثًا عن الثغرات الأمنية؟
يجري npm audit للحصول على نظرة سريعة، استخدم أداة تحليل إمكانية الوصول لتضييق نطاق القائمة إلى النتائج التي يمكن فيها استدعاء الكود المُعرّض للخطر. تُعد قواعد البيانات الاستشارية مثل OSV وقاعدة بيانات GitHub الاستشارية مفيدة لفحص حزمة وإصدار مُحددين.
Is npm audit fix هل من الآمن تشغيله؟
عادةً ما يكون الإصدار غير القسري آمناً، لأنه يبقى ضمن نطاقات متوافقة مع semver. npm audit fix --force ليس الأمر كذلك: فهو يقوم بالترقية عبر الإصدارات الرئيسية لحل المشكلات، ومن هنا تأتي التغييرات الجذرية.
لماذا أعاني من هذا الكم الكبير من الثغرات الأمنية في حزم npm؟
لأن معظمها متعدية. تقوم بتثبيت عدد قليل من التبعيات المباشرة وترث مئات التبعيات غير المباشرة، ولكل منها سجلها الخاص من التوصيات. الحجم طبيعي، لكن المشكلة تكمن في الفرز.
ما هو تحليل إمكانية الوصول؟
يُعدّ تحديد ما إذا كان تنفيذ تطبيقك يصل فعليًا إلى الدالة المُعرّضة للخطر في أحد التبعيات، أهمّ وسيلة لتقليل التشويش في أمان التبعيات، لأنّ معظم الثغرات المُبلّغ عنها تقع في أجزاء من التعليمات البرمجية التي لا يستدعيها تطبيقك أبدًا.
هل يجب عليّ استخدام نظام CVSS أم نظام EPSS لتحديد الأولويات؟
كلاهما لأغراض مختلفة. يصف نظام CVSS مدى خطورة الثغرة الأمنية في حال استغلالها، بينما يُقدّر نظام EPSS احتمالية استغلالها خلال الثلاثين يومًا القادمة. إنّ الاعتماد على الخطورة دون الاحتمالية يُنتج قائمة مُرتبة بشكل خاطئ.
كم مرة يجب عليّ فحص حزم npm بحثًا عن الثغرات الأمنية؟
بشكل مستمر، وليس وفق جدول زمني. فحص نظيف يوم الاثنين لا يعني شيئاً يوم الأربعاء إذا وصل تنبيه إلى طرد قمت بشحنه بالفعل.







