mirror of
https://git.yoctoproject.org/poky
synced 2026-04-14 17:02:22 +02:00
cve-check: Fix false negative version issue
NVD DB store version and update in the same value, separated by '_'. The proposed patch check if the version from NVD DB contains a "_", ie 9.2.0_p1 is convert to 9.2.0p1 before version comparison. [YOCTO #14127] Reviewed-by: Yoann CONGAL <yoann.congal@smile.fr> (From OE-Core rev: 7d00f6ec578084a0a0e5caf36241d53036d996c4) Signed-off-by: Geoffrey GIRY <geoffrey.giry@smile.fr> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
e8693364c5
commit
81740facf4
@@ -260,7 +260,7 @@ def check_cves(d, patched_cves):
|
||||
"""
|
||||
Connect to the NVD database and find unpatched cves.
|
||||
"""
|
||||
from oe.cve_check import Version
|
||||
from oe.cve_check import Version, convert_cve_version
|
||||
|
||||
pn = d.getVar("PN")
|
||||
real_pv = d.getVar("PV")
|
||||
@@ -324,6 +324,9 @@ def check_cves(d, patched_cves):
|
||||
if cve in cve_ignore:
|
||||
ignored = True
|
||||
|
||||
version_start = convert_cve_version(version_start)
|
||||
version_end = convert_cve_version(version_end)
|
||||
|
||||
if (operator_start == '=' and pv == version_start) or version_start == '-':
|
||||
vulnerable = True
|
||||
else:
|
||||
|
||||
@@ -179,3 +179,42 @@ def update_symlinks(target_path, link_path):
|
||||
if os.path.exists(os.path.realpath(link_path)):
|
||||
os.remove(link_path)
|
||||
os.symlink(os.path.basename(target_path), link_path)
|
||||
|
||||
|
||||
def convert_cve_version(version):
|
||||
"""
|
||||
This function converts from CVE format to Yocto version format.
|
||||
eg 8.3_p1 -> 8.3p1, 6.2_rc1 -> 6.2-rc1
|
||||
|
||||
Unless it is redefined using CVE_VERSION in the recipe,
|
||||
cve_check uses the version in the name of the recipe (${PV})
|
||||
to check vulnerabilities against a CVE in the database downloaded from NVD.
|
||||
|
||||
When the version has an update, i.e.
|
||||
"p1" in OpenSSH 8.3p1,
|
||||
"-rc1" in linux kernel 6.2-rc1,
|
||||
the database stores the version as version_update (8.3_p1, 6.2_rc1).
|
||||
Therefore, we must transform this version before comparing to the
|
||||
recipe version.
|
||||
|
||||
In this case, the parameter of the function is 8.3_p1.
|
||||
If the version uses the Release Candidate format, "rc",
|
||||
this function replaces the '_' by '-'.
|
||||
If the version uses the Update format, "p",
|
||||
this function removes the '_' completely.
|
||||
"""
|
||||
import re
|
||||
|
||||
matches = re.match('^([0-9.]+)_((p|rc)[0-9]+)$', version)
|
||||
|
||||
if not matches:
|
||||
return version
|
||||
|
||||
version = matches.group(1)
|
||||
update = matches.group(2)
|
||||
|
||||
if matches.group(3) == "rc":
|
||||
return version + '-' + update
|
||||
|
||||
return version + update
|
||||
|
||||
|
||||
@@ -54,6 +54,25 @@ class CVECheck(OESelftestTestCase):
|
||||
self.assertTrue( result ,msg="Failed to compare version with suffix '1.0_patch2' < '1.0_patch3'")
|
||||
|
||||
|
||||
def test_convert_cve_version(self):
|
||||
from oe.cve_check import convert_cve_version
|
||||
|
||||
# Default format
|
||||
self.assertEqual(convert_cve_version("8.3"), "8.3")
|
||||
self.assertEqual(convert_cve_version(""), "")
|
||||
|
||||
# OpenSSL format version
|
||||
self.assertEqual(convert_cve_version("1.1.1t"), "1.1.1t")
|
||||
|
||||
# OpenSSH format
|
||||
self.assertEqual(convert_cve_version("8.3_p1"), "8.3p1")
|
||||
self.assertEqual(convert_cve_version("8.3_p22"), "8.3p22")
|
||||
|
||||
# Linux kernel format
|
||||
self.assertEqual(convert_cve_version("6.2_rc8"), "6.2-rc8")
|
||||
self.assertEqual(convert_cve_version("6.2_rc31"), "6.2-rc31")
|
||||
|
||||
|
||||
def test_recipe_report_json(self):
|
||||
config = """
|
||||
INHERIT += "cve-check"
|
||||
|
||||
Reference in New Issue
Block a user