diff --git a/syft/pkg/cataloger/binary/classifier_cataloger_test.go b/syft/pkg/cataloger/binary/classifier_cataloger_test.go index 4f839da2d..cfcb0af51 100644 --- a/syft/pkg/cataloger/binary/classifier_cataloger_test.go +++ b/syft/pkg/cataloger/binary/classifier_cataloger_test.go @@ -1216,6 +1216,39 @@ func Test_Cataloger_PositiveCases(t *testing.T) { Metadata: metadata("openssl-binary"), }, }, + { + logicalFixture: "qt/4.8.7/linux-amd64", + expected: pkg.Package{ + Name: "qt", + Version: "4.8.7", + Type: "binary", + PURL: "pkg:generic/qt@4.8.7", + Locations: locations("libQtCore.so"), + Metadata: metadata("qt-binary-lib"), + }, + }, + { + logicalFixture: "qt/5.15.2/linux-amd64", + expected: pkg.Package{ + Name: "qt", + Version: "5.15.2", + Type: "binary", + PURL: "pkg:generic/qt@5.15.2", + Locations: locations("libQt5Core.so"), + Metadata: metadata("qt-binary-lib"), + }, + }, + { + logicalFixture: "qt/6.5.0/linux-amd64", + expected: pkg.Package{ + Name: "qt", + Version: "6.5.0", + Type: "binary", + PURL: "pkg:generic/qt@6.5.0", + Locations: locations("libQt6Core.so"), + Metadata: metadata("qt-binary-lib"), + }, + }, { logicalFixture: "gcc/12.3.0/linux-amd64", expected: pkg.Package{ diff --git a/syft/pkg/cataloger/binary/classifiers.go b/syft/pkg/cataloger/binary/classifiers.go index 99a8aafc1..705097424 100644 --- a/syft/pkg/cataloger/binary/classifiers.go +++ b/syft/pkg/cataloger/binary/classifiers.go @@ -513,6 +513,19 @@ func DefaultClassifiers() []binutils.Classifier { PURL: mustPURL("pkg:generic/openssl@version"), CPEs: singleCPE("cpe:2.3:a:openssl:openssl:*:*:*:*:*:*:*:*", cpe.NVDDictionaryLookupSource), }, + { + Class: "qt-binary-lib", + FileGlob: "**/libQt*Core.so*", + EvidenceMatcher: binutils.MatchAny( + // Qt 5.x and Qt 6.x pattern [NUL][NUL]Qt 6.5.0 (x86_64-little_endian-... + m.FileContentsVersionMatcher(`\x00\x00Qt (?P[0-9]+\.[0-9]+\.[0-9]+) \(`), + // Qt 4.x pattern QtCore lib ver 4.8.7 + m.FileContentsVersionMatcher(`QtCore library version (?P[0-9]+\.[0-9]+\.[0-9]+)`), + ), + Package: "qt", + PURL: mustPURL("pkg:generic/qt@version"), + CPEs: singleCPE("cpe:2.3:a:qt:qt:*:*:*:*:*:*:*:*", cpe.NVDDictionaryLookupSource), + }, { Class: "gcc-binary", FileGlob: "**/gcc", diff --git a/syft/pkg/cataloger/binary/test-fixtures/classifiers/snippets/qt/4.8.7/linux-amd64/libQtCore.so b/syft/pkg/cataloger/binary/test-fixtures/classifiers/snippets/qt/4.8.7/linux-amd64/libQtCore.so new file mode 100644 index 000000000..ca19cc27e Binary files /dev/null and b/syft/pkg/cataloger/binary/test-fixtures/classifiers/snippets/qt/4.8.7/linux-amd64/libQtCore.so differ diff --git a/syft/pkg/cataloger/binary/test-fixtures/classifiers/snippets/qt/5.15.2/linux-amd64/libQt5Core.so b/syft/pkg/cataloger/binary/test-fixtures/classifiers/snippets/qt/5.15.2/linux-amd64/libQt5Core.so new file mode 100644 index 000000000..06a4ab18b Binary files /dev/null and b/syft/pkg/cataloger/binary/test-fixtures/classifiers/snippets/qt/5.15.2/linux-amd64/libQt5Core.so differ diff --git a/syft/pkg/cataloger/binary/test-fixtures/classifiers/snippets/qt/6.5.0/linux-amd64/libQt6Core.so b/syft/pkg/cataloger/binary/test-fixtures/classifiers/snippets/qt/6.5.0/linux-amd64/libQt6Core.so new file mode 100644 index 000000000..cc70364dc Binary files /dev/null and b/syft/pkg/cataloger/binary/test-fixtures/classifiers/snippets/qt/6.5.0/linux-amd64/libQt6Core.so differ