Skip to content

Commit 2d93d8f

Browse files
committed
Faster Weakness Lookup
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent cd0c865 commit 2d93d8f

File tree

2 files changed

+34
-13
lines changed

2 files changed

+34
-13
lines changed

vulnerabilities/models.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import hashlib
1212
import json
1313
import logging
14+
import xml.etree.ElementTree as ET
1415
from contextlib import suppress
1516
from functools import cached_property
1617
from itertools import groupby
@@ -21,6 +22,8 @@
2122
from cvss.exceptions import CVSS3MalformedError
2223
from cvss.exceptions import CVSS4MalformedError
2324
from cwe2.database import Database
25+
from cwe2.mappings import xml_database_path
26+
from cwe2.weakness import Weakness as DBWeakness
2427
from django.contrib.auth import get_user_model
2528
from django.contrib.auth.models import UserManager
2629
from django.core import exceptions
@@ -53,9 +56,6 @@
5356
from vulnerabilities.utils import normalize_purl
5457
from vulnerabilities.utils import purl_to_dict
5558
from vulnerablecode import __version__ as VULNERABLECODE_VERSION
56-
from cwe2.weakness import Weakness as DBWeakness
57-
from cwe2.mappings import xml_database_path
58-
import xml.etree.ElementTree as ET
5959

6060
logger = logging.getLogger(__name__)
6161

@@ -469,6 +469,7 @@ def get_severity_vectors_and_values(self):
469469

470470
return severity_vectors, severity_values
471471

472+
472473
def get_cwes(self):
473474
"""Yield CWE Weakness objects"""
474475
for cwe_category in self.cwe_files:
@@ -481,10 +482,20 @@ def get_cwes(self):
481482
for tag_num in [1, 2]: # Categories , Views
482483
tag = root[tag_num]
483484
for child in tag:
484-
yield DBWeakness(*[child.attrib["ID"], child.attrib.get("Name"),None,child.attrib.get("Status"),child[0].text])
485+
yield DBWeakness(
486+
*[
487+
child.attrib["ID"],
488+
child.attrib.get("Name"),
489+
None,
490+
child.attrib.get("Status"),
491+
child[0].text,
492+
]
493+
)
494+
485495

486496
Database.get_cwes = get_cwes
487497

498+
488499
class Weakness(models.Model):
489500
"""
490501
A Common Weakness Enumeration model

vulnerabilities/views.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,9 @@ def get_queryset(self):
163163
.prefetch_related(
164164
Prefetch(
165165
"references",
166-
queryset=models.VulnerabilityReference.objects.only("reference_id", "reference_type", "url"),
166+
queryset=models.VulnerabilityReference.objects.only(
167+
"reference_id", "reference_type", "url"
168+
),
167169
),
168170
Prefetch(
169171
"aliases",
@@ -175,7 +177,9 @@ def get_queryset(self):
175177
),
176178
Prefetch(
177179
"severities",
178-
queryset=models.VulnerabilitySeverity.objects.only("scoring_system", "value", "url", "scoring_elements", "published_at"),
180+
queryset=models.VulnerabilitySeverity.objects.only(
181+
"scoring_system", "value", "url", "scoring_elements", "published_at"
182+
),
179183
),
180184
Prefetch(
181185
"exploits",
@@ -201,21 +205,27 @@ def get_context_data(self, **kwargs):
201205
]
202206

203207
valid_severities = self.object.severities.exclude(scoring_system=EPSS.identifier).filter(
204-
scoring_elements__isnull=False,
205-
scoring_system__in=SCORING_SYSTEMS.keys()
208+
scoring_elements__isnull=False, scoring_system__in=SCORING_SYSTEMS.keys()
206209
)
207210

208211
severity_vectors = []
209212

210213
for severity in valid_severities:
211214
try:
212-
vector_values = SCORING_SYSTEMS[severity.scoring_system].get(severity.scoring_elements)
215+
vector_values = SCORING_SYSTEMS[severity.scoring_system].get(
216+
severity.scoring_elements
217+
)
213218
if vector_values:
214219
severity_vectors.append({"vector": vector_values, "origin": severity.url})
215-
except (CVSS2MalformedError, CVSS3MalformedError, CVSS4MalformedError, NotImplementedError):
220+
except (
221+
CVSS2MalformedError,
222+
CVSS3MalformedError,
223+
CVSS4MalformedError,
224+
NotImplementedError,
225+
):
216226
logging.error(f"CVSSMalformedError for {severity.scoring_elements}")
217-
218-
epss_severity = vulnerability.severities.filter(scoring_system='epss').first()
227+
228+
epss_severity = vulnerability.severities.filter(scoring_system="epss").first()
219229
epss_data = None
220230
if epss_severity:
221231
epss_data = {
@@ -235,7 +245,7 @@ def get_context_data(self, **kwargs):
235245
"weaknesses": weaknesses_present_in_db,
236246
"status": vulnerability.get_status_label,
237247
"history": vulnerability.history,
238-
"epss_data": epss_data
248+
"epss_data": epss_data,
239249
}
240250
)
241251
return context

0 commit comments

Comments
 (0)