מודיעין חולשות
קריאת CVE: מה רשומת CVE אומרת ומה היא לא אומרת
רשומת CVE נותנת שם לפגם ומפנה לספק, וההודעה של הספק היא שקובעת את הגרסה המתוקנת.
מה המשמעות של ציון CVSS כמו 9.8, איך בנויות מחרוזות וקטור של v4.0 ו-v3.1, ואיך מפענחים ומחשבים אחת מחדש ביד.
CVSS היא מערכת הניקוד שעומדת מאחורי רוב ציוני החולשות שמתפרסמים. בדרך כלל מופיעים מספר בין 0.0 ל-10.0, מילת חומרה כמו "Critical" ומחרוזת ארוכה שנראית כמו מספר סידורי. המאמר מסביר מה המשמעות של כל חלק, איך קוראים את המחרוזת שדה אחר שדה, ואיך בודקים ציון שפורסם בלי להסתמך על אחרים.
CVSS הוא ראשי תיבות של Common Vulnerability Scoring System. מי שמתחזק אותו הוא FIRST, ה-Forum of Incident Response and Security Teams. הגרסה הנוכחית היא 4.0, שפורסמה בסוף 2023. גרסה 3.1 עדיין מופיעה ברוב ההודעות הישנות יותר ובמסד הנתונים NVD, ולכן צריך לדעת לקרוא את שתיהן.
CVSS נותן לחולשה ציון בין 0.0 ל-10.0. הציון נגזר מהתכונות של החולשה: כמה קשה להגיע אליה, מה התוקף צריך קודם, וכמה נזק היא יכולה לגרום אם מישהו מנצל אותה. רוב הכלים ממפים את המספר לדירוג:
| דירוג | טווח ציון |
|---|---|
| None | 0.0 |
| Low | 0.1 עד 3.9 |
| Medium | 4.0 עד 6.9 |
| High | 7.0 עד 8.9 |
| Critical | 9.0 עד 10.0 |
הדירוגים זהים ב-v3.1 וב-v4.0. המתמטיקה שמאחורי המספר שונה.
צוותים צריכים מילה משותפת לחומרה. ספק כותב הודעה, סורק מסמן נכס, מנהל שואל איזה טלאי קודם, וכולם צריכים להתכוון לאותו דבר כשהם אומרים "high". CVSS נותן להם סולם משותף. מחרוזת הווקטור גם מתעדת את הנימוק, כך שקורא יכול לבדוק אם הציון מתאים למערכת שלו.
לציון יש מגבלות, ורוב הטעויות נובעות מהתעלמות מהן. הסעיף על חומרה וסבירות עוסק במגבלה העיקרית.
CVSS v4.0 מארגן את המדדים שלו בארבע קבוצות. כדי להפיק ציון מספיקה קבוצת הבסיס.
מדדי Base מתארים את החולשה כפי שהיא קיימת בתוכנה הפגיעה, בלי ידע על הרשת שלך. הודעות אבטחה מפרסמות אותם כמעט תמיד. ב-v4.0 הם כוללים:
מדדי Threat משתנים עם הזמן. מדד ה-Threat ב-v4.0 הוא E, בשלות האקספלויט. הערכים האפשריים הם A (attacked, יש ראיות לניצול), P (קיים proof of concept), U (unreported) או X (not defined, ברירת המחדל). ציון שבו E מוגדר יכול להיות שונה מציון הבסיס, והוא זז כשתמונת האיום משתנה.
מדדי Environmental מתארים את הפריסה שלך. מדדי הדרישות (CR, IR ו-AR עבור סודיות, שלמות וזמינות) אומרים כמה כל תכונה חשובה לך. מדדי הבסיס המותאמים מאפשרים לדרוס ערך בסיס כשהתצורה שלך משנה אותו. חולשה בדף כניסה שפתוח לאינטרנט ואותה חולשה ב-VM של מעבדה בלי נתיב רשת יכולות לקבל אותו ציון בסיס, ועדיין לדרוש עדיפויות שונות בסביבה שלך.
מדדי Supplemental מוסיפים הקשר, כמו השפעה על בטיחות, יכולת אוטומציה, מאמץ התאוששות או דחיפות. הם לא משנים את הציון, ועוזרים לצוות למיין עבודה.
גרסה 3.1 משתמשת בקבוצות Base, Temporal ו-Environmental. אין בה קבוצת Supplemental, והמדדים הזמניים שלה (בשלות קוד האקספלויט, רמת התיקון ורמת הביטחון בדיווח) שונים ממדד ה-E היחיד של v4.0.
מחרוזת הווקטור היא הצורה המכווצת של המדדים. היא מתחילה בגרסה, ואחריה כל מדד בתבנית Name:Value, עם קווים נטויים ביניהם. כל ערך הוא אות אחת. כשמכירים את האותיות, אפשר לקרוא כל מחרוזת בלי טבלה.
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:Nפענוח שדה אחר שדה:
| שדה | ערך | משמעות |
|---|---|---|
| CVSS | 4.0 | גרסת המפרט |
| AV | N | וקטור תקיפה: network. הערכים האחרים הם A (adjacent), L (local) ו-P (physical). |
| AC | L | מורכבות תקיפה: low. הערך האחר הוא H. |
| AT | N | דרישות תקיפה: none. הערך האחר הוא P (present), עבור תנאים כמו חלון race או הגדרת פריסה מסוימת. |
| PR | N | הרשאות נדרשות: none. האחרים הם L (low) ו-H (high). |
| UI | N | אינטראקציית משתמש: none. האחרים הם P (passive) ו-A (active). |
| VC | H | השפעה על סודיות במערכת הפגיעה: high. האחרים הם L ו-N. |
| VI | H | השפעה על שלמות במערכת הפגיעה: high. |
| VA | H | השפעה על זמינות במערכת הפגיעה: high. |
| SC | N | השפעה על סודיות במערכות עוקבות: none. האחרים הם L ו-H. |
| SI | N | השפעה על שלמות במערכות עוקבות: none. |
| SA | N | השפעה על זמינות במערכות עוקבות: none. |
במילים פשוטות: מישהו ברשת יכול לנצל את זה בלי להתחבר, בלי הכנה מיוחדת ובלי שקורבן יעשה משהו. התקיפה נותנת שליטה מלאה בסודיות, בשלמות ובזמינות של הרכיב הפגיע, ותו לא. המחשבון של FIRST מחזיר לווקטור הזה ציון בסיס של 9.3 (Critical). המעבדה בהמשך מראה איך בודקים את זה.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:Hהשדות של v3.1 דומים, עם שלושה הבדלים. אין שדה AT. שדות ההשפעה הם C, I ו-A, בלי הפרדה בין המערכת הפגיעה למערכות העוקבות. ובמקום זה מופיע S (scope):
| שדה | ערך | משמעות |
|---|---|---|
| AV | N | וקטור תקיפה: network. האחרים הם A, L ו-P. |
| AC | L | מורכבות תקיפה: low. הערך האחר הוא H. |
| PR | N | הרשאות נדרשות: none. האחרים הם L ו-H. |
| UI | N | אינטראקציית משתמש: none. הערך האחר הוא R (required). |
| S | C | Scope changed: האקספלויט יכול להשפיע על רכיב מעבר לזה שמכיל את החולשה. U פירושו unchanged. |
| C | H | סודיות: high. האחרים הם L ו-N. |
| I | H | שלמות: high. |
| A | H | זמינות: high. |
השדה S מסביר את רוב הפער בין 9.8 ל-10.0 בהמשך המאמר.
השינויים מבניים, ולכן קריאה של ציון מגרסה אחת כאילו הגיע מהשנייה מובילה לטעויות.
הודעות אבטחה עדיין מערבבות גרסאות. חלקן מפרסמות גם ציון v3.1 וגם ציון v4.0 לאותה חולשה, ושני המספרים יכולים להיות שונים. לפני שמשווים בין שני מספרים, צריך לבדוק את הקידומת.
זו הנקודה הכי חשובה, וזו שאנשים מדלגים עליה. CVSS מודד כמה חולשה חמורה אם מנצלים אותה. הוא לא אומר אם מישהו ינצל אותה.
חולשה עם ציון בסיס Critical יכולה לשכב שנים בלי ניצול. חולשת Medium יכולה להיות תחת תקיפה פעילה השבוע. CVSS לא רואה את זה. קבוצת ה-Threat יכולה לשאת מידע מסוים על ניצול (למשל E שמוגדר כ-A), אבל מישהו עדיין צריך להגדיר אותו ולעדכן אותו. מקורות אחרים עונים על שאלת הסבירות:
כשצריך להחליט מה לתקן קודם, קוראים יחד חומרה, סבירות וחשיפה. ציון CVSS גבוה על מערכת שאף אחד לא יכול להגיע אליה בדרך כלל פחות דחוף מציון בינוני על דף כניסה ציבורי עם דיווחים על ניצול.
ליסודות של מה זו חולשה ואיך היא מקבלת מזהה, אפשר לקרוא מה זו חולשה ומה זה מזהה CVE.
צריך טרמינל ודפדפן. המעבדה משתמשת רק בנתונים ציבוריים. היא נוגעת ב-API הציבורי של NVD ובאתר של FIRST, ובשום דבר אחר.
ה-API של NVD מחזיר את הציונים ש-NVD מחזיק עבור CVE. עבור CVE-2021-44228, החולשה Log4Shell ב-Apache Log4j, מריצים:
curl -s 'https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2021-44228' | jq -r '.vulnerabilities[0].cve.metrics | .. | .vectorString? // empty'הפילטר עובר על כל האובייקט metrics ומדפיס כל vectorString שהוא מוצא. במחשב שעליו נבדק המאמר, הכלי jq לא היה מותקן, ואותו מעבר רץ עם Node 24. זו החלופה אם הכלי jq לא מותקן:
curl -s 'https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2021-44228' -o nvd_44228.json
node -e "const j=JSON.parse(require('fs').readFileSync('nvd_44228.json','utf8'));const out=[];(function walk(n){if(n&&typeof n==='object'){for(const[k,v]of Object.entries(n)){if(k==='vectorString')out.push(v);else walk(v);}}})(j.vulnerabilities[0].cve.metrics);console.log(out.join('\n'));"הפלט שנצפה ב-8 בנובמבר 2026:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
AV:N/AC:M/Au:N/C:C/I:C/A:Cשתי השורות הראשונות הן הווקטור של v3.1 מהרשומה של NVD עצמה ומרשומה שנייה ש-NVD מציג. השורה השלישית היא וקטור CVSS v2.0, סולם ישן יותר, ואפשר להתעלם ממנה במעבדה הזו. NVD יכול לעדכן רשומה, ולכן הפלט אצלך עשוי להיות שונה.
לוקחים את השורה הראשונה וממלאים טבלה כמו אלה שלמעלה. כותבים כל שדה ואת משמעותו לפני שפותחים מחשבון. שתי שאלות עוזרות:
השדה שראוי למבט שני הוא S:C. פירושו שהאקספלויט מגיע מעבר לרכיב שמכיל את החולשה. בגלל זה הווקטור הזה מקבל ציון גבוה יותר מאותו וקטור עם S:U.
פותחים את המחשבון של הגרסה שמופיעה במחרוזת. עבור v3.1 הכתובת היא https://www.first.org/cvss/calculator/3.1. עבור v4.0 הכתובת היא https://www.first.org/cvss/calculator/4.0. אפשר להדביק את הווקטור אחרי התו # בכתובת כדי למלא את הטופס מראש.
עבור דוגמת v4.0 מקודם, פותחים את הקישור הזה:
https://www.first.org/cvss/calculator/4.0#CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:Nהמחשבון אמור להחזיר לווקטור הזה ציון בסיס של 9.3 (Critical). לא הרצתי אותו בדפדפן בזמן הכתיבה, ולכן 9.3 הוא ערך שצריך לאשר. אם התוצאה שונה, משווים כל אות בטופס לטבלה המפוענחת שלך.
עבור וקטור v3.1 מ-NVD, פותחים את מחשבון v3.1 ומגדירים כל ערך לפי הטבלה שלך. הציון הצפוי הוא 10.0. אם הטופס נשאר ריק אחרי טעינת הדף, בוחרים את הערכים ביד, וזו בדיקה שימושית בפני עצמה.
ב-v3.1 נוסחת הבסיס קצרה מספיק כדי להיכנס בכמה שורות. הסקריפט הזה עוקב אחרי המפרט של v3.1. הוא נועד לבדיקת ההבנה שלך ולא לשימוש בפרודקשן. יש לשמור אותו בשם cvss31.js:
// CVSS v3.1 base score, following the FIRST v3.1 specification.
function roundup(x) {
const i = Math.round(x * 100000);
return i % 10000 === 0 ? i / 100000 : (Math.floor(i / 10000) + 1) / 10;
}
function base(vec) {
const m = Object.fromEntries(vec.split('/').slice(1).map(p => p.split(':')));
const S = m.S === 'C';
const AV = { N: 0.85, A: 0.62, L: 0.55, P: 0.2 }[m.AV];
const AC = { L: 0.77, H: 0.44 }[m.AC];
const PR = { N: 0.85, L: S ? 0.68 : 0.62, H: S ? 0.5 : 0.27 }[m.PR];
const UI = { N: 0.85, R: 0.62 }[m.UI];
const cia = { H: 0.56, L: 0.22, N: 0 };
const iss = 1 - (1 - cia[m.C]) * (1 - cia[m.I]) * (1 - cia[m.A]);
const imp = S ? 7.52 * (iss - 0.029) - 3.25 * Math.pow(iss - 0.02, 15) : 6.42 * iss;
const expl = 8.22 * AV * AC * PR * UI;
if (imp <= 0) return 0;
return S ? roundup(Math.min(1.08 * (imp + expl), 10)) : roundup(Math.min(imp + expl, 10));
}
for (const v of process.argv.slice(2)) console.log(v, '->', base(v).toFixed(1));מריצים אותו על הווקטור של NVD, ועל אותו וקטור עם scope שמוגדר כ-unchanged:
node cvss31.js "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H" "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"הפלט שנצפה ב-8 בנובמבר 2026:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H -> 10.0
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H -> 9.8השורה הראשונה תואמת את ציון ה-NVD של 10.0. השורה השנייה נותנת את ה-9.8 שאנשים רבים זוכרים עבור החולשה הזו. השינוי היחיד הוא S:U. כשרואים ציון, צריך לקרוא את הווקטור שלו לפני שסומכים על המספר.
אם הטבלה המפוענחת, המחשבון והסקריפט מסכימים ביניהם, מחרוזת CVSS כבר קריאה לך. אם הם לא מסכימים, צריך למצוא את השדה ששונה. הסיבות הרגילות הן אות שגויה (AV:L פירושו local, ולא low), בלבול בין C, I ו-A, או השוואה של ציון v3.1 לציון v4.0 כאילו שניהם מאותו סולם.
כדאי להתחיל מההגדרות של מדדי הבסיס במפרט. הן קצרות, והתשובות נמצאות בניסוח המדויק של כל ערך. אחר כך מפענחים על דף חמישה או שישה וקטורים שפורסמו, לפני שבודקים כל אחד במחשבון. כדאי לבחור כמה עם S:C או AT:P ולראות איך הציון זז.
אחרי זה אפשר לקרוא על צד הניצול: מה EPSS מעריך ומה קטלוג ה-KEV מתעד. שני אלה עונים על השאלה ש-CVSS משאיר פתוחה, כלומר אם מישהו תוקף את החולשה הזו עכשיו.
מודיעין חולשות
רשומת CVE נותנת שם לפגם ומפנה לספק, וההודעה של הספק היא שקובעת את הגרסה המתוקנת.
מודיעין חולשות
דירוג CVEs עם קטלוג KEV של CISA וציוני EPSS של FIRST לצד CVSS, ובניית טבלת עדיפויות משני הפידים החינמיים.