Skip to content

Commit 8e2efc4

Browse files
committed
fix: Severity misinterpretation
1 parent 70d24c8 commit 8e2efc4

8 files changed

Lines changed: 34 additions & 29 deletions

File tree

CLAUDE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ These rules are easy to break and cause silent data errors.
9797
- Do not use `image_components` — its IDs are incompatible with `image_cves_v2.componentid` and joins silently return 0 rows.
9898
- Join `image_component_v2.id` to `image_cves_v2.componentid`.
9999
- Group CVE list and detail aggregations by `ic.cvebaseinfo_cve`, not by `ic.id`.
100+
- `ic.severity` and `ic.cvss` are vendor/scanner values (Red Hat classification and Red Hat CVSS for Red Hat content), not NVD data. NVD's score lives in `ic.nvdcvss` and is not used by the app. Never describe severity or the displayed CVSS as NVD-based.
100101

101102
Correct pattern:
102103

docs/development.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,8 @@ LEFT JOIN image_component_v2 comp ON comp.id = ic.componentid
209209
Key fields on `image_cves_v2`:
210210

211211
- `ic.cvebaseinfo_cve` -- CVE ID
212-
- `ic.severity` -- severity level (1-4)
213-
- `ic.cvss` -- CVSS score
212+
- `ic.severity` -- scanner-assigned severity (1-4, Red Hat classification for Red Hat content; independent of CVSS)
213+
- `ic.cvss` -- CVSS score from the primary data source (Red Hat for Red Hat content); NVD's score is in `ic.nvdcvss` and often differs
214214
- `ic.cvebaseinfo_epss_epssprobability` -- EPSS probability
215215
- `ic.impactscore` -- impact score
216216
- `ic.firstimageoccurrence` -- first seen date

docs/user-guide.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ The **Escalations** page shows both active escalations and upcoming ones.
154154

155155
- Escalation rules are configured in **Settings**.
156156
- Each rule combines a minimum severity threshold with an EPSS threshold and three deadlines.
157-
- A CVE is eligible for a rule when either the severity threshold or the EPSS threshold matches that rule.
157+
- A CVE is eligible for a rule when both the severity threshold and the EPSS threshold are met. A threshold of `0` imposes no constraint.
158158
- Levels are:
159159
- Level 1: user notification
160160
- Level 2: user and security notification

