From 1cb692cb3a88dadeedf88fbf5c303826917a77fb Mon Sep 17 00:00:00 2001 From: Fabrice Fontaine Date: Mon, 9 Sep 2024 23:48:28 +0200 Subject: [PATCH] feat(checker): add mp4v2 checker (#4380) windows_fixup must be moved to util.py to reuse this function in test_condensed_downloads.py Signed-off-by: Fabrice Fontaine --- cve_bin_tool/checkers/__init__.py | 1 + cve_bin_tool/checkers/mp4v2.py | 26 ++++++++++++++++++ cve_bin_tool/util.py | 5 ++++ ...bmp4v2-1_2.1.3-2-aarch64.pkg.tar.xz.tar.gz | Bin 0 -> 43645 bytes test/test_condensed_downloads.py | 5 +++- test/test_data/mp4v2.py | 19 +++++++++++++ test/test_scanner.py | 9 ++---- 7 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 cve_bin_tool/checkers/mp4v2.py create mode 100644 test/condensed-downloads/libmp4v2-1_2.1.3-2-aarch64.pkg.tar.xz.tar.gz create mode 100644 test/test_data/mp4v2.py diff --git a/cve_bin_tool/checkers/__init__.py b/cve_bin_tool/checkers/__init__.py index 285ea99c02..54713aa239 100644 --- a/cve_bin_tool/checkers/__init__.py +++ b/cve_bin_tool/checkers/__init__.py @@ -238,6 +238,7 @@ "monit", "mosquitto", "motion", + "mp4v2", "mpg123", "mpv", "msmtp", diff --git a/cve_bin_tool/checkers/mp4v2.py b/cve_bin_tool/checkers/mp4v2.py new file mode 100644 index 0000000000..c2210f8a4a --- /dev/null +++ b/cve_bin_tool/checkers/mp4v2.py @@ -0,0 +1,26 @@ +# Copyright (C) 2024 Orange +# SPDX-License-Identifier: GPL-3.0-or-later + + +""" +CVE checker for mp4v2 + +https://www.cvedetails.com/product/48319/Techsmith-Mp4v2.html?vendor_id=9035 +https://www.cvedetails.com/product/44070/Mp4v2-Project-Mp4v2.html?vendor_id=17731 +https://www.cvedetails.com/product/142097/Mp4v2-Mp4v2.html?vendor_id=30832 + +""" +from __future__ import annotations + +from cve_bin_tool.checkers import Checker + + +class Mp4V2Checker(Checker): + CONTAINS_PATTERNS: list[str] = [] + FILENAME_PATTERNS: list[str] = [] + VERSION_PATTERNS = [r"MP4v2\r?\nversion:\r?\n([0-9]+\.[0-9]+\.[0-9]+)"] + VENDOR_PRODUCT = [ + ("mp4v2", "mp4v2"), + ("mp4v2_project", "mp4v2"), + ("techsmith", "mp4v2"), + ] diff --git a/cve_bin_tool/util.py b/cve_bin_tool/util.py index b7b49ba7f1..1c25b273ae 100644 --- a/cve_bin_tool/util.py +++ b/cve_bin_tool/util.py @@ -609,3 +609,8 @@ def decode_cpe22(cpe22) -> list: vendor, product, version = cpe[2], cpe[3], cpe[4] # Return available data, convert empty fields to None return [vendor or None, product or None, version or None] + + +def windows_fixup(filename): + """Replace colon and backslash in filename to avoid a failure on Windows""" + return filename.replace(":", "_").replace("\\", "_") diff --git a/test/condensed-downloads/libmp4v2-1_2.1.3-2-aarch64.pkg.tar.xz.tar.gz b/test/condensed-downloads/libmp4v2-1_2.1.3-2-aarch64.pkg.tar.xz.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..15032fbdcb8521f347642051b0cafeceb32c64f8 GIT binary patch literal 43645 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 literal 0 HcmV?d00001 diff --git a/test/test_condensed_downloads.py b/test/test_condensed_downloads.py index 2c5b96b6f6..211d2132dd 100644 --- a/test/test_condensed_downloads.py +++ b/test/test_condensed_downloads.py @@ -8,6 +8,7 @@ import subprocess from cve_bin_tool.checkers import __all__ as all_test_name +from cve_bin_tool.util import windows_fixup # Test to check condensed files are committed according to the package test data of checkers @@ -21,7 +22,9 @@ def test_condensed_downloads(): for package_test_data in package_test_data_list: for package_data in package_test_data: package_names.append( - "test/condensed-downloads/" + package_data["package_name"] + ".tar.gz" + "test/condensed-downloads/" + + windows_fixup(package_data["package_name"]) + + ".tar.gz" ) condensed_downloads = subprocess.run( diff --git a/test/test_data/mp4v2.py b/test/test_data/mp4v2.py new file mode 100644 index 0000000000..34355e5ccc --- /dev/null +++ b/test/test_data/mp4v2.py @@ -0,0 +1,19 @@ +# Copyright (C) 2024 Orange +# SPDX-License-Identifier: GPL-3.0-or-later + +mapping_test_data = [ + { + "product": "mp4v2", + "version": "4.1.2", + "version_strings": ["MP4v2\nversion:\n4.1.2"], + } +] +package_test_data = [ + { + "url": "https://eu.mirror.archlinuxarm.org/aarch64/extra/", + "package_name": "libmp4v2-1:2.1.3-2-aarch64.pkg.tar.xz", + "product": "mp4v2", + "version": "2.1.3", + "other_products": ["gcc"], + }, +] diff --git a/test/test_scanner.py b/test/test_scanner.py index f55a06bb4f..fa5ee09a32 100644 --- a/test/test_scanner.py +++ b/test/test_scanner.py @@ -25,6 +25,7 @@ from cve_bin_tool.checkers import __all__ as all_test_name from cve_bin_tool.cvedb import CVEDB +from cve_bin_tool.util import windows_fixup from cve_bin_tool.version_scanner import VersionScanner # load test data @@ -83,10 +84,6 @@ def teardown_class(cls): shutil.rmtree(cls.package_test_dir) shutil.rmtree(cls.mapping_test_dir) - def windows_fixup(self, filename): - """Replace colon and backslash in filename to avoid a failure on Windows""" - return filename.replace(":", "_").replace("\\", "_") - def test_false_positive(self): self.scanner.all_cves = [] with tempfile.NamedTemporaryFile( @@ -154,7 +151,7 @@ def test_version_mapping(self, product, version, version_strings): for filename in filenames: with tempfile.NamedTemporaryFile( "w+b", - suffix=self.windows_fixup(filename), + suffix=windows_fixup(filename), dir=self.mapping_test_dir, delete=False, ) as f: @@ -237,7 +234,7 @@ def condensed_filepath(self, url, package_name): dirpath.mkdir() # Check if we've already made a condensed version of the file, if we # have, we're done. - condensed_path = condensed_dir / (self.windows_fixup(package_name) + ".tar.gz") + condensed_path = condensed_dir / (windows_fixup(package_name) + ".tar.gz") if condensed_path.is_file(): return str(condensed_path) # Download the file if we don't have a condensed version of it and we