Skip to content

Commit 9fe5864

Browse files
authored
Merge pull request #259 from sbs2001/custom_vuln_ids
Handle vulnerabilities which don't have any vulnerability ids
2 parents 4933778 + e48fa44 commit 9fe5864

57 files changed

Lines changed: 501 additions & 387 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,4 @@ zipp==0.6.0
5555
requests==2.23.0
5656
toml==0.10.2
5757
PyYAML==5.3.1
58+
freezegun==1.1.0

vulnerabilities/api.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ class Meta:
6363

6464

6565
class HyperLinkedVulnerabilitySerializer(serializers.HyperlinkedModelSerializer):
66-
vulnerability_id = serializers.CharField(source="cve_id")
6766

6867
class Meta:
6968
model = Vulnerability
@@ -177,7 +176,6 @@ def bulk_search(self, request):
177176

178177

179178
class VulnerabilityFilterSet(filters.FilterSet):
180-
vulnerability_id = filters.CharFilter(field_name="cve_id")
181179

182180
class Meta:
183181
model = Vulnerability
@@ -208,13 +206,13 @@ def bulk_search(self, request):
208206
},
209207
)
210208

211-
for cve_id in request.data["vulnerabilities"]:
212-
filter_list.append(cve_id)
209+
for vulnerability_id in request.data["vulnerabilities"]:
210+
filter_list.append(vulnerability_id)
213211
# This handles the case when the said cve doesnt exist in db
214-
response[cve_id] = {}
215-
res = Vulnerability.objects.filter(cve_id__in=filter_list)
212+
response[vulnerability_id] = {}
213+
res = Vulnerability.objects.filter(vulnerability_id__in=filter_list)
216214
for vuln in res:
217-
response[vuln.cve_id] = MinimalVulnerabilitySerializer(
215+
response[vuln.vulnerability_id] = MinimalVulnerabilitySerializer(
218216
vuln, context={"request": request}
219217
).data
220218
return Response(response)

vulnerabilities/data_source.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,14 @@ class Advisory:
8181
impacted_package_urls: Iterable[PackageURL]
8282
resolved_package_urls: Iterable[PackageURL] = dataclasses.field(default_factory=list)
8383
vuln_references: List[Reference] = dataclasses.field(default_factory=list)
84-
cve_id: Optional[str] = None
84+
vulnerability_id: Optional[str] = None
8585

8686
def __hash__(self):
8787
s = "{}{}{}{}".format(
8888
self.summary,
89-
"".join(sorted([str(p) for p in self.impacted_package_urls])),
90-
"".join(sorted([str(p) for p in self.resolved_package_urls])),
91-
self.cve_id,
89+
''.join(sorted([str(p) for p in self.impacted_package_urls])),
90+
''.join(sorted([str(p) for p in self.resolved_package_urls])),
91+
self.vulnerability_id,
9292
)
9393
return hash(s)
9494

@@ -539,8 +539,6 @@ def get_data_from_xml_doc(self, xml_doc: ET.ElementTree, pkg_metadata={}) -> Lis
539539
summary=description,
540540
impacted_package_urls=affected_purls,
541541
resolved_package_urls=safe_purls,
542-
cve_id=vuln_id,
543-
vuln_references=references,
544-
)
545-
)
542+
vulnerability_id=vuln_id,
543+
vuln_references=references))
546544
return all_adv

vulnerabilities/fixtures/debian.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"model": "vulnerabilities.vulnerability",
44
"pk": 1,
55
"fields": {
6-
"cve_id": "CVE-2014-8242",
6+
"vulnerability_id": "CVE-2014-8242",
77
"summary": ""
88

99
}
@@ -12,7 +12,7 @@
1212
"model": "vulnerabilities.vulnerability",
1313
"pk": 2,
1414
"fields": {
15-
"cve_id": "CVE-2009-1382",
15+
"vulnerability_id": "CVE-2009-1382",
1616
"summary": ""
1717

1818
}
@@ -21,7 +21,7 @@
2121
"model": "vulnerabilities.vulnerability",
2222
"pk": 3,
2323
"fields": {
24-
"cve_id": "CVE-2009-2459",
24+
"vulnerability_id": "CVE-2009-2459",
2525
"summary": ""
2626

2727
}

vulnerabilities/fixtures/openssl.json

Lines changed: 178 additions & 178 deletions
Large diffs are not rendered by default.

vulnerabilities/import_runner.py

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -153,12 +153,23 @@ def process_advisories(data_source: DataSource) -> None:
153153
existing_ref = get_vuln_pkg_refs(vuln, pkg)
154154
if not existing_ref:
155155
bulk_create_vuln_pkg_refs.add(pkg_vuln_ref)
156+
# A vulnerability-package relationship does not exist already
157+
# if either the vulnerability or the package is just created.
156158

