diff --git a/syft/pkg/cataloger/binary/classifier_cataloger_test.go b/syft/pkg/cataloger/binary/classifier_cataloger_test.go index 4cbd2f6f3..d8d3567ff 100644 --- a/syft/pkg/cataloger/binary/classifier_cataloger_test.go +++ b/syft/pkg/cataloger/binary/classifier_cataloger_test.go @@ -2613,6 +2613,39 @@ func Test_Cataloger_PositiveCases(t *testing.T) { Metadata: metadata("ingress-nginx-binary"), }, }, + { + logicalFixture: "nginx-ingress-controller/1.9.6/linux-arm64", + expected: pkg.Package{ + Name: "nginx-ingress-controller", + Version: "1.9.6", + Type: "binary", + PURL: "pkg:generic/nginx-ingress-controller@1.9.6", + Locations: locations("nginx-ingress-controller"), + Metadata: metadata("ingress-nginx-binary"), + }, + }, + { + logicalFixture: "nginx-ingress-controller/1.9.6/linux-arm", + expected: pkg.Package{ + Name: "nginx-ingress-controller", + Version: "1.9.6", + Type: "binary", + PURL: "pkg:generic/nginx-ingress-controller@1.9.6", + Locations: locations("nginx-ingress-controller"), + Metadata: metadata("ingress-nginx-binary"), + }, + }, + { + logicalFixture: "nginx-ingress-controller/1.9.6/linux-s390x", + expected: pkg.Package{ + Name: "nginx-ingress-controller", + Version: "1.9.6", + Type: "binary", + PURL: "pkg:generic/nginx-ingress-controller@1.9.6", + Locations: locations("nginx-ingress-controller"), + Metadata: metadata("ingress-nginx-binary"), + }, + }, { logicalFixture: "nginx-ingress-controller/1.7.1/linux-amd64", expected: pkg.Package{ diff --git a/syft/pkg/cataloger/binary/classifiers.go b/syft/pkg/cataloger/binary/classifiers.go index afd4c7536..78f6e18ed 100644 --- a/syft/pkg/cataloger/binary/classifiers.go +++ b/syft/pkg/cataloger/binary/classifiers.go @@ -1153,6 +1153,11 @@ func DefaultClassifiers() []binutils.Classifier { Class: "ingress-nginx-binary", FileGlob: "**/nginx-ingress-controller", EvidenceMatcher: binutils.MatchAny( + // the release is injected with -ldflags -X, which lands it in its own NUL-padded data symbol. + // the surrounding bytes are an arch-specific float constant pool, so only the padding is portable. + // e.g. v1.9.6[NUL][NUL] on each of linux/amd64, linux/arm, linux/arm64, and linux/s390x + // note: one trailing NUL is not enough -- on s390x that matches a vendored "v1.19.0" earlier in the file + m.FileContentsVersionMatcher(`v(?P[0-9]+\.[0-9]+\.[0-9]+(\-(alpha|beta)\.[0-9]+)?)\x00\x00`), // [NUL][NUL]v1.15.1[NUL][NUL]@e[ETX][NUL][NUL][NUL][NUL]go1.26.1[NUL][NUL][NUL] // �v1.15.1[NUL][NUL]�z[ETX][NUL][NUL][NUL][NUL]go1.24.4[NUL][NUL][NUL] m.FileContentsVersionMatcher(`v(?P[0-9]+\.[0-9]+\.[0-9]+)\x00+.{0,50}go[0-9]+\.[0-9]+(\-(alpha|beta)\.[0-9])?\.[0-9]+\x00+`), diff --git a/syft/pkg/cataloger/binary/internal/manager/internal/cli/commands/write_snippet.go b/syft/pkg/cataloger/binary/internal/manager/internal/cli/commands/write_snippet.go index 46f42b383..5d5f31725 100644 --- a/syft/pkg/cataloger/binary/internal/manager/internal/cli/commands/write_snippet.go +++ b/syft/pkg/cataloger/binary/internal/manager/internal/cli/commands/write_snippet.go @@ -215,6 +215,14 @@ func getPlatformElf(f *os.File) string { arch = amd64 case elf.EM_AARCH64: arch = arm64 + case elf.EM_ARM: + arch = "arm" + case elf.EM_S390: + arch = "s390x" + case elf.EM_386: + arch = "386" + case elf.EM_RISCV: + arch = "riscv64" // TODO... default: arch = fmt.Sprintf("unknown-%x", elfFile.Machine) diff --git a/syft/pkg/cataloger/binary/testdata/classifiers/snippets/helm/3.12.0/linux-unknown-454d5f53333930/helm b/syft/pkg/cataloger/binary/testdata/classifiers/snippets/helm/3.12.0/linux-s390x/helm similarity index 100% rename from syft/pkg/cataloger/binary/testdata/classifiers/snippets/helm/3.12.0/linux-unknown-454d5f53333930/helm rename to syft/pkg/cataloger/binary/testdata/classifiers/snippets/helm/3.12.0/linux-s390x/helm diff --git a/syft/pkg/cataloger/binary/testdata/classifiers/snippets/helm/4.1.4/linux-unknown-454d5f53333930/helm b/syft/pkg/cataloger/binary/testdata/classifiers/snippets/helm/4.1.4/linux-s390x/helm similarity index 100% rename from syft/pkg/cataloger/binary/testdata/classifiers/snippets/helm/4.1.4/linux-unknown-454d5f53333930/helm rename to syft/pkg/cataloger/binary/testdata/classifiers/snippets/helm/4.1.4/linux-s390x/helm diff --git a/syft/pkg/cataloger/binary/testdata/classifiers/snippets/nginx-ingress-controller/1.9.6/linux-arm/nginx-ingress-controller b/syft/pkg/cataloger/binary/testdata/classifiers/snippets/nginx-ingress-controller/1.9.6/linux-arm/nginx-ingress-controller new file mode 100644 index 000000000..748c0bd01 Binary files /dev/null and b/syft/pkg/cataloger/binary/testdata/classifiers/snippets/nginx-ingress-controller/1.9.6/linux-arm/nginx-ingress-controller differ diff --git a/syft/pkg/cataloger/binary/testdata/classifiers/snippets/nginx-ingress-controller/1.9.6/linux-arm64/nginx-ingress-controller b/syft/pkg/cataloger/binary/testdata/classifiers/snippets/nginx-ingress-controller/1.9.6/linux-arm64/nginx-ingress-controller new file mode 100644 index 000000000..a81783312 Binary files /dev/null and b/syft/pkg/cataloger/binary/testdata/classifiers/snippets/nginx-ingress-controller/1.9.6/linux-arm64/nginx-ingress-controller differ diff --git a/syft/pkg/cataloger/binary/testdata/classifiers/snippets/nginx-ingress-controller/1.9.6/linux-s390x/nginx-ingress-controller b/syft/pkg/cataloger/binary/testdata/classifiers/snippets/nginx-ingress-controller/1.9.6/linux-s390x/nginx-ingress-controller new file mode 100644 index 000000000..3b903582c Binary files /dev/null and b/syft/pkg/cataloger/binary/testdata/classifiers/snippets/nginx-ingress-controller/1.9.6/linux-s390x/nginx-ingress-controller differ diff --git a/syft/pkg/cataloger/binary/testdata/classifiers/snippets/redis-server/7.2.5/linux-unknown-454d5f333836/redis-server b/syft/pkg/cataloger/binary/testdata/classifiers/snippets/redis-server/7.2.5/linux-386/redis-server similarity index 100% rename from syft/pkg/cataloger/binary/testdata/classifiers/snippets/redis-server/7.2.5/linux-unknown-454d5f333836/redis-server rename to syft/pkg/cataloger/binary/testdata/classifiers/snippets/redis-server/7.2.5/linux-386/redis-server diff --git a/syft/pkg/cataloger/binary/testdata/config.yaml b/syft/pkg/cataloger/binary/testdata/config.yaml index 9e6197353..37ed85815 100644 --- a/syft/pkg/cataloger/binary/testdata/config.yaml +++ b/syft/pkg/cataloger/binary/testdata/config.yaml @@ -1570,8 +1570,16 @@ from-images: - version: 1.9.6 images: - - ref: registry.k8s.io/ingress-nginx/controller:v1.9.6@sha256:1405cc613bd95b2c6edd8b2a152510ae91c7e62aea4698500d23b2145960ab9c + # note: per-platform manifest digests (not the index digest) -- the extraction step creates a + # container from the ref alone, so each platform needs its own uniquely addressable ref + - ref: registry.k8s.io/ingress-nginx/controller:v1.9.6@sha256:0939639a1f338a9eaaa490fd38b4a7881e47a7fd1a473baf8749ce15952b55b8 platform: linux/amd64 + - ref: registry.k8s.io/ingress-nginx/controller:v1.9.6@sha256:5fb823cc617cbfbee4b250ad5e059c23078ea63e9a7e6acb6d4d30e4456eb0be + platform: linux/arm64 + - ref: registry.k8s.io/ingress-nginx/controller:v1.9.6@sha256:dcea8d021e15cf27f59249ee0cfd211559ef9eb60b10651c3af299499848cf8b + platform: linux/arm + - ref: registry.k8s.io/ingress-nginx/controller:v1.9.6@sha256:fc53a604eb2d17fa0cf7a3f266d052c2f32fb97209869057d6826d1815cf622d + platform: linux/s390x paths: - /nginx-ingress-controller