Skip to content

Commit c4fdc40

Browse files
fix(rpm): do not ignore installed files via third-party rpm (fanal#367)
Co-authored-by: Teppei Fukuda <[email protected]>
1 parent 1bb7e48 commit c4fdc40

File tree

1 file changed

+31
-3
lines changed

1 file changed

+31
-3
lines changed

analyzer/pkg/rpm/rpm.go

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,20 @@ var requiredFiles = []string{
3030
}
3131
var errUnexpectedNameFormat = xerrors.New("unexpected name format")
3232

33+
var osVendors = []string{
34+
"Amazon Linux", // Amazon Linux 1
35+
"Amazon.com", // Amazon Linux 2
36+
"CentOS", // CentOS
37+
"Fedora Project", // Fedora
38+
"Oracle America", // Oracle Linux
39+
"Red Hat", // Red Hat
40+
"AlmaLinux", // AlmaLinux
41+
"CloudLinux", // AlmaLinux
42+
"VMware", // Photon OS
43+
"SUSE", // SUSE Linux Enterprise
44+
"openSUSE", // openSUSE
45+
}
46+
3347
type rpmPkgAnalyzer struct{}
3448

3549
func (a rpmPkgAnalyzer) Analyze(_ context.Context, input analyzer.AnalysisInput) (*analyzer.AnalysisResult, error) {
@@ -104,9 +118,14 @@ func (a rpmPkgAnalyzer) parsePkgInfo(rc io.Reader) ([]types.Package, []string, e
104118
}
105119
}
106120

107-
files, err := pkg.InstalledFiles()
108-
if err != nil {
109-
return nil, nil, xerrors.Errorf("unable to get installed files: %w", err)
121+
// Check if the package is vendor-provided.
122+
// If the package is not provided by vendor, the installed files should not be skipped.
123+
var files []string
124+
if packageProvidedByVendor(pkg.Vendor) {
125+
files, err = pkg.InstalledFiles()
126+
if err != nil {
127+
return nil, nil, xerrors.Errorf("unable to get installed files: %w", err)
128+
}
110129
}
111130

112131
p := types.Package{
@@ -171,3 +190,12 @@ func (a rpmPkgAnalyzer) Type() analyzer.Type {
171190
func (a rpmPkgAnalyzer) Version() int {
172191
return version
173192
}
193+
194+
func packageProvidedByVendor(pkgVendor string) bool {
195+
for _, vendor := range osVendors {
196+
if strings.HasPrefix(pkgVendor, vendor) {
197+
return true
198+
}
199+
}
200+
return false
201+
}

0 commit comments

Comments
 (0)