157159
else:
158-
# This handles conflicts between existing data and obtained data
159-
if existing_ref[0].is_vulnerable != pkg_vuln_ref.is_vulnerable:
160-
handle_conflicts([existing_ref[0], pkg_vuln_ref.to_model_object()])
161-
existing_ref.delete()
160+
# insert only if it there is no existing vulnerability-package relationship. # nopep8
161+
existing_ref = get_vuln_pkg_refs(vuln, pkg)
162+
if not existing_ref:
163+
bulk_create_vuln_pkg_refs.add(pkg_vuln_ref)
164+
165+
else:
166+
# This handles conflicts between existing data and obtained data
167+
if existing_ref[0].is_vulnerable != pkg_vuln_ref.is_vulnerable:
168+
handle_conflicts(
169+
[existing_ref[0], pkg_vuln_ref.to_model_object()]
170+
)
171+
existing_ref.delete()
172+
162173
except Exception:
163174
# TODO: store error but continue
164175
logger.error(
@@ -223,26 +234,13 @@ def _get_or_create_vulnerability(
223234
advisory: Advisory,
224235
) -> Tuple[models.Vulnerability, bool]:
225236

226-
if advisory.cve_id:
227-
query_kwargs = {"cve_id": advisory.cve_id}
228-
elif advisory.summary:
229-
query_kwargs = {"summary": advisory.summary}
230-
else:
231-
return models.Vulnerability.objects.create(), True
232-
233-
try:
234-
vuln, created = models.Vulnerability.objects.get_or_create(**query_kwargs)
235-
# Eventually we only want to keep summary from NVD and ignore other descriptions.
236-
if advisory.summary and vuln.summary != advisory.summary:
237-
vuln.summary = advisory.summary
238-
vuln.save()
239-
return vuln, created
240-
241-
except Exception:
242-
logger.error(
243-
f"Failed to _get_or_create_vulnerability: {query_kwargs!r}:\n" + traceback.format_exc()
244-
)
245-
raise
237+
vuln, created = models.Vulnerability.objects.get_or_create(vulnerability_id=advisory.vulnerability_id) # nopep8
238+
# Eventually we only want to keep summary from NVD and ignore other descriptions.
239+
if advisory.summary and vuln.summary != advisory.summary:
240+
vuln.summary = advisory.summary
241+
vuln.save()
242+
243+
return vuln, created
246244

247245

248246
def _get_or_create_package(p: PackageURL) -> Tuple[models.Package, bool]:

vulnerabilities/importer_yielder.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,16 @@
5858
'debian_tracker_url': 'https://security-tracker.debian.org/tracker/data/json'
5959
},
6060
},
61-
# {
62-
# 'name': 'safetydb',
63-
# 'license': 'cc-by-nc-4.0',
64-
# 'last_run': None,
65-
# 'data_source': 'SafetyDbDataSource',
66-
# 'data_source_cfg': {
67-
# 'url': 'https://raw.githubusercontent.com/pyupio/safety-db/master/data/insecure_full.json', # nopep8
68-
# 'etags': {}
69-
# },
70-
# },
61+
{
62+
'name': 'safetydb',
63+
'license': 'cc-by-nc-4.0',
64+
'last_run': None,
65+
'data_source': 'SafetyDbDataSource',
66+
'data_source_cfg': {
67+
'url': 'https://raw.githubusercontent.com/pyupio/safety-db/master/data/insecure_full.json', # nopep8
68+
'etags': {}
69+
},
70+
},
7171
{
7272
'name': 'npm',
7373
'license': 'mit',

vulnerabilities/importers/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,4 @@
4747
from vulnerabilities.importers.suse_scores import SUSESeverityScoreDataSource
4848
from vulnerabilities.importers.ubuntu import UbuntuDataSource
4949
from vulnerabilities.importers.ubuntu_usn import UbuntuUSNDataSource
50+
from vulnerabilities.importers.apache_tomcat import ApacheTomcatDataSource

vulnerabilities/importers/alpine_linux.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def _load_advisories(
187187
impacted_package_urls=[],
188188
resolved_package_urls=resolved_purls,
189189
vuln_references=references,
190-
cve_id=vuln_ids[0].upper() if vuln_ids[0] != "CVE-????-?????" else None,
190+
vulnerability_id=vuln_ids[0] if vuln_ids[0] != "CVE-????-?????" else None,
191191
)
192192
)
193193

vulnerabilities/importers/apache_kafka.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def to_advisory(self, advisory_page):
8282

8383
advisories.append(
8484
Advisory(
85-
cve_id=cve_id,
85+
vulnerability_id=cve_id,
8686
summary=cve_description_paragraph.text,
8787
impacted_package_urls=affected_packages,
8888
resolved_package_urls=fixed_packages,

0 commit comments

Comments
 (0)