frontend/src/components/charts/EpssRiskMatrix.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export function EpssRiskMatrix({ data, onDotClick }: Props) {
6464
const zones = [
6565
{ x1: 0, x2: 0.1, y1: 0, y2: 7, fill: '#1e8f19', label: t('epssMatrix.lowRisk'), labelFill: '#1e8f19' },
6666
{ x1: 0, x2: 0.1, y1: 7, y2: 10, fill: '#ec7a08', label: t('epssMatrix.severe'), labelFill: '#ec7a08' },
67-
{ x1: 0.1, x2: 1, y1: 0, y2: 7, fill: '#0066cc', label: t('epssMatrix.activelyExploited'), labelFill: '#0066cc' },
67+
{ x1: 0.1, x2: 1, y1: 0, y2: 7, fill: '#0066cc', label: t('epssMatrix.highLikelihood'), labelFill: '#0066cc' },
6868
{ x1: 0.1, x2: 1, y1: 7, y2: 10, fill: '#c9190b', label: t('epssMatrix.criticalRisk'), labelFill: '#c9190b' },
6969
]
7070

frontend/src/i18n/de.json

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393
"MODERATE": "Mittel",
9494
"IMPORTANT": "Hoch",
9595
"CRITICAL": "Kritisch",
96-
"tooltip": "CVSS-basierte Schweregradeinstufung vom NVD."
96+
"tooltip": "Schweregradeinstufung der Scanner-Datenquelle (bei Red-Hat-Inhalten die Red Hat Security-Klassifizierung). Unabhängig vom NVD-CVSS-Score."
9797
},
9898
"status": {
9999
"requested": "Beantragt",
@@ -184,13 +184,13 @@
184184
"180+": ">180 Tage"
185185
},
186186
"help": {
187-
"epssMatrix": "Die EPSS-Risikomatrix zeigt jede CVE als Punkt, positioniert nach CVSS-Schweregrad (Y-Achse) und EPSS-Ausnutzungswahrscheinlichkeit (X-Achse). CVEs oben rechts haben sowohl hohen Schweregrad als auch hohe Ausnutzungswahrscheinlichkeit und sollten zuerst bearbeitet werden.",
187+
"epssMatrix": "Die EPSS-Risikomatrix zeigt jede CVE als Punkt, positioniert nach CVSS-Score (Y-Achse) und EPSS-Ausnutzungswahrscheinlichkeit (X-Achse). CVEs oben rechts haben sowohl hohen Schweregrad als auch hohe Ausnutzungswahrscheinlichkeit und sollten zuerst bearbeitet werden.",
188188
"pipeline": "Zeigt die aktuelle Verteilung aller Risikoakzeptanzen nach Status. So erkennen Sie auf einen Blick, wie viele Anträge offen, genehmigt, abgelehnt oder abgelaufen sind.",
189189
"severityDistribution": "Zeigt die Verteilung Ihrer sichtbaren CVEs nach Schweregrad. Klicken Sie auf ein Segment, um die entsprechenden CVEs gefiltert anzuzeigen.",
190190
"fixabilityBreakdown": "Zeigt, wie viele Ihrer CVEs durch ein Update behoben werden können und wie viele derzeit keinen Fix haben. Hilft bei der Priorisierung von Update-Maßnahmen.",
191191
"clusterHeatmap": "Zeigt die Verteilung von CVEs nach Cluster und Schweregrad. Cluster mit vielen kritischen CVEs sollten zuerst überprüft werden.",
192192
"mttr": "Audit-Kennzahl des Sicherheitsteams: die durchschnittliche Zeit in Tagen vom ersten Auftreten eines CVE bis zur Behebung, gruppiert nach Schweregrad. Erfasst das gesamte Expositionsfenster. Nur abgeschlossene, manuell erfasste Remediations werden berücksichtigt.",
193-
"aging": "Zeigt, wie lange CVEs bereits bekannt sind. Alte, unbehandelte CVEs stellen ein erhöhtes Risiko dar und sollten priorisiert werden.",
193+
"aging": "Zeigt, wie lange CVEs bereits in Ihrer Umgebung erkannt sind (seit dem ersten Auftreten in Ihren Images). Alte, unbehandelte CVEs stellen ein erhöhtes Risiko dar und sollten priorisiert werden.",
194194
"trend": "Zeigt die Anzahl neu entdeckter CVEs pro Tag in den letzten 90 Tagen, aufgeschlüsselt nach Schweregrad. Es werden nur CVEs berücksichtigt, die erstmals innerhalb dieses Zeitraums aufgetreten sind. Bereits länger bekannte CVEs erscheinen hier nicht, sind aber in der CVE-Liste weiterhin sichtbar.",
195195
"cveHistory": "Zeigt die tatsächliche Anzahl sichtbarer CVEs pro Tag, aufgeschlüsselt nach Schweregrad. Sinkende Linien bedeuten echten Fortschritt. Hinweis: Bei Teams mit mehreren Namespaces kann dieselbe CVE mehrfach gezählt werden (einmal pro Namespace).",
196196
"fixFirst": "Die wichtigsten CVEs für Ihr Team, sortiert nach Priorität des Sicherheitsteams, Ausnutzungswahrscheinlichkeit (EPSS) und Schweregrad. CVEs mit verfügbarem Fix stehen weiter oben - ein Image-Update behebt sie direkt.",
@@ -214,6 +214,7 @@
214214
"cveId": "CVE-ID",
215215
"severity": "Schweregrad",
216216
"cvss": "CVSS",
217+
"cvssTooltip": "CVSS-Score der primären Datenquelle (bei Red-Hat-Inhalten der Red-Hat-Score). Kann vom NVD-Score abweichen.",
217218
"epss": "EPSS",
218219
"epssTooltip": "Wahrscheinlichkeit der Ausnutzung in den nächsten 30 Tagen (EPSS-Score von FIRST.org)",
219220
"affectedImages": "Betr. Images",
@@ -558,17 +559,17 @@
558559
},
559560
"remediations": {
560561
"title": "Behebungen",
561-
"description": "CVE-Behebungsfortschritt pro Namespace von der Erstellung bis zur Verifizierung verfolgen.",
562+
"description": "CVE-Behebungsfortschritt pro Namespace von der Erstellung bis zur Behebung verfolgen.",
562563
"whatAre": "Was sind Behebungen?",
563-
"helpBody1": "Behebungen verfolgen die aktive Beseitigung von CVEs. Ein Team-Mitglied erstellt eine Behebung für eine CVE in seinem Namespace und verfolgt den Fortschritt bis zur Verifizierung durch das Security-Team.",
564+
"helpBody1": "Behebungen verfolgen die aktive Beseitigung von CVEs. Ein Team-Mitglied erstellt eine Behebung für eine CVE in seinem Namespace und verfolgt den Fortschritt bis zur Behebung. Das Security-Team auditiert über das Audit-Log und den Wochenbericht.",
564565
"helpBody2Open": "Offen",
565566
"helpBody2OpenDesc": " - Behebung angelegt",
566567
"helpBody2InProgress": "In Bearbeitung",
567568
"helpBody2InProgressDesc": " - Aktiv daran gearbeitet",
568569
"helpBody2Resolved": "Behoben",
569-
"helpBody2ResolvedDesc": " - CVE wurde beseitigt, wartet auf Verifizierung",
570+
"helpBody2ResolvedDesc": " - CVE wurde beseitigt (Endstatus)",
570571
"helpBody2Verified": "Verifiziert",
571-
"helpBody2VerifiedDesc": " - Vom Security-Team bestätigt",
572+
"helpBody2VerifiedDesc": " - Veralteter Status aus früheren Versionen",
572573
"helpBody3": "Behebungen können automatisch als behoben markiert werden, wenn die CVE nicht mehr in den Deployments des Namespaces gefunden wird.",
573574
"helpLabel": "Hilfe zu Behebungen",
574575
"statusOpen": "Offen",
@@ -802,7 +803,7 @@
802803
"epssMatrix": {
803804
"lowRisk": "Niedriges Risiko",
804805
"severe": "Schwerwiegend",
805-
"activelyExploited": "Aktiv ausgenutzt",
806+
"highLikelihood": "Hohe Ausnutzungswahrscheinlichkeit",
806807
"criticalRisk": "Kritisches Risiko"
807808
},
808809
"suppressionRules": {

frontend/src/i18n/en.json

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393
"MODERATE": "Medium",
9494
"IMPORTANT": "High",
9595
"CRITICAL": "Critical",
96-
"tooltip": "CVSS-based severity classification from NVD."
96+
"tooltip": "Severity rating assigned by the scanner data source (the Red Hat security classification for Red Hat content). Independent of the NVD CVSS score."
9797
},
9898
"status": {
9999
"requested": "Requested",
@@ -184,13 +184,13 @@
184184
"180+": ">180 days"
185185
},
186186
"help": {
187-
"epssMatrix": "The EPSS Risk Matrix plots each CVE by CVSS severity (Y-axis) and EPSS exploitation probability (X-axis). CVEs in the top-right have both high severity and high exploitation likelihood and should be addressed first.",
187+
"epssMatrix": "The EPSS Risk Matrix plots each CVE by CVSS score (Y-axis) and EPSS exploitation probability (X-axis). CVEs in the top-right have both high severity and high exploitation likelihood and should be addressed first.",
188188
"pipeline": "Shows the current distribution of all risk acceptances by status. Quickly see how many requests are pending, approved, rejected, or expired.",
189189
"severityDistribution": "Shows the distribution of your visible CVEs by severity level. Click a segment to filter the vulnerability list accordingly.",
190190
"fixabilityBreakdown": "Shows how many of your CVEs can be fixed by an update vs. those with no fix available yet. Helps prioritize update efforts.",
191191
"clusterHeatmap": "Shows CVE distribution across clusters by severity. Clusters with many critical CVEs should be reviewed first.",
192192
"mttr": "Security-team audit metric: the average time in days from when a CVE was first seen to resolution, grouped by severity. Captures the full exposure window. Only completed, manually tracked remediations are included.",
193-
"aging": "Shows how long CVEs have been known. Old, unaddressed CVEs represent increased risk and should be prioritized.",
193+
"aging": "Shows how long CVEs have been present in your environment (since first seen in your images). Old, unaddressed CVEs represent increased risk and should be prioritized.",
194194
"trend": "Shows the number of newly discovered CVEs per day over the last 90 days, broken down by severity. Only CVEs first seen within this period are included. CVEs known for longer still appear in the CVE list but not in this chart.",
195195
"cveHistory": "Shows the actual number of visible CVEs per day, broken down by severity. Falling lines mean real progress. Note: for teams with multiple namespaces the same CVE may be counted once per namespace.",
196196
"fixFirst": "The most important CVEs for your team, ordered by security-team priority, exploitation probability (EPSS), and severity. CVEs with an available fix rank higher - an image update resolves them directly.",
@@ -214,6 +214,7 @@
214214
"cveId": "CVE ID",
215215
"severity": "Severity",
216216
"cvss": "CVSS",
217+
"cvssTooltip": "CVSS score from the primary data source (the Red Hat score for Red Hat content). May differ from the NVD score.",
217218
"epss": "EPSS",
218219
"epssTooltip": "Probability of exploitation in the next 30 days (EPSS score from FIRST.org)",
219220
"affectedImages": "Affected Images",
@@ -558,17 +559,17 @@
558559
},
559560
"remediations": {
560561
"title": "Remediations",
561-
"description": "Track CVE fix progress per namespace from creation to verification.",
562+
"description": "Track CVE fix progress per namespace from creation to resolution.",
562563
"whatAre": "What are remediations?",
563-
"helpBody1": "Remediations track active CVE resolution. A team member creates a remediation for a CVE in their namespace and tracks progress until verification by the security team.",
564+
"helpBody1": "Remediations track active CVE resolution. A team member creates a remediation for a CVE in their namespace and tracks progress until resolution. The security team audits via the audit log and the weekly digest.",
564565
"helpBody2Open": "Open",
565566
"helpBody2OpenDesc": " - Remediation created",
566567
"helpBody2InProgress": "In Progress",
567568
"helpBody2InProgressDesc": " - Actively being worked on",
568569
"helpBody2Resolved": "Resolved",
569-
"helpBody2ResolvedDesc": " - CVE has been fixed, awaiting verification",
570+
"helpBody2ResolvedDesc": " - CVE has been fixed (terminal state)",
570571
"helpBody2Verified": "Verified",
571-
"helpBody2VerifiedDesc": " - Confirmed by the security team",
572+
"helpBody2VerifiedDesc": " - Legacy status from earlier versions",
572573
"helpBody3": "Remediations can be automatically marked as resolved when the CVE is no longer found in the namespace's deployments.",
573574
"helpLabel": "Help for remediations",
574575
"statusOpen": "Open",
@@ -802,7 +803,7 @@
802803
"epssMatrix": {
803804
"lowRisk": "Low risk",
804805
"severe": "Severe",
805-
"activelyExploited": "Actively exploited",
806+
"highLikelihood": "Likely to be exploited",
806807
"criticalRisk": "Critical risk"
807808
},
808809
"suppressionRules": {

frontend/src/pages/CveDetail.tsx

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -547,14 +547,16 @@ export function CveDetail() {
547547
<DetailRow
548548
label="CVSS"
549549
value={
550-
<span
551-
style={{
552-
fontWeight: cve.cvss >= 9 ? 700 : 400,
553-
color: cve.cvss >= 9 ? "#c9190b" : "inherit",
554-
}}
555-
>
556-
{formatCvss(cve.cvss)}
557-
</span>
550+
<Tooltip content={t('cves.cvssTooltip')}>
551+
<span
552+
style={{
553+
fontWeight: cve.cvss >= 9 ? 700 : 400,
554+
color: cve.cvss >= 9 ? "#c9190b" : "inherit",
555+
}}
556+
>
557+
{formatCvss(cve.cvss)}
558+
</span>
559+
</Tooltip>
558560
}
559561
/>
560562
<DetailRow

frontend/src/pages/CveList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -752,7 +752,7 @@ export function CveList() {
752752
<Tr>
753753
<Th sort={makeCveSort('cve_id')}>{t('cves.cveId')}</Th>
754754
<Th sort={makeCveSort('severity')}>{t('cves.severity')}</Th>
755-
<Th sort={makeCveSort('cvss')}>{t('cves.cvss')}</Th>
755+
<Th sort={makeCveSort('cvss')} info={{ tooltip: t('cves.cvssTooltip') }}>{t('cves.cvss')}</Th>
756756
<Th sort={makeCveSort('epss_probability')}>{t('cves.epss')}</Th>
757757
<Th sort={makeCveSort('affected_images')}>{t('cves.affectedImages')}</Th>
758758
<Th sort={makeCveSort('affected_deployments')}>{t('cves.affectedDeployments')}</Th>

0 commit comments

Comments
 (0)