From 95ba1b04a415cbb0197ff25578ed2e34bb03c113 Mon Sep 17 00:00:00 2001 From: Alex Goodman Date: Tue, 21 Oct 2025 13:02:04 -0400 Subject: [PATCH] better binary cataloger description Signed-off-by: Alex Goodman --- cmd/syft/internal/commands/cataloger_info.go | 35 ++ internal/capabilities/generate/discover.go | 23 +- internal/capabilities/generate/merge.go | 74 ++- internal/capabilities/generate/merge_test.go | 9 +- internal/capabilities/model.go | 10 + internal/capabilities/packages.yaml | 618 +++++++++++++++++-- 6 files changed, 674 insertions(+), 95 deletions(-) diff --git a/cmd/syft/internal/commands/cataloger_info.go b/cmd/syft/internal/commands/cataloger_info.go index 08b22b0fe..05df73f5c 100644 --- a/cmd/syft/internal/commands/cataloger_info.go +++ b/cmd/syft/internal/commands/cataloger_info.go @@ -115,10 +115,19 @@ func renderCatalogerInfoJSON(doc *capabilities.Document, catalogers []capabiliti Fields []configFieldInfo `json:"fields,omitempty"` } + type detectorPackageInfo struct { + Class string `json:"class"` + Name string `json:"name"` + PURL string `json:"purl"` + CPEs []string `json:"cpes"` + Type string `json:"type"` + } + type patternInfo struct { Method string `json:"method"` Criteria []string `json:"criteria"` Conditions []capabilities.DetectorCondition `json:"conditions,omitempty"` + Packages []detectorPackageInfo `json:"packages,omitempty"` Comment string `json:"comment,omitempty"` Capabilities capabilities.CapabilitySet `json:"capabilities,omitempty"` } @@ -146,10 +155,23 @@ func renderCatalogerInfoJSON(doc *capabilities.Document, catalogers []capabiliti } for _, parser := range cat.Parsers { + // convert detector packages + var pkgs []detectorPackageInfo + for _, pkg := range parser.Detector.Packages { + pkgs = append(pkgs, detectorPackageInfo{ + Class: pkg.Class, + Name: pkg.Name, + PURL: pkg.PURL, + CPEs: pkg.CPEs, + Type: pkg.Type, + }) + } + pi := patternInfo{ Method: string(parser.Detector.Method), Criteria: parser.Detector.Criteria, Conditions: parser.Detector.Conditions, + Packages: pkgs, Comment: parser.Detector.Comment, Capabilities: parser.Capabilities, } @@ -161,10 +183,23 @@ func renderCatalogerInfoJSON(doc *capabilities.Document, catalogers []capabiliti info.Capabilities = cat.Capabilities for _, det := range cat.Detectors { + // convert detector packages + var pkgs []detectorPackageInfo + for _, pkg := range det.Packages { + pkgs = append(pkgs, detectorPackageInfo{ + Class: pkg.Class, + Name: pkg.Name, + PURL: pkg.PURL, + CPEs: pkg.CPEs, + Type: pkg.Type, + }) + } + pi := patternInfo{ Method: string(det.Method), Criteria: det.Criteria, Conditions: det.Conditions, + Packages: pkgs, Comment: det.Comment, } info.Patterns = append(info.Patterns, pi) diff --git a/internal/capabilities/generate/discover.go b/internal/capabilities/generate/discover.go index c16eb9474..e3d766429 100644 --- a/internal/capabilities/generate/discover.go +++ b/internal/capabilities/generate/discover.go @@ -8,7 +8,6 @@ import ( "os" "os/exec" "path/filepath" - "sort" "strings" "github.com/anchore/syft/internal/capabilities" @@ -650,24 +649,10 @@ func RepoRoot() (string, error) { return absRepoRoot, nil } -// extractBinaryClassifierGlobs extracts all FileGlob patterns from binary classifiers -func extractBinaryClassifierGlobs() []string { +// extractBinaryClassifiers extracts all binary classifiers with their full information +func extractBinaryClassifiers() []binary.Classifier { classifiers := binary.DefaultClassifiers() - // extract all unique FileGlob values - globs := make(map[string]bool) - for _, classifier := range classifiers { - if classifier.FileGlob != "" { - globs[classifier.FileGlob] = true - } - } - - // convert to sorted slice - result := make([]string, 0, len(globs)) - for glob := range globs { - result = append(result, glob) - } - sort.Strings(result) - - return result + // return all classifiers (already sorted by the default function) + return classifiers } diff --git a/internal/capabilities/generate/merge.go b/internal/capabilities/generate/merge.go index 8292d00eb..09142ed26 100644 --- a/internal/capabilities/generate/merge.go +++ b/internal/capabilities/generate/merge.go @@ -7,10 +7,20 @@ import ( "github.com/scylladb/go-set/strset" "github.com/anchore/syft/internal/capabilities" + "github.com/anchore/syft/syft/pkg/cataloger/binary" ) const genericCatalogerType = "generic" +// stripPURLVersion removes the @version suffix from a PURL string +// e.g., "pkg:generic/python@version" -> "pkg:generic/python" +func stripPURLVersion(purl string) string { + if idx := strings.LastIndex(purl, "@"); idx != -1 { + return purl[:idx] + } + return purl +} + // catalogerTypeOverrides specifies catalogers that should have their type manually controlled // rather than determined from the discovered cataloger structure. // This is useful when a cataloger is discovered as "generic" but should be treated as "custom" @@ -71,10 +81,10 @@ func RegenerateCapabilities(yamlPath string, repoRoot string) (*Statistics, erro } fmt.Println(" done") - // 1b. Extract binary classifier globs - fmt.Print(" → Extracting binary classifier globs...") - binaryClassifierGlobs := extractBinaryClassifierGlobs() - fmt.Printf(" found %d globs\n", len(binaryClassifierGlobs)) + // 1b. Extract binary classifiers + fmt.Print(" → Extracting binary classifiers...") + binaryClassifiers := extractBinaryClassifiers() + fmt.Printf(" found %d classifiers\n", len(binaryClassifiers)) // Count parser functions for _, disc := range discovered { @@ -205,7 +215,7 @@ func RegenerateCapabilities(yamlPath string, repoRoot string) (*Statistics, erro discovered, customCatalogerMetadata, customCatalogerPackageTypes, - binaryClassifierGlobs, + binaryClassifiers, allCatalogers, existing, discoveredConfigs, @@ -286,19 +296,19 @@ func (r *CatalogerRegistry) AllCatalogers() []capabilities.CatalogerInfo { return r.all } -// EnrichmentData encapsulates metadata enrichment information (metadata types, package types, binary classifier globs) +// EnrichmentData encapsulates metadata enrichment information (metadata types, package types, binary classifiers) type EnrichmentData struct { - metadata map[string][]string - packageTypes map[string][]string - binaryClassifierGlobs []string + metadata map[string][]string + packageTypes map[string][]string + binaryClassifiers []binary.Classifier } // NewEnrichmentData creates a new enrichment data container -func NewEnrichmentData(metadata, packageTypes map[string][]string, binaryClassifierGlobs []string) *EnrichmentData { +func NewEnrichmentData(metadata, packageTypes map[string][]string, binaryClassifiers []binary.Classifier) *EnrichmentData { return &EnrichmentData{ - metadata: metadata, - packageTypes: packageTypes, - binaryClassifierGlobs: binaryClassifierGlobs, + metadata: metadata, + packageTypes: packageTypes, + binaryClassifiers: binaryClassifiers, } } @@ -326,16 +336,36 @@ func (e *EnrichmentData) EnrichEntry(catalogerName string, entry *capabilities.C } } -// EnrichWithBinaryClassifier enriches an entry with binary classifier globs if it's the binary-classifier-cataloger +// EnrichWithBinaryClassifier enriches an entry with binary classifier detectors if it's the binary-classifier-cataloger func (e *EnrichmentData) EnrichWithBinaryClassifier(catalogerName string, entry *capabilities.CatalogerEntry) { - // special handling for binary-classifier-cataloger: auto-generate detectors from classifier globs - if catalogerName == "binary-classifier-cataloger" && len(e.binaryClassifierGlobs) > 0 { - entry.Detectors = []capabilities.Detector{ - { + // special handling for binary-classifier-cataloger: auto-generate one detector per classifier + if catalogerName == "binary-classifier-cataloger" && len(e.binaryClassifiers) > 0 { + var detectors []capabilities.Detector + for _, classifier := range e.binaryClassifiers { + // convert CPEs to strings + cpeStrings := make([]string, len(classifier.CPEs)) + for i, c := range classifier.CPEs { + cpeStrings[i] = c.Attributes.BindToFmtString() + } + + // strip @version from PURL + purlStr := stripPURLVersion(classifier.PURL.String()) + + detectors = append(detectors, capabilities.Detector{ Method: "glob", - Criteria: e.binaryClassifierGlobs, - }, + Criteria: []string{classifier.FileGlob}, + Packages: []capabilities.DetectorPackageInfo{ + { + Class: classifier.Class, + Name: classifier.Package, + PURL: purlStr, + CPEs: cpeStrings, + Type: "BinaryPkg", + }, + }, + }) } + entry.Detectors = detectors } } @@ -512,7 +542,7 @@ func mergeDiscoveredWithExisting( discovered map[string]DiscoveredCataloger, customMetadata map[string][]string, customPackageTypes map[string][]string, - binaryClassifierGlobs []string, + binaryClassifiers []binary.Classifier, allCatalogers []capabilities.CatalogerInfo, existing *capabilities.Document, configs map[string]capabilities.CatalogerConfigEntry, @@ -520,7 +550,7 @@ func mergeDiscoveredWithExisting( catalogerConfigMappings map[string]string, ) (*capabilities.Document, []orphanInfo, *mergeStatistics) { registry := NewCatalogerRegistry(discovered, allCatalogers) - enrichment := NewEnrichmentData(customMetadata, customPackageTypes, binaryClassifierGlobs) + enrichment := NewEnrichmentData(customMetadata, customPackageTypes, binaryClassifiers) merger := NewCatalogerMerger(registry, enrichment, existing, catalogerConfigMappings) // set the AUTO-GENERATED config sections diff --git a/internal/capabilities/generate/merge_test.go b/internal/capabilities/generate/merge_test.go index c8f3b7874..e0d8bc3fe 100644 --- a/internal/capabilities/generate/merge_test.go +++ b/internal/capabilities/generate/merge_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/require" "github.com/anchore/syft/internal/capabilities" + "github.com/anchore/syft/syft/pkg/cataloger/binary" ) func TestMergeConfigSections(t *testing.T) { @@ -113,7 +114,7 @@ func TestMergeConfigSections(t *testing.T) { map[string]DiscoveredCataloger{}, map[string][]string{}, map[string][]string{}, - []string{}, + []binary.Classifier{}, []capabilities.CatalogerInfo{}, tt.existingDoc, tt.newConfigs, @@ -250,7 +251,7 @@ func TestMergePreservesManualCapabilities(t *testing.T) { discovered, map[string][]string{}, map[string][]string{}, - []string{}, + []binary.Classifier{}, []capabilities.CatalogerInfo{ {Name: "test-cataloger", Selectors: []string{"test"}}, }, @@ -337,7 +338,7 @@ func TestCatalogerConfigFieldUpdatedForNewCatalogers(t *testing.T) { discovered, map[string][]string{}, map[string][]string{}, - []string{}, + []binary.Classifier{}, []capabilities.CatalogerInfo{ {Name: tt.catalogerName, Selectors: []string{"test"}}, }, @@ -357,7 +358,7 @@ func TestCatalogerConfigFieldUpdatedForNewCatalogers(t *testing.T) { map[string]DiscoveredCataloger{}, map[string][]string{}, map[string][]string{}, - []string{}, + []binary.Classifier{}, []capabilities.CatalogerInfo{ {Name: tt.catalogerName, Selectors: []string{"test"}}, }, diff --git a/internal/capabilities/model.go b/internal/capabilities/model.go index ca0ef197f..0082b504d 100644 --- a/internal/capabilities/model.go +++ b/internal/capabilities/model.go @@ -49,9 +49,19 @@ type Detector struct { Method ArtifactDetectionMethod `yaml:"method" json:"method"` // AUTO-GENERATED Criteria []string `yaml:"criteria" json:"criteria"` // AUTO-GENERATED Conditions []DetectorCondition `yaml:"conditions,omitempty" json:"conditions,omitempty"` // MANUAL - when this detector should be active + Packages []DetectorPackageInfo `yaml:"packages,omitempty" json:"packages,omitempty"` // AUTO-GENERATED for binary-classifier-cataloger Comment string `yaml:"comment,omitempty" json:"comment,omitempty"` // MANUAL - explanation of this detector } +// DetectorPackageInfo describes package information that a detector can produce +type DetectorPackageInfo struct { + Class string `yaml:"class" json:"class"` // classifier class (e.g., "python-binary-lib") + Name string `yaml:"name" json:"name"` // package name (e.g., "python") + PURL string `yaml:"purl" json:"purl"` // package URL without version (e.g., "pkg:generic/python") + CPEs []string `yaml:"cpes" json:"cpes"` // CPE strings + Type string `yaml:"type" json:"type"` // package type (e.g., "BinaryPkg") +} + // DetectorCondition specifies when a detector should be active based on configuration type DetectorCondition struct { // When specifies config field names and their required values (all must match - AND logic) diff --git a/internal/capabilities/packages.yaml b/internal/capabilities/packages.yaml index 318d9570a..14393d8fa 100644 --- a/internal/capabilities/packages.yaml +++ b/internal/capabilities/packages.yaml @@ -328,6 +328,7 @@ catalogers: - linux - os - package + - pacman parsers: # AUTO-GENERATED structure - function: parseAlpmDB # AUTO-GENERATED detector: # AUTO-GENERATED @@ -426,61 +427,578 @@ catalogers: detectors: # AUTO-GENERATED - method: glob criteria: - - '**/VERSION*' - - '**/arangosh' - - '**/bash' - - '**/beam.smp' - - '**/busybox' - - '**/cabal' - - '**/chrome' - - '**/composer*' - - '**/consul' - - '**/curl' - - '**/dart' - - '**/erlexec' - - '**/ffmpeg' - - '**/fluent-bit' - - '**/gcc' - - '**/getopt' - - '**/ghc*' - - '**/go' - - '**/gzip' - - '**/haproxy' - - '**/helm' - - '**/httpd' - - '**/java' - - '**/jdb' - - '**/jq' - - '**/libav*' - - '**/liberts_internal.a' - - '**/libjulia-internal.so' - - '**/libpypy*.so*' - - '**/libpython*.so*' - - '**/libstd-????????????????.dylib' - - '**/libstd-????????????????.so' - - '**/libswresample*' - - '**/lighttpd' - - '**/memcached' - - '**/mysql' - - '**/nginx' - - '**/node' - - '**/openssl' - - '**/perl' - - '**/postgres' - - '**/proftpd' - '**/python*' + packages: + - class: python-binary + name: python + purl: pkg:generic/python + cpes: + - cpe:2.3:a:python_software_foundation:python:*:*:*:*:*:*:*:* + - cpe:2.3:a:python:python:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/libpython*.so*' + packages: + - class: python-binary-lib + name: python + purl: pkg:generic/python + cpes: + - cpe:2.3:a:python_software_foundation:python:*:*:*:*:*:*:*:* + - cpe:2.3:a:python:python:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/libpypy*.so*' + packages: + - class: pypy-binary-lib + name: pypy + purl: pkg:generic/pypy + cpes: [] + type: BinaryPkg + - method: glob + criteria: + - '**/go' + packages: + - class: go-binary + name: go + purl: pkg:generic/go + cpes: + - cpe:2.3:a:golang:go:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/libjulia-internal.so' + packages: + - class: julia-binary + name: julia + purl: pkg:generic/julia + cpes: + - cpe:2.3:a:julialang:julia:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/helm' + packages: + - class: helm + name: helm + purl: pkg:golang/helm.sh/helm + cpes: + - cpe:2.3:a:helm:helm:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: - '**/redis-server' - - '**/ruby' - - '**/sqlcipher' - - '**/stack' - - '**/swipl' + packages: + - class: redis-binary + name: redis + purl: pkg:generic/redis + cpes: + - cpe:2.3:a:redislabs:redis:*:*:*:*:*:*:*:* + - cpe:2.3:a:redis:redis:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/node' + packages: + - class: nodejs-binary + name: node + purl: pkg:generic/node + cpes: + - cpe:2.3:a:nodejs:node.js:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/VERSION*' + packages: + - class: go-binary-hint + name: go + purl: pkg:generic/go + cpes: + - cpe:2.3:a:golang:go:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/busybox' + packages: + - class: busybox-binary + name: busybox + purl: pkg:generic/busybox + cpes: + - cpe:2.3:a:busybox:busybox:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/getopt' + packages: + - class: util-linux-binary + name: util-linux + purl: pkg:generic/util-linux + cpes: + - cpe:2.3:a:kernel:util-linux:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/haproxy' + packages: + - class: haproxy-binary + name: haproxy + purl: pkg:generic/haproxy + cpes: + - cpe:2.3:a:haproxy:haproxy:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/perl' + packages: + - class: perl-binary + name: perl + purl: pkg:generic/perl + cpes: + - cpe:2.3:a:perl:perl:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/composer*' + packages: + - class: php-composer-binary + name: composer + purl: pkg:generic/composer + cpes: + - cpe:2.3:a:getcomposer:composer:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/httpd' + packages: + - class: httpd-binary + name: httpd + purl: pkg:generic/httpd + cpes: + - cpe:2.3:a:apache:http_server:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/memcached' + packages: + - class: memcached-binary + name: memcached + purl: pkg:generic/memcached + cpes: + - cpe:2.3:a:memcached:memcached:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: - '**/traefik' - - '**/vault' - - '**/wp' + packages: + - class: traefik-binary + name: traefik + purl: pkg:generic/traefik + cpes: + - cpe:2.3:a:traefik:traefik:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/arangosh' + packages: + - class: arangodb-binary + name: arangodb + purl: pkg:generic/arangodb + cpes: + - cpe:2.3:a:arangodb:arangodb:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/postgres' + packages: + - class: postgresql-binary + name: postgresql + purl: pkg:generic/postgresql + cpes: + - cpe:2.3:a:postgresql:postgresql:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/mysql' + packages: + - class: mysql-binary + name: mysql + purl: pkg:generic/mysql + cpes: + - cpe:2.3:a:oracle:mysql:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/mysql' + packages: + - class: mysql-binary + name: percona-server + purl: pkg:generic/percona-server + cpes: + - cpe:2.3:a:oracle:mysql:*:*:*:*:*:*:*:* + - cpe:2.3:a:percona:percona_server:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/mysql' + packages: + - class: mysql-binary + name: percona-xtradb-cluster + purl: pkg:generic/percona-xtradb-cluster + cpes: + - cpe:2.3:a:oracle:mysql:*:*:*:*:*:*:*:* + - cpe:2.3:a:percona:percona_server:*:*:*:*:*:*:*:* + - cpe:2.3:a:percona:xtradb_cluster:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: - '**/xtrabackup' - - '**/xz' - - '**/zstd' + packages: + - class: xtrabackup-binary + name: percona-xtrabackup + purl: pkg:generic/percona-xtrabackup + cpes: + - cpe:2.3:a:percona:xtrabackup:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: - '**/{mariadb,mysql}' + packages: + - class: mariadb-binary + name: mariadb + purl: pkg:generic/mariadb + cpes: + - cpe:2.3:a:mariadb:mariadb:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/libstd-????????????????.so' + packages: + - class: rust-standard-library-linux + name: rust + purl: pkg:generic/rust + cpes: + - cpe:2.3:a:rust-lang:rust:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/libstd-????????????????.dylib' + packages: + - class: rust-standard-library-macos + name: rust + purl: pkg:generic/rust + cpes: + - cpe:2.3:a:rust-lang:rust:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/ruby' + packages: + - class: ruby-binary + name: ruby + purl: pkg:generic/ruby + cpes: + - cpe:2.3:a:ruby-lang:ruby:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/erlexec' + packages: + - class: erlang-binary + name: erlang + purl: pkg:generic/erlang + cpes: + - cpe:2.3:a:erlang:erlang/otp:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/beam.smp' + packages: + - class: erlang-alpine-binary + name: erlang + purl: pkg:generic/erlang + cpes: + - cpe:2.3:a:erlang:erlang/otp:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/liberts_internal.a' + packages: + - class: erlang-library + name: erlang + purl: pkg:generic/erlang + cpes: + - cpe:2.3:a:erlang:erlang/otp:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/swipl' + packages: + - class: swipl-binary + name: swipl + purl: pkg:generic/swipl + cpes: + - cpe:2.3:a:erlang:erlang/otp:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/dart' + packages: + - class: dart-binary + name: dart + purl: pkg:generic/dart + cpes: + - cpe:2.3:a:dart:dart_software_development_kit:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/ghc*' + packages: + - class: haskell-ghc-binary + name: haskell/ghc + purl: pkg:generic/haskell/ghc + cpes: + - cpe:2.3:a:haskell:ghc:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/cabal' + packages: + - class: haskell-cabal-binary + name: haskell/cabal + purl: pkg:generic/haskell/cabal + cpes: + - cpe:2.3:a:haskell:cabal:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/stack' + packages: + - class: haskell-stack-binary + name: haskell/stack + purl: pkg:generic/haskell/stack + cpes: + - cpe:2.3:a:haskell:stack:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/consul' + packages: + - class: consul-binary + name: consul + purl: pkg:golang/github.com/hashicorp/consul + cpes: + - cpe:2.3:a:hashicorp:consul:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/vault' + packages: + - class: hashicorp-vault-binary + name: github.com/hashicorp/vault + purl: pkg:golang/github.com/hashicorp/vault + cpes: + - cpe:2.3:a:hashicorp:vault:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/nginx' + packages: + - class: nginx-binary + name: nginx + purl: pkg:generic/nginx + cpes: + - cpe:2.3:a:f5:nginx:*:*:*:*:*:*:*:* + - cpe:2.3:a:nginx:nginx:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/bash' + packages: + - class: bash-binary + name: bash + purl: pkg:generic/bash + cpes: + - cpe:2.3:a:gnu:bash:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/openssl' + packages: + - class: openssl-binary + name: openssl + purl: pkg:generic/openssl + cpes: + - cpe:2.3:a:openssl:openssl:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/gcc' + packages: + - class: gcc-binary + name: gcc + purl: pkg:generic/gcc + cpes: + - cpe:2.3:a:gnu:gcc:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/fluent-bit' + packages: + - class: fluent-bit-binary + name: fluent-bit + purl: pkg:github/fluent/fluent-bit + cpes: + - cpe:2.3:a:treasuredata:fluent_bit:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/wp' + packages: + - class: wordpress-cli-binary + name: wp-cli + purl: pkg:generic/wp-cli + cpes: + - cpe:2.3:a:wp-cli:wp-cli:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/curl' + packages: + - class: curl-binary + name: curl + purl: pkg:generic/curl + cpes: + - cpe:2.3:a:haxx:curl:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/lighttpd' + packages: + - class: lighttpd-binary + name: lighttpd + purl: pkg:generic/lighttpd + cpes: + - cpe:2.3:a:lighttpd:lighttpd:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/proftpd' + packages: + - class: proftpd-binary + name: proftpd + purl: pkg:generic/proftpd + cpes: + - cpe:2.3:a:proftpd:proftpd:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/zstd' + packages: + - class: zstd-binary + name: zstd + purl: pkg:generic/zstd + cpes: + - cpe:2.3:a:facebook:zstandard:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/xz' + packages: + - class: xz-binary + name: xz + purl: pkg:generic/xz + cpes: + - cpe:2.3:a:tukaani:xz:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/gzip' + packages: + - class: gzip-binary + name: gzip + purl: pkg:generic/gzip + cpes: + - cpe:2.3:a:gnu:gzip:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/sqlcipher' + packages: + - class: sqlcipher-binary + name: sqlcipher + purl: pkg:generic/sqlcipher + cpes: + - cpe:2.3:a:zetetic:sqlcipher:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/jq' + packages: + - class: jq-binary + name: jq + purl: pkg:generic/jq + cpes: + - cpe:2.3:a:jqlang:jq:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/chrome' + packages: + - class: chrome-binary + name: chrome + purl: pkg:generic/chrome + cpes: + - cpe:2.3:a:google:chrome:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/ffmpeg' + packages: + - class: ffmpeg-binary + name: ffmpeg + purl: pkg:generic/ffmpeg + cpes: + - cpe:2.3:a:ffmpeg:ffmpeg:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/libav*' + packages: + - class: ffmpeg-library + name: ffmpeg + purl: pkg:generic/ffmpeg + cpes: + - cpe:2.3:a:ffmpeg:ffmpeg:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/libswresample*' + packages: + - class: ffmpeg-library + name: ffmpeg + purl: pkg:generic/ffmpeg + cpes: + - cpe:2.3:a:ffmpeg:ffmpeg:*:*:*:*:*:*:*:* + type: BinaryPkg + - method: glob + criteria: + - '**/java' + packages: + - class: java-binary + name: "" + purl: pkg:/ + cpes: [] + type: BinaryPkg + - method: glob + criteria: + - '**/jdb' + packages: + - class: java-jdb-binary + name: "" + purl: pkg:/ + cpes: [] + type: BinaryPkg metadata_types: # AUTO-GENERATED - pkg.BinarySignature package_types: # AUTO-GENERATED