דילוג לתוכן
New

DeepSeek V4.1 Flash free for 7 days: 10M tokens a day after a top-up of $10 or more. Until Nov 30.

How it works

הסבר על CVSS: קריאה וחישוב של מחרוזת וקטור

מה המשמעות של ציון CVSS כמו 9.8, איך בנויות מחרוזות וקטור של v4.0 ו-v3.1, ואיך מפענחים ומחשבים אחת מחדש ביד.

מתחילים10 דקות קריאהמאת NotHoly

CVSS היא מערכת הניקוד שעומדת מאחורי רוב ציוני החולשות שמתפרסמים. בדרך כלל מופיעים מספר בין 0.0 ל-10.0, מילת חומרה כמו "Critical" ומחרוזת ארוכה שנראית כמו מספר סידורי. המאמר מסביר מה המשמעות של כל חלק, איך קוראים את המחרוזת שדה אחר שדה, ואיך בודקים ציון שפורסם בלי להסתמך על אחרים.

מה זה CVSS

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

מדדי Base מתארים את החולשה כפי שהיא קיימת בתוכנה הפגיעה, בלי ידע על הרשת שלך. הודעות אבטחה מפרסמות אותם כמעט תמיד. ב-v4.0 הם כוללים:

  • Exploitability: וקטור תקיפה (AV), מורכבות תקיפה (AC), דרישות תקיפה (AT), הרשאות נדרשות (PR) ואינטראקציית משתמש (UI).
  • השפעה על המערכת הפגיעה: סודיות (VC), שלמות (VI) וזמינות (VA).
  • השפעה על מערכות עוקבות: סודיות (SC), שלמות (SI) וזמינות (SA). המדדים האלה מתארים נזק למערכות אחרות שהתוקף יכול להגיע אליהן אחרי שהראשונה נפלה.

Threat

מדדי Threat משתנים עם הזמן. מדד ה-Threat ב-v4.0 הוא E, בשלות האקספלויט. הערכים האפשריים הם A (attacked, יש ראיות לניצול), P (קיים proof of concept), U (unreported) או X (not defined, ברירת המחדל). ציון שבו E מוגדר יכול להיות שונה מציון הבסיס, והוא זז כשתמונת האיום משתנה.

Environmental

מדדי Environmental מתארים את הפריסה שלך. מדדי הדרישות (CR, IR ו-AR עבור סודיות, שלמות וזמינות) אומרים כמה כל תכונה חשובה לך. מדדי הבסיס המותאמים מאפשרים לדרוס ערך בסיס כשהתצורה שלך משנה אותו. חולשה בדף כניסה שפתוח לאינטרנט ואותה חולשה ב-VM של מעבדה בלי נתיב רשת יכולות לקבל אותו ציון בסיס, ועדיין לדרוש עדיפויות שונות בסביבה שלך.

Supplemental

מדדי Supplemental מוסיפים הקשר, כמו השפעה על בטיחות, יכולת אוטומציה, מאמץ התאוששות או דחיפות. הם לא משנים את הציון, ועוזרים לצוות למיין עבודה.

גרסה 3.1 משתמשת בקבוצות Base, Temporal ו-Environmental. אין בה קבוצת Supplemental, והמדדים הזמניים שלה (בשלות קוד האקספלויט, רמת התיקון ורמת הביטחון בדיווח) שונים ממדד ה-E היחיד של v4.0.

איך קוראים מחרוזת וקטור

מחרוזת הווקטור היא הצורה המכווצת של המדדים. היא מתחילה בגרסה, ואחריה כל מדד בתבנית Name:Value, עם קווים נטויים ביניהם. כל ערך הוא אות אחת. כשמכירים את האותיות, אפשר לקרוא כל מחרוזת בלי טבלה.

דוגמה של v4.0

text
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). המעבדה בהמשך מראה איך בודקים את זה.

דוגמה של v3.1

text
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 בהמשך המאמר.

במה v4.0 שונה מ-v3.1

