Skip to content

Commit 9cf6fbd

Browse files
committed
add warnings
1 parent 244b845 commit 9cf6fbd

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

contrib/trivy/pkg/converter.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package pkg
33
import (
44
"cmp"
55
"fmt"
6+
"maps"
67
"os"
78
"path/filepath"
89
"slices"
@@ -41,6 +42,7 @@ func Convert(results types.Results, artifactType ftypes.ArtifactType, artifactNa
4142
pkgs := models.Packages{}
4243
srcPkgs := models.SrcPackages{}
4344
vulnInfos := models.VulnInfos{}
45+
dupPkgs := map[string][]string{} // name -> list of versions seen (for duplicate detection)
4446
libraryScannerPaths := map[string]models.LibraryScanner{}
4547
for _, trivyResult := range results {
4648
for _, vuln := range trivyResult.Vulnerabilities {
@@ -196,7 +198,21 @@ func Convert(results types.Results, artifactType ftypes.ArtifactType, artifactNa
196198
pv = fmt.Sprintf("%d:%s", p.Epoch, pv)
197199
}
198200

199-
if existing, ok := pkgs[p.Name]; !ok || compareVersions(trivyResult.Type, pv, existing.Version) >= 0 {
201+
if existing, ok := pkgs[p.Name]; ok {
202+
if existing.Version != pv {
203+
if _, seen := dupPkgs[p.Name]; !seen {
204+
dupPkgs[p.Name] = []string{existing.Version}
205+
}
206+
dupPkgs[p.Name] = append(dupPkgs[p.Name], pv)
207+
}
208+
if compareVersions(trivyResult.Type, pv, existing.Version) >= 0 {
209+
pkgs[p.Name] = models.Package{
210+
Name: p.Name,
211+
Version: pv,
212+
Arch: p.Arch,
213+
}
214+
}
215+
} else {
200216
pkgs[p.Name] = models.Package{
201217
Name: p.Name,
202218
Version: pv,
@@ -281,6 +297,15 @@ func Convert(results types.Results, artifactType ftypes.ArtifactType, artifactNa
281297
scanResult.Packages = pkgs
282298
scanResult.SrcPackages = srcPkgs
283299
scanResult.LibraryScanners = libraryScanners
300+
301+
for _, name := range slices.Sorted(maps.Keys(dupPkgs)) {
302+
slices.Sort(dupPkgs[name])
303+
scanResult.Warnings = append(scanResult.Warnings, fmt.Sprintf(
304+
"Duplicate OS package detected: %s (%s). The newest version is kept, but false-positive CVEs may remain.",
305+
name, strings.Join(dupPkgs[name], ", "),
306+
))
307+
}
308+
284309
return scanResult, nil
285310
}
286311

contrib/trivy/pkg/converter_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,9 @@ func TestConvert(t *testing.T) {
590590
JSONVersion: models.JSONVersion,
591591
ScannedCves: models.VulnInfos{},
592592
LibraryScanners: models.LibraryScanners{},
593+
Warnings: []string{
594+
"Duplicate OS package detected: libssl3t64 (3.5.4-1~deb13u1, 3.5.5-1~deb13u1). The newest version is kept, but false-positive CVEs may remain.",
595+
},
593596
Packages: models.Packages{
594597
"libssl3t64": {
595598
Name: "libssl3t64",
@@ -644,6 +647,9 @@ func TestConvert(t *testing.T) {
644647
JSONVersion: models.JSONVersion,
645648
ScannedCves: models.VulnInfos{},
646649
LibraryScanners: models.LibraryScanners{},
650+
Warnings: []string{
651+
"Duplicate OS package detected: libssl3t64 (3.5.4-1~deb13u1, 3.5.5-1~deb13u1). The newest version is kept, but false-positive CVEs may remain.",
652+
},
647653
Packages: models.Packages{
648654
"libssl3t64": {
649655
Name: "libssl3t64",
@@ -716,6 +722,10 @@ func TestConvert(t *testing.T) {
716722
JSONVersion: models.JSONVersion,
717723
ScannedCves: models.VulnInfos{},
718724
LibraryScanners: models.LibraryScanners{},
725+
Warnings: []string{
726+
"Duplicate OS package detected: libssl3t64 (3.5.4-1~deb13u1, 3.5.5-1~deb13u1). The newest version is kept, but false-positive CVEs may remain.",
727+
"Duplicate OS package detected: openssl-provider-legacy (3.5.4-1~deb13u1, 3.5.5-1~deb13u1). The newest version is kept, but false-positive CVEs may remain.",
728+
},
719729
Packages: models.Packages{
720730
"libssl3t64": {
721731
Name: "libssl3t64",
@@ -775,6 +785,9 @@ func TestConvert(t *testing.T) {
775785
JSONVersion: models.JSONVersion,
776786
ScannedCves: models.VulnInfos{},
777787
LibraryScanners: models.LibraryScanners{},
788+
Warnings: []string{
789+
"Duplicate OS package detected: openssl (3.5.4-r0, 3.5.5-r0). The newest version is kept, but false-positive CVEs may remain.",
790+
},
778791
Packages: models.Packages{
779792
"openssl": {
780793
Name: "openssl",

0 commit comments

Comments
 (0)