تعد عملية تحديد أولويات الثغرات الأمنية مرحلة حاسمة حيث يتم تقييم المخاطر النسبية وترتيب معالجة الثغرات الأمنية، وترتيبها من الأعلى إلى الأدنى من حيث الأولوية. في مقالتي السابقة، ناقشتُ . في هذه المقالة، سأرشدك خلال نهجي المُخصص لتقييم أولوية الإصلاح، وأُوضح كيف دمجتُ هذه الوظيفة في منصة Budibase. كيفية إدارة الثغرات الأمنية باستخدام Budibase غالبًا ما تنشأ العديد من التحديات أثناء عملية المعالجة: هناك حجم كبير من الثغرات الأمنية مع مستويات متفاوتة من المخاطر عبر الأصول المختلفة. إن الاعتماد فقط على درجات مخاطر CVSS لتحديد الأولوية ليس فعالاً دائمًا، كما تكشف اختبارات الاختراق في كثير من الأحيان. لا يمكن معالجة بعض الثغرات الأمنية بسرعة بسبب عمليات تطوير التطبيقات المصممة بشكل سيئ أو، في بعض الحالات، بسبب نقص دعم البائعين. النظرية ومقاييس الأولوية بعد فحص الثغرات الأمنية، من الضروري تحليل النتائج وتحديد أولويات الإصلاح. يمكن لتطبيق التصحيحات الأمنية بانتظام حل معظم الثغرات الأمنية بأقل جهد. مع ذلك، هناك حالات تتطلب فحصًا دقيقًا لثغرات أمنية محددة وتقييم المخاطر المرتبطة بها. إذا لم يكن الإصلاح الفوري ممكنًا، ففكّر في تطبيق ضوابط تعويضية. على سبيل المثال، إذا حددت ثغرة حقن SQL في تطبيق ويب لا يمكن إصلاحها بسرعة، يمكنك استخدام جدار حماية تطبيقات الويب (WAF) كعنصر تحكم تعويضي، مع توقيع مناسب لتلك الثغرة. لأغراض التقييم، قمت بإنشاء واجهة في Budibase تسمح لي بتقييم نقاط الضعف ذات الأولوية بشكل كمي وتصدير قائمة بتنسيق .csv لزملائنا. سأوضح المقاييس الرئيسية التي بنيت عليها مرشحاتي: : كلما طالت مدة عدم إصلاح الثغرة، زاد احتمال ظهور ثغرة استغلالية في المستقبل. ومع ذلك، مع مرور الوقت، عادةً ما تتوفر أدوات تحكم وتصحيحات أكثر تعويضًا. على العكس، إذا تم الكشف عن ثغرة مؤخرًا، فمن غير الواقعي توقع تصحيح فوري من فريقك. لذلك، أضفتُ مُرشِّحًا لاستبعاد الثغرات التي مضى عليها أقل من X يوم. المدة منذ الكشف عن الثغرة : يقوم هذا المقياس بتقييم أهمية الأصول في حالة تعرضها للخطر. أهمية الأصول : يُساعد هذا العامل في تحديد مدى تعرض الأصل لأجزاء الشبكة غير المُتحكم بها، وتحديد ضوابط التعويض المُطبقة بناءً على موقعه. لقد دمجتُ هذا المقياس مع الأهمية؛ حيث تُصنف الأصول الواقعة على المحيط كأصول ذات أولوية عالية. موقع الأصول : يشير هذا إلى ما إذا كانت الثغرة مُستغلة حاليًا. إذا قدّم البائع أو مُزوّد معلومات التهديدات درجة اتجاه، يُمكن استخدام هذه المعلمة في المُرشّح. اتجاه الثغرة : يتم استخلاص ذلك من مقاييس CVSS، مثل إمكانية الاستغلال المحلي مقابل إمكانية الاستغلال عن بعد. متجه الاستغلال : يشير هذا إلى ما إذا كان هناك استغلال فعال موجود بالفعل للثغرة الأمنية. توفر الاستغلال : يعكس هذا تصنيف الخطورة الأساسية وفقًا لمقاييس CVSS القياسية. خطورة CVSS : يشير هذا إلى ما إذا كانت هناك إصلاحات أو تحديثات من البائع لمعالجة الثغرة الأمنية. توفر التصحيح وتساعد هذه المقاييس مجتمعة في تحديد أولويات نقاط الضعف استنادًا إلى تأثيرها المحتمل وكفاءة استراتيجيات الاستجابة. تنفيذ مرشحات الأولوية في Budibase الهدف الرئيسي من هذا التنفيذ هو ضمان تحديث لوحات المعلومات والبيانات ذات الصلة تلقائيًا عند تغيير أيٍّ من معلمات الفلتر. يتيح هذا للزملاء المسؤولين عن التصحيحات تصدير النتائج الأكثر صلة. في Budibase، تتم عملية التصفية من خلال عناصر تصفية واجهة المستخدم. تُمرَّر القيمة المحددة كمتغير إلى استعلام SQL باستخدام الروابط. يتم تكوين هذه المتغيرات في إعدادات عنصر الرسم البياني. تظهر الروابط في منتصف الصورة أدناه، كما هو موضح في المثال. في استعلام SQL، تُدرج المتغيرات باستخدام أقواس متعرجة مزدوجة {{var}} في الأماكن المناسبة. هذا يضمن استعلام SQL يعمل بكامل طاقته. يتم إنشاء استعلام SQL في علامة التبويب "البيانات" ضمن قسم اتصال قاعدة البيانات. هذا هو المكان أيضًا الذي يمكنك فيه تحديد الارتباطات لاستعلام SQL وتعيين القيم الافتراضية في حالة كان الفلتر فارغًا أو لم يتم تحديد أي شيء. أمثلة على استعلامات SQL مع تحديد الأولويات لإنشاء لوحة المعلومات فيما يلي العديد من الأمثلة على استعلامات SQL التي يمكن استخدامها لإنشاء لوحات معلومات، حيث يتميز كل منها بمرشحات تحديد الأولوية. لوحة المعلومات 1: أكثر 10 أصول عرضة للخطر SELECT COUNT(hostname) AS total, hostname FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND status = 'new' AND VulnerabilityIssueTime < CURRENT_DATE - {{days}}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY hostname ORDER BY total DESC LIMIT 10; لوحة المعلومات 2: أكثر 10 خدمات عرضة للخطر SELECT COUNT(hostname) AS total, hostname FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND status = 'new' AND VulnerabilityIssueTime < CURRENT_DATE - {{days}}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY hostname ORDER BY total DESC LIMIT 10; SELECT COUNT(hostname) AS total, VulnerableEntity || ' ' || VulnerableEntityVersion AS VulnerableObject FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND VulnerableEntity IS NOT NULL AND status = 'new' AND VulnerabilityIssueTime < CURRENT_DATE - {{days}}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY VulnerableObject ORDER BY total DESC LIMIT 10; لوحة المعلومات 3: أفضل 10 ثغرات أمنية مخترقة نشطة SELECT COUNT(hostname) AS total, VulnerableEntity || ' ' || VulnerableEntityVersion AS VulnerableObject FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND VulnerableEntity IS NOT NULL AND status = 'new' AND VulnerabilityIssueTime < CURRENT_DATE - {{days}}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY VulnerableObject ORDER BY total DESC LIMIT 10; ماذا ينتج كل هذا؟ SELECT COUNT(DISTINCT hostname) AS total, cve FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND status = 'new' AND cve IS NOT NULL AND VulnerabilityIssueTime < CURRENT_DATE - {{ days }}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY cve ORDER BY total DESC LIMIT 10; SELECT COUNT(DISTINCT hostname) AS total, cve FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND status = 'new' AND cve IS NOT NULL AND VulnerabilityIssueTime < CURRENT_DATE - {{ days }}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY cve ORDER BY total DESC LIMIT 10; في النهاية، أصبح هذا الإعداد أداةً بسيطةً وفعّالةً لتسليط الضوء على الأصول والخدمات الأكثر إشكاليةً بناءً على نقاط الضعف الأكثر خطورة. كما يُتيح تصدير هذه المعلومات بسهولة عند الحاجة. إن عدم وجود ميزانية لمنصة باهظة الثمن لإدارة الثغرات الأمنية لا يعني عدم قدرتك على تحديد أولويات الثغرات بفعالية. قد تفتقر العديد من حلول إدارة الثغرات الأمنية التجارية إلى مستوى المرونة في تحديد الأولويات الذي تتطلبه البنى التحتية المحددة. خلاصة القول: في المقالة التالية، سوف أستكشف ، وأوضح كيفية تنفيذه في Budibase، وأضيف وظيفة لتصدير قائمة من الثغرات الأمنية ذات الأولوية. نظام تسجيل التنبؤ بالاستغلال (EPSS) سأحب أن أسمع منك: هل تستخدم تحديد أولويات الثغرات في عملك؟ كيف تقوم بتتبع الأصول الهامة؟