From patchwork Tue Oct 6 13:42:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gregory CLEMENT X-Patchwork-Id: 1377451 Return-Path: X-Original-To: incoming-buildroot@patchwork.ozlabs.org Delivered-To: patchwork-incoming-buildroot@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=busybox.net (client-ip=140.211.166.138; helo=whitealder.osuosl.org; envelope-from=buildroot-bounces@busybox.net; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=bootlin.com Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4C5JbY3PzFz9sTK for ; Wed, 7 Oct 2020 00:44:09 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 9CC948672E; Tue, 6 Oct 2020 13:44:07 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SeiSMqsH-sij; Tue, 6 Oct 2020 13:44:00 +0000 (UTC) Received: from ash.osuosl.org (ash.osuosl.org [140.211.166.34]) by whitealder.osuosl.org (Postfix) with ESMTP id 9AEB886687; Tue, 6 Oct 2020 13:43:58 +0000 (UTC) X-Original-To: buildroot@lists.busybox.net Delivered-To: buildroot@osuosl.org Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by ash.osuosl.org (Postfix) with ESMTP id 3C11A1BF97F for ; Tue, 6 Oct 2020 13:43:57 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 20465204E4 for ; Tue, 6 Oct 2020 13:43:57 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id hoorAqjvRYRz for ; Tue, 6 Oct 2020 13:43:47 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) by silver.osuosl.org (Postfix) with ESMTPS id CDF6E204D1 for ; Tue, 6 Oct 2020 13:43:37 +0000 (UTC) X-Originating-IP: 90.65.92.90 Received: from localhost (lfbn-lyo-1-1913-90.w90-65.abo.wanadoo.fr [90.65.92.90]) (Authenticated sender: gregory.clement@bootlin.com) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 552F36001B; Tue, 6 Oct 2020 13:43:35 +0000 (UTC) From: Gregory CLEMENT To: buildroot@buildroot.org Date: Tue, 6 Oct 2020 15:42:50 +0200 Message-Id: <20201006134250.22738-18-gregory.clement@bootlin.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201006134250.22738-1-gregory.clement@bootlin.com> References: <20201006134250.22738-1-gregory.clement@bootlin.com> MIME-Version: 1.0 Subject: [Buildroot] [PATCH 17/17] support/script/pkg-stats: Allow to use CPEID for managing CVEs X-BeenThere: buildroot@busybox.net X-Mailman-Version: 2.1.29 Precedence: list List-Id: Discussion and development of buildroot List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Matt Weber , Thomas Petazzoni Errors-To: buildroot-bounces@busybox.net Sender: "buildroot" Add CPEID information by retrieving it from the package. Also introduce a new argument --cpeid to use valid cpeid instead of buildroot name and version to check if a pacakge is affected by a CVEs. Signed-off-by: Gregory CLEMENT --- support/scripts/pkg-stats | 46 +++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/support/scripts/pkg-stats b/support/scripts/pkg-stats index 69edeedec0..e2e328847f 100755 --- a/support/scripts/pkg-stats +++ b/support/scripts/pkg-stats @@ -76,6 +76,7 @@ class Package: all_license_files = list() all_versions = dict() all_ignored_cves = dict() + all_cpeids = dict () # This is the list of all possible checks. Add new checks to this list so # a tool that post-processeds the json output knows the checks before # iterating over the packages. @@ -96,6 +97,7 @@ class Package: self.current_version = None self.url = None self.url_worker = None + self.cpeid = '' self.cves = list() self.cves_to_check = list() self.latest_version = {'status': RM_API_STATUS_ERROR, 'version': None, 'id': None} @@ -211,6 +213,14 @@ class Package: if var in self.all_versions: self.current_version = self.all_versions[var] + def set_cpeid(self): + """ + Fills in the .cpeid field + """ + var = self.pkgvar() + if var in self.all_cpeids: + self.cpeid = self.all_cpeids[var] + def set_check_package_warnings(self): """ Fills in the .warnings and .status['pkg-check'] fields @@ -334,7 +344,7 @@ def get_pkglist(npackages, package_list): def package_init_make_info(): # Fetch all variables at once variables = subprocess.check_output(["make", "BR2_HAVE_DOT_CONFIG=y", "-s", "printvars", - "VARS=%_LICENSE %_LICENSE_FILES %_VERSION %_IGNORE_CVES"]) + "VARS=%_LICENSE %_LICENSE_FILES %_VERSION %_IGNORE_CVES %_CPE_ID"]) variable_list = variables.decode().splitlines() # We process first the host package VERSION, and then the target @@ -372,6 +382,9 @@ def package_init_make_info(): pkgvar = pkgvar[:-12] Package.all_ignored_cves[pkgvar] = value.split() + elif pkgvar.endswith("_CPE_ID"): + pkgvar = pkgvar[:-7] + Package.all_cpeids[pkgvar] = value check_url_count = 0 @@ -528,7 +541,7 @@ async def check_package_latest_version(packages): await asyncio.wait(tasks) -def check_package_cves(nvd_path, packages): +def check_package_cves(nvd_path, packages, use_cpeid): if not os.path.isdir(nvd_path): os.makedirs(nvd_path) @@ -536,7 +549,11 @@ def check_package_cves(nvd_path, packages): for pkg_name in cve.pkg_names: if pkg_name in packages: pkg = packages[pkg_name] - affected = cve.affects(pkg.name, pkg.current_version, pkg.ignored_cves) + print("check_package", pkg.cpeid) + if use_cpeid: + affected = cve.affects_cpeid(pkg.cpeid, pkg.ignored_cves) + else: + affected = cve.affects(pkg.name, pkg.current_version, pkg.ignored_cves) if affected == cve.CVE_UNKNOWN: pkg.cves_to_check.append(cve.identifier) if affected == cve.CVE_AFFECTS: @@ -818,6 +835,16 @@ def dump_html_pkg(f, pkg): f.write(" %s
\n" % (cve, cve)) f.write(" \n") + # CPEID valid + td_class = ["left"] + if len(pkg.cpeid) != 0: + td_class.append("correct") + else: + td_class.append("wrong") + f.write(" \n" % " ".join(td_class)) + f.write(" %s\n" % pkg.cpeid) + f.write(" \n") + f.write(" \n") @@ -837,6 +864,7 @@ def dump_html_all_pkgs(f, packages): Upstream URL CVEs CVEs to check +CPEID valid """) for pkg in sorted(packages): @@ -955,11 +983,17 @@ def parse_args(): help='List of packages (comma separated)') parser.add_argument('--nvd-path', dest='nvd_path', help='Path to the local NVD database', type=resolvepath) + parser.add_argument("--cpeid", action='store_true') args = parser.parse_args() if not args.html and not args.json: parser.error('at least one of --html or --json (or both) is required') return args +def cpeid_name(pkg): + try: + return pkg.cpeid.split(':')[1] + except: + return '' def __main__(): args = parse_args() @@ -988,6 +1022,7 @@ def __main__(): pkg.set_patch_count() pkg.set_check_package_warnings() pkg.set_current_version() + pkg.set_cpeid() pkg.set_url() pkg.set_developers(developers) print("Checking URL status") @@ -998,7 +1033,10 @@ def __main__(): loop.run_until_complete(check_package_latest_version(packages)) if args.nvd_path: print("Checking packages CVEs") - check_package_cves(args.nvd_path, {p.name: p for p in packages}) + if args.cpeid: + check_package_cves(args.nvd_path, {cpeid_name(p): p for p in packages}, args.cpeid) + else: + check_package_cves(args.nvd_path, {p.name: p for p in packages}, args.cpeid) print("Calculate stats") stats = calculate_stats(packages) if args.html: