diff --git a/package-lock.json b/package-lock.json index 4b43c90fe2..4ec9d38079 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,6 +52,7 @@ }, "devDependencies": { "@babel/cli": "^7.24.6", + "@pandatix/js-cvss": "^0.4.4", "@testing-library/jest-dom": "^6.4.5", "@testing-library/react": "^15.0.6", "@testing-library/user-event": "^13.5.0", @@ -3380,6 +3381,12 @@ "node": ">= 8" } }, + "node_modules/@pandatix/js-cvss": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@pandatix/js-cvss/-/js-cvss-0.4.4.tgz", + "integrity": "sha512-hhBbQ7IKfoRoV3QKTP9hLKJT166/e0FkeiVSLZZIEVsO7DjxVmIWhJlPvbp+RXaM4w215xghtnXQv13Ebdlj/w==", + "dev": true + }, "node_modules/@polka/url": { "version": "1.0.0-next.25", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", diff --git a/package.json b/package.json index 3fd89621a7..979dc3414e 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,7 @@ }, "devDependencies": { "@babel/cli": "^7.24.6", + "@pandatix/js-cvss": "^0.4.4", "@testing-library/jest-dom": "^6.4.5", "@testing-library/react": "^15.0.6", "@testing-library/user-event": "^13.5.0", diff --git a/public/locales/gsa-de.json b/public/locales/gsa-de.json index 63e98a4f62..4f17839c13 100644 --- a/public/locales/gsa-de.json +++ b/public/locales/gsa-de.json @@ -108,6 +108,7 @@ "Alterable Audit": "Änderbares Audit", "Alterable Task": "Änderbare Aufgabe", "Always": "Immer", + "Amber": "Gelb", "An error occurred during Testing the alert {{name}}": "Es ist ein Fehler während des Tests der Benachrichtigung {{name}} aufgetreten", "An error occurred during making the request. Most likely the web server does not respond.": "Es ist ein Fehler während der Anfrage aufgetreten. Höchstwahrscheinlich antwortet der Webserver nicht.", "An error occurred in this chart.": "Es ist ein Fehler in diesem Diagramm aufgetreten.", @@ -148,6 +149,8 @@ "Attach report": "Bericht anhängen", "Attack Complexity": "Angriffskomplexität", "Attack Vector": "Angriffsvektor", + "Attack Requirements": "Angriffsvoraussetzungen", + "Attacked": "Angegriffen", "Audit": "Audit", "Audit List": "Auditliste", "Audit is alterable": "Audit ist änderbar", @@ -165,10 +168,13 @@ "Auto Delete Reports": "Berichte automatisch löschen", "Auto delete Reports": "Berichte automatisch löschen", "Auto-generate": "Auto-Generieren", + "Automatable": "Automatisierbar", + "Automatic": "Automatisch", "Automatically delete oldest reports but always keep newest": "Älteste Berichte automatisch löschen, aber neuesten Bericht behalten", "Automatically delete oldest reports but always keep newest {{nr}} reports": "Älteste Berichte automatisch löschen, aber neueste {{nr}} Berichte behalten", "Availability": "Verfügbarkeit", "Availability Impact": "Verfügbarkeitsauswirkungen", + "Availability Requirements": "Verfügbarkeitsanforderungen", "Average": "Durchschnitt", "Average Scan duration": "Durchschnittliche Scandauer", "Average Severity": "Durchschnittlicher Schweregrad", @@ -177,6 +183,7 @@ "Base Score": "Basisscore", "Base URL": "Basis-URL", "Base Vector": "Basisvektor", + "Base Metrics": "Basismetriken", "Base with a minimum set of NVTs": "Basis Konfiguration mit einer minimalen Anzahl an NVTs", "Best OS": "Bestes OS", "Browser Language": "Browser-Sprache", @@ -221,6 +228,7 @@ "CVSS v3.1 Vector": "CVSS v3.1 Basisvektor", "CVSSv2 Base Score Calculator": "CVSSv2 Basis-Score-Rechner", "CVSSv3 Base Score Calculator": "CVSSv3 Basis-Score-Rechner", + "CVSSv4 Score Calculator": "CVSSv4 Score-Rechner", "Call Description": "Beschreibung (Call Description)", "Call Template": "Vorlage (Call Template)", "Call Type": "Typ (Call Type)", @@ -291,6 +299,7 @@ "Chart: Vulnerabilities by Severity Class": "Diagramm: Schwachstellen nach Schweregradklasse", "Choose Display": "Anzeige auswählen", "Choose Tag": "Tag auswählen", + "Clear": "Klar", "Client Certificate": "Benutzerzertifikat", "Client Certificate (from Credential)": "Benutzerzertifikat (aus Anmeldedaten)", "Clone Alert": "Benachrichtigung klonen", @@ -319,9 +328,11 @@ "Compose": "Zusammenstellen", "Compose Content for Scan Report": "Inhalt für Scan-Bericht zusammenstellen", "Compose Report Content": "Berichtinhalt zusammenstellen", + "Concentrated": "Konzentriert", "Condition": "Bedingung", "Confidentiality": "Vertraulichkeit", "Confidentiality Impact": "Vertraulichkeitsauswirkungen", + "Confidentiality Requirements": "Vertraulichkeitsanforderungen", "Config": "Konfiguration", "Configs Filter": "Konfigurationen-Filter", "Configuration": "Konfiguration", @@ -464,6 +475,7 @@ "Detection Result": "Erkennungsergebnis", "Detection Results": "Erkennungsergebnisse", "Different Lines": "Zeilenunterschiede", + "Diffuse": "Diffus", "Disable Tag": "Tag deaktivieren", "Distance": "Entfernung", "Do not automatically delete reports": "Berichte nicht automatisch löschen", @@ -547,6 +559,7 @@ "Edit {{entity}}": "{{entity}} bearbeiten", "Effect": "Auswirkung", "Elevate privileges": "Berechtigungen erweitern", + "Environmental (Modified Base Metrics)": "Umgebung (Modifizierte Basismetriken)", "Email": "E-Mail", "Email Encryption": "E-Mail-Verschlüsselung", "Email report to": "E-Mail-Bericht an", @@ -595,6 +608,8 @@ "Expired": "Abgelaufen", "Expires": "Läuft ab", "Exploit": "Exploit", + "Exploit Maturity": "Ausnutzungsreife", + "Exploitability Metrics": "Ausnutzbarkeitsmetriken", "Export Alert": "Benachrichtigung exportieren", "Export Alert as XML": "Benachrichtigung als XML exportieren", "Export Audit": "Audit exportieren", @@ -700,6 +715,7 @@ "Global {{type}}": "Globale(r) {{type}}", "Gone": "Entfallen", "Grant": "Gewähre", + "Green": "Grün", "Greenbone": "Greenbone", "Greenbone AG": "Greenbone AG", "Greenbone Security Assistant": "Greenbone Security Assistant", @@ -831,6 +847,7 @@ "Insight": "Einblick", "Integrity": "Integrität", "Integrity Impact": "Integritätsauswirkungen", + "Integrity Requirements": "Integritätsanforderungen", "Interrupted": "Unterbrochen", "Issued By": "Ausgestellt von", "Issued by": "Ausgestellt von", @@ -919,6 +936,7 @@ "Min QoD": "Min. QdE", "Mitigation": "Schadensminderung", "Mo.": "Mo.", + "Moderate": "Mäßig", "Modification Time": "Änderungszeit", "Modified": "Geändert", "Modified Hosts": "Geänderte Hosts", @@ -966,6 +984,7 @@ "NVTs: Total": "NVTs: Gesamt", "NVTs: Trend": "NVTS: Trend", "Name": "Name", + "Negligible": "Vernachlässigbar", "Network": "Netzwerk", "Network Vulnerability Test Preferences ({{counts}})": "Network-Vulnerability-Test-Vorgaben ({{counts}})", "New": "Neu", @@ -1058,6 +1077,7 @@ "None.": "Keine.", "None. Result was an open port.": "Keine. Das Ergebnis war ein offener Port.", "Not a valid PGP file": "Keine gültige PGP-Datei", + "Not Defined": "Nicht definiert", "Not finished yet": "Noch nicht beendet", "Note": "Notiz", "Note Details": "Notizdetails", @@ -1134,6 +1154,7 @@ "Parameter Details": "Parameter-Details", "Partial": "Partiell", "Partition": "Partition", + "Passive": "Passiv", "Passphrase": "Passphrase", "Password": "Passwort", "Password only": "Nur Passwort", @@ -1172,6 +1193,7 @@ "Please note: You are about to change your own personal user data as Super Admin! It is not possible to change the login name. If you have modified the login name, neither the login name nor any other changes made will be saved. If you have made any modifications other than the login name, the data will be saved when clicking OK, and you will be logged out immediately.": "Bitte beachten Sie: Sie sind dabei Ihre eigenen persönlichen Nutzerdaten als Super Administrator zu ändern! Es ist nicht möglich, den Loginnamen zu ändern. Wenn Sie den Loginnamen modifiziert haben, werden weder der Loginname noch jedwede andere Änderungen gespeichert. Wenn Sie andere Änderungen vorgenommen haben, werden die Daten beim Klick auf OK gespeichert und Sie werden umgehend ausgeloggt.", "Please note: You are about to create a user without a role. This user will not have any permissions and as a result will not be able to login.": "Bitte beachten Sie: Sie sind dabei einen Benutzer ohne Rolle zu erstellen. Dieser Benutzer wird keine Berechtigungen haben und deshalb nicht in der Lage sein, sich einzuloggen.", "Please try again.": "Bitte versuchen Sie es erneut.", + "POC": "POC", "Policies": "Richtlinien", "Policies List": "Richtlinienliste", "Policy": "Richtlinie", @@ -1194,6 +1216,7 @@ "Ports": "Ports", "Preferences": "Vorgaben", "Prefs": "Vorgaben", + "Present": "Vorhanden", "Previous": "Vorherige", "Previous completed report of the same task": "Vorheriger abgeschlossener Bericht der selben Aufgabe", "Privacy Algorithm": "Privacy-Algorithmus", @@ -1204,6 +1227,7 @@ "Product": "Produkt", "Product Detection Result": "Ergebnis zur Produkterkennung", "Protocol": "Protokoll", + "Provider Urgency": "Dringlichkeit des Anbieters", "Published": "Veröffentlicht", "Published:": "Veröffentlicht:", "QoD": "QdE", @@ -1218,8 +1242,10 @@ "RADIUS Authentication Only": "Nur RADIUS-Authentifizierung", "RADIUS Host": "RADIUS-Host", "Random": "Zufällig", + "Recovery": "Wiederherstellung", "Recur on day(s)": "Wiederholen an Tag(en)", "Recurrence": "Wiederholung", + "Red": "Rot", "Reference Source": "Referenzquelle", "Reference URL": "Bezugs-URL", "Referenced CVEs": "CVE-Verweise", @@ -1362,6 +1388,7 @@ "SSH elevate credential ": "SSH-Anmeldedaten für zusätzliche Berechtigungen ", "SSL / TLS Certificate": "SSL-/TLS-Zertifikat", "Sa.": "Sa.", + "Safety": "Sicherheit", "Same": "Gleich", "Saturday": "Samstag", "Save": "Speichern", @@ -1416,6 +1443,7 @@ "SecInfo": "Sicherheitsinfos", "SecInfo Displays": "SecInfo-Anzeigen", "Secret Key": "Geheimer Schlüssel", + "Security Requirements": "Sicherheitsanforderungen", "Security note: The SMB protocol does not offer a fingerprint to establish complete mutual trust. Thus a man-in-the-middle attack can not be fully prevented.": "Sicherheitshinweis: Das SMB-Protokoll bietet keinen Fingerprint an, um komplettes gegenseitiges Vertrauen herzustellen. Ein Man-in-the-Middle-Angriff kann somit nicht völlig ausgeschlossen werden.", "Select": "Auswählen", "Select Filter": "Filter auswählen", @@ -1467,6 +1495,8 @@ "Sort by": "Sortieren nach", "Sorted In Ascending Order By {{sortBy}}": "In aufsteigender Reihenfolge sortiert nach {{sortBy}}", "Sorted In Descending Order By {{sortBy}}": "In absteigender Reihenfolge sortiert nach {{sortBy}}", + "Subsequent System Impact Metrics": "Auswirkungsmetriken für nachfolgende Systeme", + "Supplemental Metrics": "Ergänzende Metriken", "Source": "Quelle", "Sourcefire Connector": "Sourcefire-Schnittstelle", "Sources": "Quellen", @@ -1609,6 +1639,7 @@ "Th.": "Do.", "The First": "Jeden ersten", "The Fourth": "Jeden vierten", + "Threat Metrics": "Bedrohungsmetriken", "The GMP documentation is available ": "Die GMP-Dokumentation finden Sie ", "The Greenbone Enterprise License for this system expired {{days}} days ago. You can still use the system without restrictions, but you will not receive updates anymore. Especially you will miss new vulnerability tests and thus your scans will not detect important new vulnerabilities in your network. Please contact your administrator for renewing the license.": "Die Greenbone Enterprise License für dieses System ist vor {{days}} Tagen abgelaufen. Sie können das System weiterhin ohne Einschränkungen nutzen, aber Sie erhalten keine weiteren Updates. Insbesondere erhalten Sie keine neuen Schwachstellentests und Ihre Scans werden keine neuen Schwachstellen in Ihrem Netzwerk entdecken. Bitte kontaktieren Sie Ihren Administrator, um die Lizenz zu erneuern.", "The Greenbone Enterprise License for this system expired {{days}} days ago. You can still use the system without restrictions, but you will not receive updates anymore. Especially, you will miss new vulnerability tests and thus your scans will not detect important new vulnerabilities in your network.": "Die Greenbone Enterprise License für dieses System ist vor {{days}} Tagen abgelaufen. Sie können das System weiterhin ohne Einschränkungen nutzen, aber Sie erhalten keine weiteren Updates. Insbesondere erhalten Sie keine neuen Schwachstellentests und Ihre Scans werden keine neuen Schwachstellen in Ihrem Netzwerk entdecken.", @@ -1733,6 +1764,7 @@ "Unchanged": "Unverändert", "Unfold": "Ausklappen", "Unfold all details": "Alle Details ausklappen", + "Unreported": "Nicht gemeldet", "Unknown": "Unbekannt", "Unknown Error": "Unbekannter Fehler", "Unknown error on login.": "Unbekannter Fehler beim Login.", @@ -1772,6 +1804,7 @@ "Users {{user}}": "Benutzer {{user}}", "Valid": "Gültig", "Value": "Wert", + "Value Density": "Wertdichte", "Vector": "Vektor", "Vendor": "Hersteller", "Vendor fix": "Herstellerlösung", @@ -1803,6 +1836,8 @@ "Vulnerability count increased": "Anzahl der Schwachstellen erhöht", "Vulnerability was detected according to the Detection Method.": "Schwachstelle wurde entsprechend der Schwachstellen-Erkennungsmethode erkannt.", "Vulnerable Products": "Verwundbare Produkte", + "Vulnerability Response Effort": "Aufwand zur Behebung von Schwachstellen", + "Vulnerable System Impact Metrics": "Auswirkungsmetriken für verwundbares System", "WARNING: Please be aware that the report has more results than the threshold of {{threshold}}. Therefore, this action can take a really long time to finish. It might even exceed the session timeout!": "WARNUNG: Der Bericht enthält mehr als {{threshold}} Ergebnisse. Deshalb könnte diese Aktion eine sehr lange Zeit in Anspruch nehmen. Es ist sogar möglich, dass das Sitzungstimeout überschritten wird!", "Warning: Connection unencrypted": "Warnung: Verbindung unverschlüsselt", "Warning: You are using IE11": "Warnung: Sie nutzen IE11", diff --git a/src/web/pages/extras/cvssV4/CvssV4Calculator.jsx b/src/web/pages/extras/cvssV4/CvssV4Calculator.jsx new file mode 100644 index 0000000000..9421cfa503 --- /dev/null +++ b/src/web/pages/extras/cvssV4/CvssV4Calculator.jsx @@ -0,0 +1,120 @@ +/* SPDX-FileCopyrightText: 2024 Greenbone AG + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import PropTypes from 'prop-types'; +import {useState, useEffect, useMemo} from 'react'; +import _ from 'gmp/locale'; + +import { + cvssConfigData, + expectedMetricOptionsOrdered, +} from 'web/pages/extras/cvssV4/cvssConfig'; + +import { + processVector, + calculateScoreSafely, + removeUnusedMetrics, +} from './utils'; + +import useUserSessionTimeout from 'web/utils/useUserSessionTimeout'; +import FormGroup from 'web/components/form/formgroup'; +import Layout from 'web/components/layout/layout'; +import Section from 'web/components/section/section'; +import CvssIcon from 'web/components/icon/cvssicon'; +import SeverityBar from 'web/components/bar/severitybar'; +import styled from 'styled-components'; +import TextField from 'web/components/form/textfield'; +import MetricsGroups from 'web/pages/extras/cvssV4/MetricsGroups'; + +const StyledTextField = styled(TextField)` + width: 180px; +`; + +const cvssV4Prefix = 'CVSS:4.0/'; + +const CvssV4Calculator = ({location}) => { + const initialState = useMemo(() => { + return expectedMetricOptionsOrdered.reduce((obj, item) => { + obj[item[0]] = item[1]; + return obj; + }, {}); + }, []); + + const [selectedOptions, setSelectedOptions] = useState(initialState); + + const [inputCVSSVector, setInputCVSSVector] = useState( + `${cvssV4Prefix}${removeUnusedMetrics(selectedOptions)}`, + ); + + const [, renewSession] = useUserSessionTimeout(); + + const cvssVector = `${cvssV4Prefix}${removeUnusedMetrics(selectedOptions)}`; + + useEffect(() => { + if (location?.query?.cvssVector?.includes(cvssV4Prefix)) { + const newOptions = processVector(location.query.cvssVector); + setSelectedOptions({...initialState, ...newOptions}); + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [location]); + + const handleInputCVSSVectorChange = value => { + setInputCVSSVector(value); + + const newOptions = processVector(value); + setSelectedOptions({...initialState, ...newOptions}); + + renewSession(); + }; + + const handleOptionChange = (value, name) => { + const newOptions = {...selectedOptions, [name]: value}; + + setInputCVSSVector(`${cvssV4Prefix}${removeUnusedMetrics(newOptions)}`); + setSelectedOptions(newOptions); + + renewSession(); + }; + + const cvssScore = calculateScoreSafely(cvssVector); + + return ( + +
} + title={_('CVSSv4 Score Calculator')} + /> +

{_('From Metrics')}:

+ +

{_('From Vector')}:

+ + + + +

{_('Results')}:

+ + {cvssVector} + + + + + + ); +}; + +CvssV4Calculator.propTypes = { + location: PropTypes.object.isRequired, +}; + +export default CvssV4Calculator; diff --git a/src/web/pages/extras/cvssV4/Metrics.jsx b/src/web/pages/extras/cvssV4/Metrics.jsx new file mode 100644 index 0000000000..bbc87995c5 --- /dev/null +++ b/src/web/pages/extras/cvssV4/Metrics.jsx @@ -0,0 +1,30 @@ +/* SPDX-FileCopyrightText: 2024 Greenbone AG + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import _ from 'gmp/locale'; + +import FormGroup from 'web/components/form/formgroup'; +import Select from 'web/components/form/select'; + +const Metrics = ({metrics, selectedOptions, handleOptionChange}) => { + return Object.entries(metrics).map(([metricShort, metric]) => ( +
+ +