mirror of
https://github.com/anchore/syft.git
synced 2025-11-17 08:23:15 +01:00
fix: disable cert validation in dotnet-portable-executable-cataloger by default (#3677)
Signed-off-by: rogueai <rogueai@users.noreply.github.com> Signed-off-by: Keith Zantow <kzantow@gmail.com> Co-authored-by: Keith Zantow <kzantow@gmail.com>
This commit is contained in:
parent
dd2ee2bbf7
commit
aeea170b19
@ -19,6 +19,7 @@ import (
|
|||||||
"github.com/anchore/syft/syft/file/cataloger/executable"
|
"github.com/anchore/syft/syft/file/cataloger/executable"
|
||||||
"github.com/anchore/syft/syft/file/cataloger/filecontent"
|
"github.com/anchore/syft/syft/file/cataloger/filecontent"
|
||||||
"github.com/anchore/syft/syft/pkg/cataloger/binary"
|
"github.com/anchore/syft/syft/pkg/cataloger/binary"
|
||||||
|
"github.com/anchore/syft/syft/pkg/cataloger/dotnet"
|
||||||
"github.com/anchore/syft/syft/pkg/cataloger/golang"
|
"github.com/anchore/syft/syft/pkg/cataloger/golang"
|
||||||
"github.com/anchore/syft/syft/pkg/cataloger/java"
|
"github.com/anchore/syft/syft/pkg/cataloger/java"
|
||||||
"github.com/anchore/syft/syft/pkg/cataloger/javascript"
|
"github.com/anchore/syft/syft/pkg/cataloger/javascript"
|
||||||
@ -42,6 +43,7 @@ type Catalog struct {
|
|||||||
Enrich []string `yaml:"enrich" json:"enrich" mapstructure:"enrich"`
|
Enrich []string `yaml:"enrich" json:"enrich" mapstructure:"enrich"`
|
||||||
|
|
||||||
// ecosystem-specific cataloger configuration
|
// ecosystem-specific cataloger configuration
|
||||||
|
Dotnet dotnetConfig `yaml:"dotnet" json:"dotnet" mapstructure:"dotnet"`
|
||||||
Golang golangConfig `yaml:"golang" json:"golang" mapstructure:"golang"`
|
Golang golangConfig `yaml:"golang" json:"golang" mapstructure:"golang"`
|
||||||
Java javaConfig `yaml:"java" json:"java" mapstructure:"java"`
|
Java javaConfig `yaml:"java" json:"java" mapstructure:"java"`
|
||||||
JavaScript javaScriptConfig `yaml:"javascript" json:"javascript" mapstructure:"javascript"`
|
JavaScript javaScriptConfig `yaml:"javascript" json:"javascript" mapstructure:"javascript"`
|
||||||
@ -72,6 +74,7 @@ func DefaultCatalog() Catalog {
|
|||||||
Package: defaultPackageConfig(),
|
Package: defaultPackageConfig(),
|
||||||
License: defaultLicenseConfig(),
|
License: defaultLicenseConfig(),
|
||||||
LinuxKernel: defaultLinuxKernelConfig(),
|
LinuxKernel: defaultLinuxKernelConfig(),
|
||||||
|
Dotnet: defaultDotnetConfig(),
|
||||||
Golang: defaultGolangConfig(),
|
Golang: defaultGolangConfig(),
|
||||||
Java: defaultJavaConfig(),
|
Java: defaultJavaConfig(),
|
||||||
File: defaultFileConfig(),
|
File: defaultFileConfig(),
|
||||||
@ -163,6 +166,8 @@ func (cfg Catalog) ToPackagesConfig() pkgcataloging.Config {
|
|||||||
}
|
}
|
||||||
return pkgcataloging.Config{
|
return pkgcataloging.Config{
|
||||||
Binary: binary.DefaultClassifierCatalogerConfig(),
|
Binary: binary.DefaultClassifierCatalogerConfig(),
|
||||||
|
Dotnet: dotnet.DefaultCatalogerConfig().
|
||||||
|
WithCertificateValidation(cfg.Dotnet.EnableCertificateValidation),
|
||||||
Golang: golang.DefaultCatalogerConfig().
|
Golang: golang.DefaultCatalogerConfig().
|
||||||
WithSearchLocalModCacheLicenses(*multiLevelOption(false, enrichmentEnabled(cfg.Enrich, task.Go, task.Golang), cfg.Golang.SearchLocalModCacheLicenses)).
|
WithSearchLocalModCacheLicenses(*multiLevelOption(false, enrichmentEnabled(cfg.Enrich, task.Go, task.Golang), cfg.Golang.SearchLocalModCacheLicenses)).
|
||||||
WithLocalModCacheDir(cfg.Golang.LocalModCacheDir).
|
WithLocalModCacheDir(cfg.Golang.LocalModCacheDir).
|
||||||
|
|||||||
25
cmd/syft/internal/options/dotnet.go
Normal file
25
cmd/syft/internal/options/dotnet.go
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package options
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/anchore/clio"
|
||||||
|
"github.com/anchore/syft/syft/pkg/cataloger/dotnet"
|
||||||
|
)
|
||||||
|
|
||||||
|
type dotnetConfig struct {
|
||||||
|
EnableCertificateValidation bool `json:"enable-certificate-validation" yaml:"enable-certificate-validation" mapstructure:"enable-certificate-validation"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ interface {
|
||||||
|
clio.FieldDescriber
|
||||||
|
} = (*dotnetConfig)(nil)
|
||||||
|
|
||||||
|
func (o *dotnetConfig) DescribeFields(descriptions clio.FieldDescriptionSet) {
|
||||||
|
descriptions.Add(&o.EnableCertificateValidation, `enable certificate validation -- this requires an active internet connection to download certificates and CRLs`)
|
||||||
|
}
|
||||||
|
|
||||||
|
func defaultDotnetConfig() dotnetConfig {
|
||||||
|
def := dotnet.DefaultCatalogerConfig()
|
||||||
|
return dotnetConfig{
|
||||||
|
EnableCertificateValidation: def.EnableCertificateValidation,
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -117,7 +117,10 @@ func DefaultPackageTaskFactories() Factories {
|
|||||||
|
|
||||||
// language-specific package for both image and directory scans (but not necessarily declared) ////////////////////////////////////////
|
// language-specific package for both image and directory scans (but not necessarily declared) ////////////////////////////////////////
|
||||||
newSimplePackageTaskFactory(dotnet.NewDotnetPackagesLockCataloger, pkgcataloging.DeclaredTag, pkgcataloging.ImageTag, pkgcataloging.DirectoryTag, pkgcataloging.LanguageTag, "dotnet", "c#"),
|
newSimplePackageTaskFactory(dotnet.NewDotnetPackagesLockCataloger, pkgcataloging.DeclaredTag, pkgcataloging.ImageTag, pkgcataloging.DirectoryTag, pkgcataloging.LanguageTag, "dotnet", "c#"),
|
||||||
newSimplePackageTaskFactory(dotnet.NewDotnetPortableExecutableCataloger, pkgcataloging.DirectoryTag, pkgcataloging.InstalledTag, pkgcataloging.ImageTag, pkgcataloging.LanguageTag, "dotnet", "c#", "binary"),
|
newPackageTaskFactory(
|
||||||
|
func(cfg CatalogingFactoryConfig) pkg.Cataloger {
|
||||||
|
return dotnet.NewDotnetPortableExecutableCataloger(cfg.PackagesConfig.Dotnet)
|
||||||
|
}, pkgcataloging.DirectoryTag, pkgcataloging.InstalledTag, pkgcataloging.ImageTag, pkgcataloging.LanguageTag, "dotnet", "c#", "binary"),
|
||||||
newSimplePackageTaskFactory(python.NewInstalledPackageCataloger, pkgcataloging.DirectoryTag, pkgcataloging.InstalledTag, pkgcataloging.ImageTag, pkgcataloging.LanguageTag, "python"),
|
newSimplePackageTaskFactory(python.NewInstalledPackageCataloger, pkgcataloging.DirectoryTag, pkgcataloging.InstalledTag, pkgcataloging.ImageTag, pkgcataloging.LanguageTag, "python"),
|
||||||
newPackageTaskFactory(
|
newPackageTaskFactory(
|
||||||
func(cfg CatalogingFactoryConfig) pkg.Cataloger {
|
func(cfg CatalogingFactoryConfig) pkg.Cataloger {
|
||||||
|
|||||||
@ -2,6 +2,7 @@ package pkgcataloging
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/anchore/syft/syft/pkg/cataloger/binary"
|
"github.com/anchore/syft/syft/pkg/cataloger/binary"
|
||||||
|
"github.com/anchore/syft/syft/pkg/cataloger/dotnet"
|
||||||
"github.com/anchore/syft/syft/pkg/cataloger/golang"
|
"github.com/anchore/syft/syft/pkg/cataloger/golang"
|
||||||
"github.com/anchore/syft/syft/pkg/cataloger/java"
|
"github.com/anchore/syft/syft/pkg/cataloger/java"
|
||||||
"github.com/anchore/syft/syft/pkg/cataloger/javascript"
|
"github.com/anchore/syft/syft/pkg/cataloger/javascript"
|
||||||
@ -11,6 +12,7 @@ import (
|
|||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Binary binary.ClassifierCatalogerConfig `yaml:"binary" json:"binary" mapstructure:"binary"`
|
Binary binary.ClassifierCatalogerConfig `yaml:"binary" json:"binary" mapstructure:"binary"`
|
||||||
|
Dotnet dotnet.CatalogerConfig `yaml:"dotnet" json:"dotnet" mapstructure:"dotnet"`
|
||||||
Golang golang.CatalogerConfig `yaml:"golang" json:"golang" mapstructure:"golang"`
|
Golang golang.CatalogerConfig `yaml:"golang" json:"golang" mapstructure:"golang"`
|
||||||
JavaArchive java.ArchiveCatalogerConfig `yaml:"java-archive" json:"java-archive" mapstructure:"java-archive"`
|
JavaArchive java.ArchiveCatalogerConfig `yaml:"java-archive" json:"java-archive" mapstructure:"java-archive"`
|
||||||
JavaScript javascript.CatalogerConfig `yaml:"javascript" json:"javascript" mapstructure:"javascript"`
|
JavaScript javascript.CatalogerConfig `yaml:"javascript" json:"javascript" mapstructure:"javascript"`
|
||||||
@ -21,6 +23,7 @@ type Config struct {
|
|||||||
func DefaultConfig() Config {
|
func DefaultConfig() Config {
|
||||||
return Config{
|
return Config{
|
||||||
Binary: binary.DefaultClassifierCatalogerConfig(),
|
Binary: binary.DefaultClassifierCatalogerConfig(),
|
||||||
|
Dotnet: dotnet.DefaultCatalogerConfig(),
|
||||||
Golang: golang.DefaultCatalogerConfig(),
|
Golang: golang.DefaultCatalogerConfig(),
|
||||||
LinuxKernel: kernel.DefaultLinuxKernelCatalogerConfig(),
|
LinuxKernel: kernel.DefaultLinuxKernelCatalogerConfig(),
|
||||||
Python: python.DefaultCatalogerConfig(),
|
Python: python.DefaultCatalogerConfig(),
|
||||||
@ -33,6 +36,11 @@ func (c Config) WithBinaryConfig(cfg binary.ClassifierCatalogerConfig) Config {
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c Config) WithDotnetConfig(cfg dotnet.CatalogerConfig) Config {
|
||||||
|
c.Dotnet = cfg
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
func (c Config) WithGolangConfig(cfg golang.CatalogerConfig) Config {
|
func (c Config) WithGolangConfig(cfg golang.CatalogerConfig) Config {
|
||||||
c.Golang = cfg
|
c.Golang = cfg
|
||||||
return c
|
return c
|
||||||
|
|||||||
@ -15,9 +15,10 @@ func NewDotnetDepsCataloger() pkg.Cataloger {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewDotnetPortableExecutableCataloger returns a new Dotnet cataloger object base on portable executable files.
|
// NewDotnetPortableExecutableCataloger returns a new Dotnet cataloger object base on portable executable files.
|
||||||
func NewDotnetPortableExecutableCataloger() pkg.Cataloger {
|
func NewDotnetPortableExecutableCataloger(cfg CatalogerConfig) pkg.Cataloger {
|
||||||
|
p := dotnetPortableExecutableParser{cfg: cfg}
|
||||||
return generic.NewCataloger("dotnet-portable-executable-cataloger").
|
return generic.NewCataloger("dotnet-portable-executable-cataloger").
|
||||||
WithParserByGlobs(parseDotnetPortableExecutable, "**/*.dll", "**/*.exe")
|
WithParserByGlobs(p.parseDotnetPortableExecutable, "**/*.dll", "**/*.exe")
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDotnetPackagesLockCataloger() pkg.Cataloger {
|
func NewDotnetPackagesLockCataloger() pkg.Cataloger {
|
||||||
|
|||||||
@ -25,7 +25,7 @@ func TestCataloger_Globs(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "obtain portable executable files",
|
name: "obtain portable executable files",
|
||||||
fixture: "test-fixtures/glob-paths",
|
fixture: "test-fixtures/glob-paths",
|
||||||
cataloger: NewDotnetPortableExecutableCataloger(),
|
cataloger: NewDotnetPortableExecutableCataloger(DefaultCatalogerConfig()),
|
||||||
expected: []string{
|
expected: []string{
|
||||||
"src/something.dll",
|
"src/something.dll",
|
||||||
"src/something.exe",
|
"src/something.exe",
|
||||||
|
|||||||
14
syft/pkg/cataloger/dotnet/config.go
Normal file
14
syft/pkg/cataloger/dotnet/config.go
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package dotnet
|
||||||
|
|
||||||
|
type CatalogerConfig struct {
|
||||||
|
EnableCertificateValidation bool `json:"enable-certificate-validation" yaml:"enable-certificate-validation" mapstructure:"enable-certificate-validation"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c CatalogerConfig) WithCertificateValidation(enable bool) CatalogerConfig {
|
||||||
|
c.EnableCertificateValidation = enable
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func DefaultCatalogerConfig() CatalogerConfig {
|
||||||
|
return CatalogerConfig{}
|
||||||
|
}
|
||||||
@ -18,15 +18,17 @@ import (
|
|||||||
"github.com/anchore/syft/syft/pkg/cataloger/generic"
|
"github.com/anchore/syft/syft/pkg/cataloger/generic"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ generic.Parser = parseDotnetPortableExecutable
|
type dotnetPortableExecutableParser struct {
|
||||||
|
cfg CatalogerConfig
|
||||||
|
}
|
||||||
|
|
||||||
func parseDotnetPortableExecutable(_ context.Context, _ file.Resolver, _ *generic.Environment, f file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) {
|
func (p dotnetPortableExecutableParser) parseDotnetPortableExecutable(_ context.Context, _ file.Resolver, _ *generic.Environment, f file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) {
|
||||||
by, err := io.ReadAll(f)
|
by, err := io.ReadAll(f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, fmt.Errorf("unable to read file: %w", err)
|
return nil, nil, fmt.Errorf("unable to read file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
peFile, err := pe.NewBytes(by, &pe.Options{})
|
peFile, err := pe.NewBytes(by, &pe.Options{DisableCertValidation: !p.cfg.EnableCertificateValidation})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Tracef("unable to create PE instance for file '%s': %v", f.RealPath, err)
|
log.Tracef("unable to create PE instance for file '%s': %v", f.RealPath, err)
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
|
|||||||
@ -298,10 +298,13 @@ func TestParseDotnetPortableExecutable(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Test_corruptDotnetPE(t *testing.T) {
|
func Test_corruptDotnetPE(t *testing.T) {
|
||||||
|
p := dotnetPortableExecutableParser{
|
||||||
|
cfg: DefaultCatalogerConfig(),
|
||||||
|
}
|
||||||
pkgtest.NewCatalogTester().
|
pkgtest.NewCatalogTester().
|
||||||
FromFile(t, "test-fixtures/glob-paths/src/something.exe").
|
FromFile(t, "test-fixtures/glob-paths/src/something.exe").
|
||||||
WithError().
|
WithError().
|
||||||
TestParser(t, parseDotnetPortableExecutable)
|
TestParser(t, p.parseDotnetPortableExecutable)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_extractVersion(t *testing.T) {
|
func Test_extractVersion(t *testing.T) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user