mirror of
https://github.com/anchore/syft.git
synced 2025-11-20 09:53:16 +01:00
* [wip] Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * distinct the package metadata functions Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * remove metadata type from package core model Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * incorporate review feedback for names Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * add RPM archive metadata and split parser helpers Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * clarify the python package metadata type Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * rename the KB metadata type Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * break hackage and composer types by use case Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * linting fix Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix encoding and decoding for syft-json and cyclonedx Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * bump json schema to 11 Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * update cyclonedx-json snapshots Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * update cyclonedx-xml snapshots Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * update spdx-json snapshots Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * update spdx-tv snapshots Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * update syft-json snapshots Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * correct metadata type in stack yaml parser test Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix bom-ref redactor for cyclonedx-xml Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * add tests for legacy package metadata names Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * regenerate json schema v11 Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix legacy HackageMetadataType reflect type value check Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix linting Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * packagemetadata discovery should account for type shadowing Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix linting Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix cli tests Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * bump json schema version to v12 Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * update json schema to incorporate changes from main Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * add syft-json legacy config option Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * add tests around v11-v12 json decoding Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * add docs for SYFT_JSON_LEGACY Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * rename structs to be compliant with new naming scheme Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> --------- Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>
132 lines
3.7 KiB
Go
132 lines
3.7 KiB
Go
package cpe
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/anchore/syft/internal"
|
|
"github.com/anchore/syft/syft/pkg"
|
|
)
|
|
|
|
var (
|
|
prefixesToPackageType = map[string]pkg.Type{
|
|
"py-": pkg.PythonPkg,
|
|
"ruby-": pkg.GemPkg,
|
|
}
|
|
streamVersionPkgNamePattern = regexp.MustCompile(`^(?P<stream>[a-zA-Z][\w-]*?)(?P<streamVersion>\-?\d[\d\.]*?)($|-(?P<subPackage>[a-zA-Z][\w-]*?)?)$`)
|
|
)
|
|
|
|
type upstreamCandidate struct {
|
|
Name string
|
|
Type pkg.Type
|
|
}
|
|
|
|
func upstreamCandidates(m pkg.ApkDBEntry) (candidates []upstreamCandidate) {
|
|
// Do not consider OriginPackage variations when generating CPE candidates for the child package
|
|
// because doing so will result in false positives when matching to vulnerabilities in Grype since
|
|
// it won't know to lookup apk fix entries using the OriginPackage name.
|
|
|
|
name := m.Package
|
|
groups := internal.MatchNamedCaptureGroups(streamVersionPkgNamePattern, m.Package)
|
|
stream, ok := groups["stream"]
|
|
|
|
if ok && stream != "" {
|
|
sub, ok := groups["subPackage"]
|
|
|
|
if ok && sub != "" {
|
|
name = fmt.Sprintf("%s-%s", stream, sub)
|
|
} else {
|
|
name = stream
|
|
}
|
|
}
|
|
|
|
for prefix, typ := range prefixesToPackageType {
|
|
if strings.HasPrefix(name, prefix) {
|
|
t := strings.TrimPrefix(name, prefix)
|
|
if t != "" {
|
|
candidates = append(candidates, upstreamCandidate{Name: t, Type: typ})
|
|
return candidates
|
|
}
|
|
}
|
|
}
|
|
|
|
if name != "" {
|
|
candidates = append(candidates, upstreamCandidate{Name: name, Type: pkg.UnknownPkg})
|
|
return candidates
|
|
}
|
|
|
|
return candidates
|
|
}
|
|
|
|
func candidateVendorsForAPK(p pkg.Package) fieldCandidateSet {
|
|
metadata, ok := p.Metadata.(pkg.ApkDBEntry)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
vendors := newFieldCandidateSet()
|
|
candidates := upstreamCandidates(metadata)
|
|
|
|
for _, c := range candidates {
|
|
switch c.Type {
|
|
case pkg.UnknownPkg:
|
|
vendors.addValue(c.Name)
|
|
vendors.addValue(findAdditionalVendors(defaultCandidateAdditions, pkg.ApkPkg, c.Name, c.Name)...)
|
|
vendors.removeByValue(findVendorsToRemove(defaultCandidateRemovals, pkg.ApkPkg, c.Name)...)
|
|
case pkg.PythonPkg:
|
|
vendors.addValue(c.Name)
|
|
vendors.addValue(findAdditionalVendors(defaultCandidateAdditions, c.Type, c.Name, c.Name)...)
|
|
vendors.removeByValue(findVendorsToRemove(defaultCandidateRemovals, c.Type, c.Name)...)
|
|
for _, av := range additionalVendorsForPython(c.Name) {
|
|
vendors.addValue(av)
|
|
vendors.addValue(findAdditionalVendors(defaultCandidateAdditions, pkg.PythonPkg, av, av)...)
|
|
vendors.removeByValue(findVendorsToRemove(defaultCandidateRemovals, pkg.PythonPkg, av)...)
|
|
}
|
|
default:
|
|
vendors.addValue(c.Name)
|
|
vendors.addValue(findAdditionalVendors(defaultCandidateAdditions, c.Type, c.Name, c.Name)...)
|
|
vendors.removeByValue(findVendorsToRemove(defaultCandidateRemovals, c.Type, c.Name)...)
|
|
}
|
|
}
|
|
|
|
vendors.union(candidateVendorsFromURL(metadata.URL))
|
|
|
|
for v := range vendors {
|
|
v.disallowDelimiterVariations = true
|
|
v.disallowSubSelections = true
|
|
}
|
|
|
|
return vendors
|
|
}
|
|
|
|
func candidateProductsForAPK(p pkg.Package) fieldCandidateSet {
|
|
metadata, ok := p.Metadata.(pkg.ApkDBEntry)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
products := newFieldCandidateSet()
|
|
candidates := upstreamCandidates(metadata)
|
|
|
|
for _, c := range candidates {
|
|
switch c.Type {
|
|
case pkg.UnknownPkg:
|
|
products.addValue(c.Name)
|
|
products.addValue(findAdditionalProducts(defaultCandidateAdditions, pkg.ApkPkg, c.Name)...)
|
|
products.removeByValue(findProductsToRemove(defaultCandidateRemovals, pkg.ApkPkg, c.Name)...)
|
|
default:
|
|
products.addValue(c.Name)
|
|
products.addValue(findAdditionalProducts(defaultCandidateAdditions, c.Type, c.Name)...)
|
|
products.removeByValue(findProductsToRemove(defaultCandidateRemovals, c.Type, c.Name)...)
|
|
}
|
|
}
|
|
|
|
for p := range products {
|
|
p.disallowDelimiterVariations = true
|
|
p.disallowSubSelections = true
|
|
}
|
|
|
|
return products
|
|
}
|