Skip to content

Commit 4b756f5

Browse files
authored
fix(vulnfeeds): don't assume enumeration on mitre when only one version (#5610)
mitre records kinda mid ngl.
1 parent f365252 commit 4b756f5

2 files changed

Lines changed: 50 additions & 3 deletions

File tree

‎vulnfeeds/conversion/cve5/default_extractor.go‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cve5
33
import (
44
"maps"
55
"slices"
6+
"strings"
67

78
c "github.com/google/osv/vulnfeeds/conversion"
89
"github.com/google/osv/vulnfeeds/git"
@@ -144,13 +145,19 @@ func (d *DefaultVersionExtractor) FindNormalAffectedRanges(affected models.Affec
144145

145146
// As a fallback, treat a single version as a standalone version.
146147
if vulns.CheckQuality(vers.Version).AtLeast(acceptableQuality) {
147-
vr := []*osvschema.Range{c.BuildVersionRange(vers.Version, vers.Version, "")}
148+
var vr []*osvschema.Range
149+
if strings.EqualFold(metrics.CNA, "mitre") && len(affected.Versions) == 1 {
150+
vr = []*osvschema.Range{c.BuildVersionRange("", vers.Version, "")}
151+
metrics.AddNote("Single version found %v for MITRE - Setting only last_affected", vers.Version)
152+
} else {
153+
vr = []*osvschema.Range{c.BuildVersionRange(vers.Version, vers.Version, "")}
154+
metrics.AddNote("Single version found %v - Treating as standalone version", vers.Version)
155+
}
148156
rwms := c.ToRangeWithMetadata(vr, models.VersionSourceAffected)
149157
for i := range rwms {
150158
rwms[i].Metadata.Versions = []string{vers.Version}
151159
}
152160
versionRanges = append(versionRanges, rwms...)
153-
metrics.AddNote("Single version found %v - Treating as standalone version", vers.Version)
154161
}
155162
}
156163

‎vulnfeeds/conversion/cve5/version_extraction_test.go‎

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,46 @@ func TestFindNormalAffectedRanges(t *testing.T) {
7878
},
7979
wantRangeType: VersionRangeTypeSemver,
8080
},
81+
{
82+
name: "mitre single version fallback",
83+
affected: models.Affected{
84+
Versions: []models.Versions{
85+
{
86+
Status: "affected",
87+
Version: "3.0",
88+
VersionType: "semver",
89+
},
90+
},
91+
},
92+
cnaAssigner: "mitre",
93+
wantRanges: []*osvschema.Range{
94+
conversion.BuildVersionRange("", "3.0", ""),
95+
},
96+
wantRangeType: VersionRangeTypeSemver,
97+
},
98+
{
99+
name: "mitre multiple versions fallback",
100+
affected: models.Affected{
101+
Versions: []models.Versions{
102+
{
103+
Status: "affected",
104+
Version: "3.0",
105+
VersionType: "semver",
106+
},
107+
{
108+
Status: "affected",
109+
Version: "3.1",
110+
VersionType: "semver",
111+
},
112+
},
113+
},
114+
cnaAssigner: "mitre",
115+
wantRanges: []*osvschema.Range{
116+
conversion.BuildVersionRange("3.0", "3.0", ""),
117+
conversion.BuildVersionRange("3.1", "3.1", ""),
118+
},
119+
wantRangeType: VersionRangeTypeSemver,
120+
},
81121
{
82122
name: "github range",
83123
affected: models.Affected{
@@ -114,7 +154,7 @@ func TestFindNormalAffectedRanges(t *testing.T) {
114154
for _, tt := range tests {
115155
t.Run(tt.name, func(t *testing.T) {
116156
versionExtractor := &DefaultVersionExtractor{}
117-
gotRangesWithMeta, gotRangeType := versionExtractor.FindNormalAffectedRanges(tt.affected, &models.ConversionMetrics{})
157+
gotRangesWithMeta, gotRangeType := versionExtractor.FindNormalAffectedRanges(tt.affected, &models.ConversionMetrics{CNA: tt.cnaAssigner})
118158
var gotRanges []*osvschema.Range
119159
for _, r := range gotRangesWithMeta {
120160
gotRanges = append(gotRanges, r.Range)

0 commit comments

Comments
 (0)