الخطورة: CVSS و EPSS و KEV
مراجعة سريعة لـ CVSS، وليه الـ score لوحده مش كفاية، وإيه هو EPSS وقايمة CISA KEV، وترتيب الثغرات بيهم بـ Python.
نص شرح المعلم والكود الذي كتبه ونتيجة تشغيله، بنفس ترتيب الدرس.
في كورس التقارير اتعلّمنا CVSS بالتفصيل. النهارده هنراجعه بسرعة، ونشوف ليه لوحده مش كفاية علشان تقرر تبدأ بأنهي ثَغْرة.
الـ CVSS بيدّي الثَغْرة درجة من zero لـ ten. من تسعة لـ عشرة، Critical. من سبعة لتحت تسعة، High. من أربعة لتحت سبعة، Medium. وتحت أربعة، Low. الدرجة دي بتقيس خطورة الثَغْرة نفسها، نظرياً.
بس الـ CVSS بيقولّك الثَغْرة خطيرة قد إيه، مش احتمال إن حد يهاجمها قد إيه. وهنا بييجي EPSS: Exploit Prediction Scoring System. بيدّي احتمال من zero لـ واحد إن الثَغْرة تتهاجم في الأيام الجاية. ثَغْرة CVSS بتاعها أقل، بس EPSS عالي، ممكن تبقى أخطر عملياً.
وفيه حاجة تالتة أهم من الاتنين: قايمة KEV من CISA. معناها Known Exploited Vulnerabilities. دي ثَغَرات متأكدين إنها بتتهاجم في الواقع دلوقتي. أي ثَغْرة في القايمة دي، أولوية قصوى، مهما كان الـ CVSS بتاعها. عندنا تلات findings، كل واحد بـ CVSS و EPSS، وفيه واحد في KEV. function بتحوّل الدرجة لكلمة، ونطبع كل واحد بتفاصيله. نشغّل… خد بالك: التاني CVSS بتاعه تسعة وتمنية، أعلى واحد، بس EPSS بتاعه ضعيف جداً. والأول CVSS أقل، بس في KEV و EPSS عالي.
findings = [
{"cve": "CVE-2021-41773", "cvss": 7.5, "epss": 0.94, "kev": True},
{"cve": "CVE-2020-11984", "cvss": 9.8, "epss": 0.03, "kev": False},
{"cve": "CVE-2019-0211", "cvss": 7.8, "epss": 0.12, "kev": False},
]
def severity(score):
if score >= 9.0:
return "Critical"
if score >= 7.0:
return "High"
if score >= 4.0:
return "Medium"
return "Low"
for f in findings:
print(f["cve"], f["cvss"], severity(f["cvss"]), "EPSS", f["epss"], "KEV" if f["kev"] else "")المخرجات
CVE-2021-41773 7.5 High EPSS 0.94 KEV CVE-2020-11984 9.8 Critical EPSS 0.03 CVE-2019-0211 7.8 High EPSS 0.12
دورك: رتّب الـ findings بحيث اللي في KEV الأول، وبعدين الأعلى EPSS، وبعدين الأعلى CVSS. واطبع أول واحد تبدأ بيه.
sorted(findings, key=lambda f: (f["kev"], f["epss"], f["cvss"]), reverse=True)
الحل: نشغّل… الأول بقى CVE path traversal، مش اللي CVSS بتاعه أعلى. وده بالظبط الفرق بين الترتيب الذكي والترتيب بالدرجة بس.
findings = [
{"cve": "CVE-2021-41773", "cvss": 7.5, "epss": 0.94, "kev": True},
{"cve": "CVE-2020-11984", "cvss": 9.8, "epss": 0.03, "kev": False},
{"cve": "CVE-2019-0211", "cvss": 7.8, "epss": 0.12, "kev": False},
]
def severity(score):
if score >= 9.0:
return "Critical"
if score >= 7.0:
return "High"
if score >= 4.0:
return "Medium"
return "Low"
for f in findings:
print(f["cve"], f["cvss"], severity(f["cvss"]), "EPSS", f["epss"], "KEV" if f["kev"] else "")
ranked = sorted(findings, key=lambda f: (f["kev"], f["epss"], f["cvss"]), reverse=True)
print("fix first:", ranked[0]["cve"])المخرجات
CVE-2021-41773 7.5 High EPSS 0.94 KEV CVE-2020-11984 9.8 Critical EPSS 0.03 CVE-2019-0211 7.8 High EPSS 0.12 fix first: CVE-2021-41773
الدرس الجاي: فين قواعد البيانات اللي فيها كل ده؟ نبدأ بالبحث اليدوي في NVD. يلا بينا.
03 / دروس المسار (16)
- 01يعني إيه ثغرة؟ ومن الـ Recon للـ Vulnerabilities
- 02CVE و CWE: أسماء الثغرات
- 03الخطورة: CVSS و EPSS و KEVانت هنا
- 04البحث في NVD
- 05Exploit-DB و searchsploit
- 06GitHub و Metasploit
- 07الفحص بـ Nmap NSE
- 08الفحص بـ Nuclei
- 09الفحص بـ Nikto
- 10الفحص بـ OpenVAS
- 11فحص بصلاحيات ومن غيرها
- 12تجميع وتنظيم النتايج
- 13False Positives والتأكد اليدوي
- 14ترتيب الأولويات
- 15أتمتة الفحص بـ Python
- 16مراجعة شاملة