الخطورة: CVSS و EPSS و KEV

جارٍ التحميل…

01 / ملخص الدرس

الخطورة: CVSS و EPSS و KEV

مراجعة سريعة لـ CVSS، وليه الـ score لوحده مش كفاية، وإيه هو EPSS وقايمة CISA KEV، وترتيب الثغرات بيهم بـ Python.

02 / شرح الدرس مكتوبًا

نص شرح المعلم والكود الذي كتبه ونتيجة تشغيله، بنفس ترتيب الدرس.

في كورس التقارير اتعلّمنا 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 عالي.

main.py
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 بتاعه أعلى. وده بالظبط الفرق بين الترتيب الذكي والترتيب بالدرجة بس.

main.py
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)
  1. 01يعني إيه ثغرة؟ ومن الـ Recon للـ Vulnerabilities
  2. 02CVE و CWE: أسماء الثغرات
  3. 03الخطورة: CVSS و EPSS و KEVانت هنا
  4. 04البحث في NVD
  5. 05Exploit-DB و searchsploit
  6. 06GitHub و Metasploit
  7. 07الفحص بـ Nmap NSE
  8. 08الفحص بـ Nuclei
  9. 09الفحص بـ Nikto
  10. 10الفحص بـ OpenVAS
  11. 11فحص بصلاحيات ومن غيرها
  12. 12تجميع وتنظيم النتايج
  13. 13False Positives والتأكد اليدوي
  14. 14ترتيب الأولويات
  15. 15أتمتة الفحص بـ Python
  16. 16مراجعة شاملة