השינויים מבניים, ולכן קריאה של ציון מגרסה אחת כאילו הגיע מהשנייה מובילה לטעויות.

  • Scope נעלם. ב-v3.1 נשאלה השאלה אם ההשפעה חצתה גבול אבטחה. ב-v4.0 ההשפעה מפוצלת בין המערכת הפגיעה למערכות העוקבות, ולכן על אותה שאלה עונים שדות ישירים.
  • נוספו דרישות תקיפה. AT מתעד תנאים שהתוקף חייב לעמוד בהם ואינם הרשאות, כמו תצורה מסוימת או חלון race.
  • לאינטראקציית משתמש יש יותר ערכים. v4.0 מפריד בין אינטראקציה פסיבית (הקורבן רק צופה במשהו או מרנדר אותו) לאינטראקציה אקטיבית (הקורבן חייב ללחוץ או לפעול).
  • קבוצת ה-Threat פשוטה יותר. מדד אחד, E, מחליף את שלושת המדדים הזמניים של v3.1.
  • מדדי Supplemental הם חדשים. הם נושאים הקשר בלי לשנות את הציון.
  • הציון נשלף מטבלה ולא רק מחושב. ב-v3.1 יש נוסחה אריתמטית קצרה שאפשר לעקוב אחריה על דף. ב-v4.0 מדדי הבסיס ממופים לטבלת חיפוש ומתבצעת אינטרפולציה בתוכה, כמו שהמפרט מתאר. עבור v4.0 צריך להשתמש במחשבון הרשמי או בספרייה בדוקה, ולא בגיליון שכתבת בעצמך.

הודעות אבטחה עדיין מערבבות גרסאות. חלקן מפרסמות גם ציון v3.1 וגם ציון v4.0 לאותה חולשה, ושני המספרים יכולים להיות שונים. לפני שמשווים בין שני מספרים, צריך לבדוק את הקידומת.

חומרה אינה סבירות

זו הנקודה הכי חשובה, וזו שאנשים מדלגים עליה. CVSS מודד כמה חולשה חמורה אם מנצלים אותה. הוא לא אומר אם מישהו ינצל אותה.

חולשה עם ציון בסיס Critical יכולה לשכב שנים בלי ניצול. חולשת Medium יכולה להיות תחת תקיפה פעילה השבוע. CVSS לא רואה את זה. קבוצת ה-Threat יכולה לשאת מידע מסוים על ניצול (למשל E שמוגדר כ-A), אבל מישהו עדיין צריך להגדיר אותו ולעדכן אותו. מקורות אחרים עונים על שאלת הסבירות:

  • EPSS מעריך את ההסתברות שחולשה תנוצל ב-30 הימים הקרובים, על סמך נתונים שנצפו.
  • הקטלוג CISA Known Exploited Vulnerabilities מפרט חולשות שיש ראיות לניצולן בשטח.

כשצריך להחליט מה לתקן קודם, קוראים יחד חומרה, סבירות וחשיפה. ציון CVSS גבוה על מערכת שאף אחד לא יכול להגיע אליה בדרך כלל פחות דחוף מציון בינוני על דף כניסה ציבורי עם דיווחים על ניצול.

ליסודות של מה זו חולשה ואיך היא מקבלת מזהה, אפשר לקרוא מה זו חולשה ומה זה מזהה CVE.

תרגול: פענוח וקטור שפורסם וחישוב מחדש

צריך טרמינל ודפדפן. המעבדה משתמשת רק בנתונים ציבוריים. היא נוגעת ב-API הציבורי של NVD ובאתר של FIRST, ובשום דבר אחר.

שלב 1: שליפת הווקטור מ-NVD

ה-API של NVD מחזיר את הציונים ש-NVD מחזיק עבור CVE. עבור CVE-2021-44228, החולשה Log4Shell ב-Apache Log4j, מריצים:

bash
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 לא מותקן:

bash
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:

text
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 יכול לעדכן רשומה, ולכן הפלט אצלך עשוי להיות שונה.

שלב 2: פענוח על דף

