Skip to content

Commit 90d27ff

Browse files
feat(cve): expand search domain to cve description and package info (#2086)
* feat(cve): add reference url for cve Signed-off-by: Laurentiu Niculae <[email protected]> * feat(cve): expand search domain to cve description and package info Signed-off-by: Laurentiu Niculae <[email protected]> --------- Signed-off-by: Laurentiu Niculae <[email protected]>
1 parent e59d8da commit 90d27ff

File tree

10 files changed

+124
-7
lines changed

10 files changed

+124
-7
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ require (
496496
go.uber.org/atomic v1.11.0 // indirect
497497
go.uber.org/multierr v1.11.0 // indirect
498498
go.uber.org/zap v1.26.0 // indirect
499-
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
499+
golang.org/x/exp v0.0.0-20231006140011-7918f672742d
500500
golang.org/x/mod v0.13.0 // indirect
501501
golang.org/x/net v0.18.0 // indirect
502502
golang.org/x/term v0.14.0 // indirect

pkg/extensions/search/cve/cve.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
godigest "github.com/opencontainers/go-digest"
1010
ispec "github.com/opencontainers/image-spec/specs-go/v1"
11+
"golang.org/x/exp/slices"
1112

1213
zerr "zotregistry.io/zot/errors"
1314
zcommon "zotregistry.io/zot/pkg/common"
@@ -334,7 +335,15 @@ func filterCVEList(cveMap map[string]cvemodel.CVE, searchedCVE string, pageFinde
334335

335336
for _, cve := range cveMap {
336337
if strings.Contains(strings.ToUpper(cve.Title), searchedCVE) ||
337-
strings.Contains(strings.ToUpper(cve.ID), searchedCVE) {
338+
strings.Contains(strings.ToUpper(cve.ID), searchedCVE) ||
339+
strings.Contains(strings.ToUpper(cve.Description), searchedCVE) ||
340+
strings.Contains(strings.ToUpper(cve.Reference), searchedCVE) ||
341+
strings.Contains(strings.ToUpper(cve.Severity), searchedCVE) ||
342+
slices.ContainsFunc(cve.PackageList, func(pack cvemodel.Package) bool {
343+
return strings.Contains(strings.ToUpper(pack.Name), searchedCVE) ||
344+
strings.Contains(strings.ToUpper(pack.FixedVersion), searchedCVE) ||
345+
strings.Contains(strings.ToUpper(pack.InstalledVersion), searchedCVE)
346+
}) {
338347
pageFinder.Add(cve)
339348
}
340349
}

pkg/extensions/search/cve/model/models.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ type CVE struct {
1717
Description string `json:"Description"`
1818
Severity string `json:"Severity"`
1919
Title string `json:"Title"`
20+
Reference string `json:"Reference"`
2021
PackageList []Package `json:"PackageList"`
2122
}
2223

pkg/extensions/search/cve/trivy/scanner.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"os"
77
"path"
8+
"strings"
89
"sync"
910

1011
"github.com/aquasecurity/trivy-db/pkg/metadata"
@@ -427,6 +428,7 @@ func (scanner Scanner) scanManifest(ctx context.Context, repo, digest string) (m
427428
ID: vulnerability.VulnerabilityID,
428429
Title: vulnerability.Title,
429430
Description: vulnerability.Description,
431+
Reference: getCVEReference(vulnerability.PrimaryURL, vulnerability.References),
430432
Severity: convertSeverity(vulnerability.Severity),
431433
PackageList: newPkgList,
432434
}
@@ -439,6 +441,34 @@ func (scanner Scanner) scanManifest(ctx context.Context, repo, digest string) (m
439441
return cveidMap, nil
440442
}
441443

444+
func getCVEReference(primaryURL string, references []string) string {
445+
if primaryURL != "" {
446+
return primaryURL
447+
}
448+
449+
if len(references) > 0 {
450+
nvdReference, found := getNVDReference(references)
451+
452+
if found {
453+
return nvdReference
454+
}
455+
456+
return references[0]
457+
}
458+
459+
return ""
460+
}
461+
462+
func getNVDReference(references []string) (string, bool) {
463+
for i := range references {
464+
if strings.Contains(references[i], "nvd.nist.gov") {
465+
return references[i], true
466+
}
467+
}
468+
469+
return "", false
470+
}
471+
442472
func (scanner Scanner) scanIndex(ctx context.Context, repo, digest string) (map[string]cvemodel.CVE, error) {
443473
if cachedMap := scanner.cache.Get(digest); cachedMap != nil {
444474
return cachedMap, nil

pkg/extensions/search/cve/trivy/scanner_internal_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,3 +488,19 @@ func TestIsIndexScannableErrors(t *testing.T) {
488488
})
489489
})
490490
}
491+
492+
func TestGetCVEReference(t *testing.T) {
493+
Convey("getCVEReference", t, func() {
494+
ref := getCVEReference("primary", []string{})
495+
So(ref, ShouldResemble, "primary")
496+
497+
ref = getCVEReference("", []string{"secondary"})
498+
So(ref, ShouldResemble, "secondary")
499+
500+
ref = getCVEReference("", []string{""})
501+
So(ref, ShouldResemble, "")
502+
503+
ref = getCVEReference("", []string{"https://nvd.nist.gov/vuln/detail/CVE-2023-2650"})
504+
So(ref, ShouldResemble, "https://nvd.nist.gov/vuln/detail/CVE-2023-2650")
505+
})
506+
}

pkg/extensions/search/gql_generated/generated.go

Lines changed: 57 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/extensions/search/gql_generated/models_gen.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/extensions/search/resolver.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ func getCVEListForImage(
228228
desc := cveDetail.Description
229229
title := cveDetail.Title
230230
severity := cveDetail.Severity
231+
referenceURL := cveDetail.Reference
231232

232233
pkgList := make([]*gql_generated.PackageInfo, 0)
233234

@@ -249,6 +250,7 @@ func getCVEListForImage(
249250
Title: &title,
250251
Description: &desc,
251252
Severity: &severity,
253+
Reference: &referenceURL,
252254
PackageList: pkgList,
253255
},
254256
)

pkg/extensions/search/schema.graphql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ type CVE {
4646
"""
4747
Description: String
4848
"""
49+
Reference for the given CVE
50+
"""
51+
Reference: String
52+
"""
4953
The impact the CVE has, one of "UNKNOWN", "LOW", "MEDIUM", "HIGH", "CRITICAL"
5054
"""
5155
Severity: String

pkg/extensions/search/schema.resolvers.go

Lines changed: 1 addition & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)