Skip to content

Commit 0e552b3

Browse files
authored
fix: Add support for CVSS V4 metrics in NVD conversion (google#4158)
Closes google#4157
1 parent 12746b3 commit 0e552b3

File tree

2 files changed

+13
-14
lines changed

2 files changed

+13
-14
lines changed

vulnfeeds/cves/nvd2.go

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -206,17 +206,8 @@ type CVSSV2 struct {
206206
UserInteractionRequired bool `json:"userInteractionRequired,omitempty" mapstructure:"userInteractionRequired,omitempty" yaml:"userInteractionRequired,omitempty"`
207207
}
208208

209-
// CVSS V3.0 score. (hand-generated)
210-
type CVSSV30 struct {
211-
Source string `json:"source" mapstructure:"source" yaml:"source"`
212-
Type string `json:"type" mapstructure:"type" yaml:"type"`
213-
CVSSData CVSS `json:"cvssData" mapstructure:"cvssData" yaml:"cvssData"`
214-
ExploitabilityScore *DefSubscore `json:"exploitabilityScore,omitempty" mapstructure:"exploitabilityScore,omitempty" yaml:"exploitabilityScore,omitempty"`
215-
ImpactScore *DefSubscore `json:"impactScore,omitempty" mapstructure:"impactScore,omitempty" yaml:"impactScore,omitempty"`
216-
}
217-
218-
// CVSS V3.1 score. (hand-generated)
219-
type CVSSV31 struct {
209+
// CVSS Score to encapsulate V3.0, V3.1, V4.0 structs
210+
type BaseCVSSNVD struct {
220211
Source string `json:"source" mapstructure:"source" yaml:"source"`
221212
Type string `json:"type" mapstructure:"type" yaml:"type"`
222213
CVSSData CVSS `json:"cvssData" mapstructure:"cvssData" yaml:"cvssData"`
@@ -230,10 +221,13 @@ type CVEItemMetrics struct {
230221
CVSSMetricV2 []CVSSV2 `json:"cvssMetricV2,omitempty" mapstructure:"cvssMetricV2,omitempty" yaml:"cvssMetricV2,omitempty"`
231222

232223
// CVSS V3.0 score.
233-
CVSSMetricV30 []CVSSV30 `json:"cvssMetricV30,omitempty" mapstructure:"cvssMetricV30,omitempty" yaml:"cvssMetricV30,omitempty"`
224+
CVSSMetricV30 []BaseCVSSNVD `json:"cvssMetricV30,omitempty" mapstructure:"cvssMetricV30,omitempty" yaml:"cvssMetricV30,omitempty"`
234225

235226
// CVSS V3.1 score.
236-
CVSSMetricV31 []CVSSV31 `json:"cvssMetricV31,omitempty" mapstructure:"cvssMetricV31,omitempty" yaml:"cvssMetricV31,omitempty"`
227+
CVSSMetricV31 []BaseCVSSNVD `json:"cvssMetricV31,omitempty" mapstructure:"cvssMetricV31,omitempty" yaml:"cvssMetricV31,omitempty"`
228+
229+
// CVSS V4 score
230+
CVSSMetricV40 []BaseCVSSNVD `json:"cvssMetricV40,omitempty" mapstructure:"cvssMetricV40,omitempty" yaml:"cvssMetricV40,omitempty"`
237231
}
238232

239233
type Reference struct {

vulnfeeds/vulns/vulns.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,12 @@ func (v *Vulnerability) AddPkgInfo(pkgInfo PackageInfo) {
308308
func getBestSeverity(metricsData *cves.CVEItemMetrics) (string, osvschema.SeverityType) {
309309
// Define search passes. First pass for "Primary", second for any.
310310
for _, primaryOnly := range []bool{true, false} {
311-
// Inside each pass, prioritize v3.1 over v3.0.
311+
// Inside each pass, prioritize v4.0 over v3.1 over v3.0.
312+
for _, metric := range metricsData.CVSSMetricV40 {
313+
if (!primaryOnly || metric.Type == "Primary") && metric.CVSSData.VectorString != "" {
314+
return metric.CVSSData.VectorString, osvschema.SeverityCVSSV4
315+
}
316+
}
312317
for _, metric := range metricsData.CVSSMetricV31 {
313318
if (!primaryOnly || metric.Type == "Primary") && metric.CVSSData.VectorString != "" {
314319
return metric.CVSSData.VectorString, osvschema.SeverityCVSSV3

0 commit comments

Comments
 (0)