Skip to content

Commit a771632

Browse files
Revert "Backporting #3963 (#3986)" (#3987)
This reverts commit 87a13c7.
1 parent 87a13c7 commit a771632

File tree

5 files changed

+59
-113
lines changed

5 files changed

+59
-113
lines changed

dojo/settings/settings.dist.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,6 @@ def generate_url(scheme, double_slashes, user, password, host, port, path, param
863863
'Trivy Scan': DEDUPE_ALGO_HASH_CODE,
864864
'HackerOne Cases': DEDUPE_ALGO_UNIQUE_ID_FROM_TOOL_OR_HASH_CODE,
865865
'Snyk Scan': DEDUPE_ALGO_HASH_CODE,
866-
'Safety Scan': DEDUPE_ALGO_UNIQUE_ID_FROM_TOOL,
867866
}
868867

869868
DUPE_DELETE_MAX_PER_RUN = env('DD_DUPE_DELETE_MAX_PER_RUN')

dojo/tools/safety/parser.py

Lines changed: 58 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -18,63 +18,73 @@ def get_label_for_scan_types(self, scan_type):
1818
def get_description_for_scan_types(self, scan_type):
1919
return "Safety scan (--json) output file can be imported in JSON format."
2020

21-
def get_safetydb(self):
22-
"""Grab Safety DB for CVE lookup"""
21+
def get_findings(self, json_output, test):
22+
23+
# Grab Safety DB for CVE lookup
2324
url = "https://raw.githubusercontent.com/pyupio/safety-db/master/data/insecure_full.json"
2425
try:
2526
response = urllib.request.urlopen(url)
26-
return json.load(response)
27+
safety_db = json.loads(response.read().decode('utf-8'))
2728
except urllib.error.URLError as e:
2829
logger.warn("Error Message: %s", e)
2930
logger.warn("Could not resolve %s. Fallback is using the offline version from dojo/tools/safety/insecure_full.json.", url)
30-
with open("dojo/tools/safety/insecure_full.json", "r") as insecure_full:
31-
return json.load(insecure_full)
31+
with open("dojo/tools/safety/insecure_full.json", "r") as f:
32+
safety_db = json.load(f)
33+
f.close()
3234

33-
def get_findings(self, json_output, test):
34-
safety_db = self.get_safetydb()
35+
tree = self.parse_json(json_output)
36+
return self.get_items(tree, test, safety_db)
3537

36-
tree = json.load(json_output)
38+
def parse_json(self, json_output):
39+
data = json_output.read() or '[]'
40+
try:
41+
json_obj = json.loads(str(data, 'utf-8'))
42+
except:
43+
json_obj = json.loads(data)
44+
tree = {l[4]: {'package': str(l[0]),
45+
'affected': str(l[1]),
46+
'installed': str(l[2]),
47+
'description': str(l[3]),
48+
'id': str(l[4])}
49+
for l in json_obj} # noqa: E741
50+
return tree
3751

52+
def get_items(self, tree, test, safety_db):
3853
items = {}
39-
for node in tree:
40-
item_node = {
41-
'package': str(node[0]),
42-
'affected': str(node[1]),
43-
'installed': str(node[2]),
44-
'description': str(node[3]),
45-
'id': str(node[4])
46-
}
47-
severity = 'Medium' # Because Safety doesn't include severity rating
48-
cve = None
49-
for a in safety_db[item_node['package']]:
50-
if a['id'] == 'pyup.io-' + item_node['id']:
51-
if a['cve']:
52-
cve = a['cve']
53-
title = item_node['package'] + " (" + item_node['affected'] + ")"
54-
55-
finding = Finding(title=title + " | " + cve if cve else title,
56-
test=test,
57-
severity=severity,
58-
description="**Description:** " + item_node['description'] +
59-
"\n**Vulnerable Package:** " + item_node['package'] +
60-
"\n**Installed Version:** " + item_node['installed'] +
61-
"\n**Vulnerable Versions:** " + item_node['affected'] +
62-
"\n**CVE:** " + (cve or "N/A") +
63-
"\n**ID:** " + item_node['id'],
64-
cve=cve,
65-
cwe=1035, # Vulnerable Third Party Component
66-
mitigation="No mitigation provided",
67-
references="No reference provided",
68-
active=False,
69-
verified=False,
70-
false_p=False,
71-
duplicate=False,
72-
out_of_scope=False,
73-
mitigated=None,
74-
impact="No impact provided",
75-
component_name=item_node['package'],
76-
component_version=item_node['installed'],
77-
unique_id_from_tool=item_node['id'])
78-
items[finding.unique_id_from_tool] = finding
54+
55+
for key, node in tree.items():
56+
item = get_item(node, test, safety_db)
57+
items[key] = item
7958

8059
return list(items.values())
60+
61+
62+
def get_item(item_node, test, safety_db):
63+
severity = 'Info' # Because Safety doesn't include severity rating
64+
cve = ''.join(a['cve'] or ''
65+
for a in safety_db[item_node['package']]
66+
if a['id'] == 'pyup.io-' + item_node['id']) or None
67+
title = item_node['package'] + " (" + item_node['affected'] + ")"
68+
69+
finding = Finding(title=title + " | " + cve if cve else title,
70+
test=test,
71+
severity=severity,
72+
description=item_node['description'] +
73+
"\n Vulnerable Package: " + item_node['package'] +
74+
"\n Installed Version: " + item_node['installed'] +
75+
"\n Vulnerable Versions: " + item_node['affected'] +
76+
"\n CVE: " + (cve or "N/A") +
77+
"\n ID: " + item_node['id'],
78+
cve=cve,
79+
cwe=1035, # Vulnerable Third Party Component
80+
mitigation="No mitigation provided",
81+
references="No reference provided",
82+
active=False,
83+
verified=False,
84+
false_p=False,
85+
duplicate=False,
86+
out_of_scope=False,
87+
mitigated=None,
88+
impact="No impact provided")
89+
90+
return finding
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +0,0 @@
1-
[]

dojo/unittests/scans/safety/many_vulns.json

Lines changed: 0 additions & 47 deletions
This file was deleted.

dojo/unittests/tools/test_safety_parser.py

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,4 @@ def test_multiple_cves(self):
3131
parser = SafetyParser()
3232
findings = parser.get_findings(testfile, Test())
3333
self.assertEqual(1, len(findings))
34-
for finding in findings:
35-
if "37863" == finding.unique_id_from_tool:
36-
self.assertIsNone(finding.cve)
37-
38-
def test_multiple2(self):
39-
testfile = open("dojo/unittests/scans/safety/many_vulns.json")
40-
parser = SafetyParser()
41-
findings = parser.get_findings(testfile, Test())
42-
self.assertEqual(5, len(findings))
43-
for finding in findings:
44-
if "39608" == finding.unique_id_from_tool:
45-
self.assertEqual("httplib2", finding.component_name)
46-
self.assertEqual("0.18.1", finding.component_version)
47-
self.assertEqual("CVE-2021-21240", finding.cve)
48-
elif "39525" == finding.unique_id_from_tool:
49-
self.assertIsNone(finding.cve)
34+
self.assertEqual("CVE-2019-12385", findings[0].cve)

0 commit comments

Comments
 (0)