לוקחים את השורה הראשונה וממלאים טבלה כמו אלה שלמעלה. כותבים כל שדה ואת משמעותו לפני שפותחים מחשבון. שתי שאלות עוזרות:

  1. מה התוקף חייב שיהיה לו מראש? PR:N ו-UI:N אומרים ששום דבר לא נדרש.
  2. איזו תכונה אובדת? C, I ו-A כולם H, כלומר אובדן מלא של כל אחת מהן.

השדה שראוי למבט שני הוא S:C. פירושו שהאקספלויט מגיע מעבר לרכיב שמכיל את החולשה. בגלל זה הווקטור הזה מקבל ציון גבוה יותר מאותו וקטור עם S:U.

שלב 3: הזנה במחשבון

פותחים את המחשבון של הגרסה שמופיעה במחרוזת. עבור v3.1 הכתובת היא https://www.first.org/cvss/calculator/3.1. עבור v4.0 הכתובת היא https://www.first.org/cvss/calculator/4.0. אפשר להדביק את הווקטור אחרי התו # בכתובת כדי למלא את הטופס מראש.

עבור דוגמת v4.0 מקודם, פותחים את הקישור הזה:

text
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. אם הטופס נשאר ריק אחרי טעינת הדף, בוחרים את הערכים ביד, וזו בדיקה שימושית בפני עצמה.

שלב 4: חישוב מחדש של v3.1 עם סקריפט

ב-v3.1 נוסחת הבסיס קצרה מספיק כדי להיכנס בכמה שורות. הסקריפט הזה עוקב אחרי המפרט של v3.1. הוא נועד לבדיקת ההבנה שלך ולא לשימוש בפרודקשן. יש לשמור אותו בשם cvss31.js:

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:

bash
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:

text
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 כאילו שניהם מאותו סולם.

טעויות נפוצות

  • התייחסות לציון כאל סיכון. 10.0 שאף אחד לא יכול להגיע אליו היא בעיה אחרת מ-10.0 על שרת שפתוח לאינטרנט. צריך להוסיף נתוני חשיפה וניצול.
  • השוואת ציונים בין גרסאות. המספרים של v3.1 ו-v4.0 מגיעים ממתמטיקה שונה. משווים רק דומה לדומה.
  • עצירה במספר הראשי. הווקטור אומר למה הציון הוא מה שהוא. צריך לקרוא אותו.
  • אמון בציון בלי הווקטור שלו. מספר לבדו אי אפשר לבדוק. צריך למשוך את הווקטור מ-NVD או מהספק.
  • עריכה ידנית של ציון. כשמשנים אות אחת, מחשבים מחדש. מספר מוקלד שלא תואם את הווקטור שלו הוא שגיאה שצריך לדווח עליה.
  • הנחה שברירת המחדל מתארת את הסביבה שלך. ציון הבסיס לא מניח כלום על ההתקנה שלך. מדדי Environmental קיימים בדיוק בשביל זה.

איך ממשיכים מכאן

כדאי להתחיל מההגדרות של מדדי הבסיס במפרט. הן קצרות, והתשובות נמצאות בניסוח המדויק של כל ערך. אחר כך מפענחים על דף חמישה או שישה וקטורים שפורסמו, לפני שבודקים כל אחד במחשבון. כדאי לבחור כמה עם S:C או AT:P ולראות איך הציון זז.

אחרי זה אפשר לקרוא על צד הניצול: מה EPSS מעריך ומה קטלוג ה-KEV מתעד. שני אלה עונים על השאלה ש-CVSS משאיר פתוחה, כלומר אם מישהו תוקף את החולשה הזו עכשיו.

מקורות

מקורות

  1. FIRST, CVSS v4.0 Specification Document
  2. FIRST, CVSS v3.1 Specification Document
  3. FIRST, CVSS v4.0 Calculator
  4. NIST, NVD CVSS information
  5. NIST, NVD CVE API 2.0

עוד בנושא מודיעין חולשות

מודיעין חולשות

CISA KEV ו-EPSS: תעדוף לפי ראיות לניצול

דירוג CVEs עם קטלוג KEV של CISA וציוני EPSS של FIRST לצד CVSS, ובניית טבלת עדיפויות משני הפידים החינמיים.

מתחילים10 דקות קריאה