|
| 1 | +# for vulns, e.g. CVE-2014-0114, that have > 100 headers assoc with them |
| 2 | +import http.client |
| 3 | +http.client._MAXHEADERS = 1000 |
| 4 | + |
| 5 | +from blackduck import Client |
| 6 | + |
| 7 | +import argparse |
| 8 | + |
| 9 | +import logging |
| 10 | +from pprint import pprint |
| 11 | + |
| 12 | +logging.basicConfig( |
| 13 | + level=logging.DEBUG, |
| 14 | + format="[%(asctime)s] {%(module)s:%(lineno)d} %(levelname)s - %(message)s" |
| 15 | +) |
| 16 | + |
| 17 | +parser = argparse.ArgumentParser("Get a specific component and list its vulnerabilities") |
| 18 | +parser.add_argument("--base-url", required=True, help="Hub server URL e.g. https://your.blackduck.url") |
| 19 | +parser.add_argument("--token-file", dest='token_file', required=True, help="containing access token") |
| 20 | +parser.add_argument("--project", dest='project_name', required=True, help="Project that contains the BOM components") |
| 21 | +parser.add_argument("--version", dest='version_name', required=True, help="Version that contains the BOM components") |
| 22 | +parser.add_argument("--no-verify", dest='verify', action='store_false', help="disable TLS certificate verification") |
| 23 | +args = parser.parse_args() |
| 24 | + |
| 25 | +with open(args.token_file, 'r') as tf: |
| 26 | + access_token = tf.readline().strip() |
| 27 | + |
| 28 | +bd = Client(base_url=args.base_url, token=access_token, verify=args.verify) |
| 29 | + |
| 30 | +params = { |
| 31 | + 'q': [f"name:{args.project_name}"] |
| 32 | +} |
| 33 | +projects = [p for p in bd.get_resource('projects', params=params) if p['name'] == args.project_name] |
| 34 | +assert len(projects) == 1, f"There should be one, and only one project named {args.project_name}. We found {len(projects)}" |
| 35 | +project = projects[0] |
| 36 | + |
| 37 | +params = { |
| 38 | + 'q': [f"versionName:{args.version_name}"] |
| 39 | +} |
| 40 | +versions = [v for v in bd.get_resource('versions', project, params=params) if v['versionName'] == args.version_name] |
| 41 | +assert len(versions) == 1, f"There should be one, and only one version named {args.version_name}. We found {len(versions)}" |
| 42 | +version = versions[0] |
| 43 | + |
| 44 | +logging.debug(f"Found {project['name']}:{version['versionName']}") |
| 45 | + |
| 46 | +all_bom_component_vulns = [] |
| 47 | + |
| 48 | +for bom_component_vuln in bd.get_resource('vulnerable-components', version): |
| 49 | + vuln_name = bom_component_vuln['vulnerabilityWithRemediation']['vulnerabilityName'] |
| 50 | + vuln_source = bom_component_vuln['vulnerabilityWithRemediation']['source'] |
| 51 | + upgrade_guidance = bd.get_json(f"{bom_component_vuln['componentVersion']}/upgrade-guidance") |
| 52 | + bom_component_vuln['upgrade_guidance'] = upgrade_guidance |
| 53 | + |
| 54 | + vuln_details = bd.get_json(f"/api/vulnerabilities/{vuln_name}") |
| 55 | + |
| 56 | + pprint(bd.list_resources(vuln_details)) |
| 57 | + if 'related-vulnerability' in bd.list_resources(vuln_details): |
| 58 | + related_vuln = bd.get_resource("related-vulnerability", vuln_details, items=False) |
| 59 | + else: |
| 60 | + related_vuln = None |
| 61 | + bom_component_vuln['related_vulnerability'] = related_vuln |
| 62 | + all_bom_component_vulns.append(bom_component_vuln) |
| 63 | + |
| 64 | +pprint(all_bom_component_vulns) |
0 commit comments