@neuralegion/cvss
Version:
The Common Vulnerability Scoring System ([CVSS](https://www.first.org/cvss/)) [score](https://www.first.org/cvss/specification-document#1-2-Scoring) calculator and validator library written in [TypeScript](https://www.typescriptlang.org/).
125 lines (124 loc) • 5.27 kB
JavaScript
import { createCvssCalculator } from './factory';
import { validate as validateV2 } from './versions/v2/validator';
import { validate as validateV3 } from './versions/v3/validator';
import { parseMetricsAsMap as parseMetricsAsMapString } from './parser';
import { parseVersion } from './parser';
export const validate = (cvssString) => {
if (!cvssString || !cvssString.startsWith('CVSS:')) {
throw new Error('CVSS vector must start with "CVSS:"');
}
const versionStr = parseVersion(cvssString);
const validateString = versionStr === '2.0' ? validateV2 : validateV3;
validateString(cvssString);
};
function calculateCvss(cvssString) {
const version = parseVersion(cvssString);
if (!version) {
throw new Error('Invalid CVSS string: unable to detect version');
}
validate(cvssString);
return createCvssCalculator(version).calculate(cvssString);
}
/**
* Calculate the base score for a CVSS string
* @param cvssString - The CVSS vector string
* @returns The base score (0-10)
*/
export const calculateBaseScore = (cvssString) => calculateCvss(cvssString).baseScore;
/**
* Calculate the temporal score for a CVSS string
* @param cvssString - The CVSS vector string
* @returns The temporal score (0-10)
*/
export const calculateTemporalScore = (cvssString) => {
var _a;
const res = calculateCvss(cvssString);
return (_a = res.temporalScore) !== null && _a !== void 0 ? _a : res.baseScore;
};
/**
* Calculate the environmental score for a CVSS string
* @param cvssString - The CVSS vector string
* @returns The environmental score (0-10)
*/
export const calculateEnvironmentalScore = (cvssString) => {
var _a, _b;
const res = calculateCvss(cvssString);
return (_b = (_a = res.environmentalScore) !== null && _a !== void 0 ? _a : res.temporalScore) !== null && _b !== void 0 ? _b : res.baseScore;
};
/**
* Calculate base score with impact and exploitability
* @param cvssString - The CVSS vector string
* @returns Score result with impact and exploitability
*/
export const calculateBaseResult = (cvssString) => {
const res = calculateCvss(cvssString);
return {
score: res.baseScore,
impact: res.baseImpact,
exploitability: res.baseExploitability,
metricsMap: res.metrics
};
};
/**
* Calculate temporal score with impact and exploitability
* @param cvssString - The CVSS vector string
* @returns Score result with impact and exploitability
*/
export const calculateTemporalResult = (cvssString) => {
var _a;
const res = calculateCvss(cvssString);
return {
score: (_a = res.temporalScore) !== null && _a !== void 0 ? _a : res.baseScore,
impact: res.baseImpact,
exploitability: res.baseExploitability,
metricsMap: res.metrics
};
};
/**
* Calculate environmental score with impact and exploitability
* @param cvssString - The CVSS vector string
* @returns Score result with impact and exploitability
*/
export const calculateEnvironmentalResult = (cvssString) => {
var _a, _b, _c, _d;
const res = calculateCvss(cvssString);
return {
score: (_b = (_a = res.environmentalScore) !== null && _a !== void 0 ? _a : res.temporalScore) !== null && _b !== void 0 ? _b : res.baseScore,
impact: res.version === '2.0'
? res.baseImpact
: (_c = res.modifiedImpact) !== null && _c !== void 0 ? _c : res.baseImpact,
exploitability: res.version === '2.0'
? res.baseExploitability
: (_d = res.modifiedExploitability) !== null && _d !== void 0 ? _d : res.baseExploitability,
metricsMap: res.metrics
};
};
export const parseMetricsAsMap = (cvssStr) => parseMetricsAsMapString(cvssStr);
export const validateVersion = (versionStr) => {
if (!versionStr) {
throw new Error('Invalid CVSS string. Example: CVSS:3.0/AV:A/AC:H/PR:H/UI:R/S:U/C:N/I:N/A:L');
}
if (versionStr !== '2.0' && versionStr !== '3.0' && versionStr !== '3.1') {
throw new Error(`Unsupported CVSS version: ${versionStr}. Only 2.0, 3.0 and 3.1 are supported.`);
}
};
/**
* Stringify a score into a qualitative severity rating string
* @param score
*/
export const humanizeScore = (score) => score <= 0
? 'None'
: score <= 3.9
? 'Low'
: score <= 6.9
? 'Medium'
: score <= 8.9
? 'High'
: 'Critical';
// ============================================================================
// Re-exports for backward compatibility
// ============================================================================
export { calculateIss, calculateMiss, calculateExploitability, calculateModifiedExploitability, calculateImpact, calculateModifiedImpact, modifiedMetricsMap, populateTemporalMetricDefaults, populateEnvironmentalMetricDefaults, roundUp } from './versions/v3/calculator';
export { humanizeBaseMetric, humanizeBaseMetricValue } from './versions/v3/humanizer';
export { BaseMetric, TemporalMetric, EnvironmentalMetric, baseMetrics, temporalMetrics, environmentalMetrics, baseMetricValues, temporalMetricValues, environmentalMetricValues } from './versions/v3/models';
export { parseVector, parseVersion, parseMetrics } from './parser';