diff --git a/syft/pkg/cataloger/binary/cataloger_test.go b/syft/pkg/cataloger/binary/cataloger_test.go index bf32d182829..e7aa36cd8e3 100644 --- a/syft/pkg/cataloger/binary/cataloger_test.go +++ b/syft/pkg/cataloger/binary/cataloger_test.go @@ -715,6 +715,18 @@ func Test_Cataloger_DefaultClassifiers_PositiveCases(t *testing.T) { Metadata: metadata("consul-binary"), }, }, + { + name: "positive-erlang-25.3.2.7", + fixtureDir: "test-fixtures/classifiers/positive/erlang-25.3.2.7", + expected: pkg.Package{ + Name: "erlang", + Version: "25.3.2.7", + Type: "binary", + PURL: "pkg:generic/erlang@25.3.2.7", + Locations: locations("erlexec"), + Metadata: metadata("erlang-binary"), + }, + }, { name: "positive-nginx-1.25.1", fixtureDir: "test-fixtures/classifiers/positive/nginx-1.25.1", diff --git a/syft/pkg/cataloger/binary/default_classifiers.go b/syft/pkg/cataloger/binary/default_classifiers.go index 88e16454e53..fb6815bafa6 100644 --- a/syft/pkg/cataloger/binary/default_classifiers.go +++ b/syft/pkg/cataloger/binary/default_classifiers.go @@ -265,6 +265,17 @@ var defaultClassifiers = []classifier{ PURL: mustPURL("pkg:generic/ruby@version"), CPEs: singleCPE("cpe:2.3:a:ruby-lang:ruby:*:*:*:*:*:*:*:*"), }, + { + Class: "erlang-binary", + FileGlob: "**/erlexec", + EvidenceMatcher: fileContentsVersionMatcher( + // [NUL]/usr/local/src/otp-25.3.2.7/erts/ + `(?m)\\x00/usr/local/src/otp-(?P[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+?)/erts/`, + ), + Package: "erlang", + PURL: mustPURL("pkg:generic/erlang@version"), + CPEs: singleCPE("cpe:2.3:a:erlang:erlang\\/otp:*:*:*:*:*:*:*:*"), + }, { Class: "consul-binary", FileGlob: "**/consul", diff --git a/syft/pkg/cataloger/binary/test-fixtures/classifiers/positive/erlang-25.3.2.7/erlexec b/syft/pkg/cataloger/binary/test-fixtures/classifiers/positive/erlang-25.3.2.7/erlexec new file mode 100755 index 00000000000..9ad677967f9 Binary files /dev/null and b/syft/pkg/cataloger/binary/test-fixtures/classifiers/positive/erlang-25.3.2.7/erlexec differ