Skip to content

Commit 1f90ab7

Browse files
authored
fix(CycloneDXJSONParser): handle missing severity field by defaulting to "Medium" (#13583)
1 parent ca0fc56 commit 1f90ab7

3 files changed

Lines changed: 53 additions & 1 deletion

File tree

dojo/tools/cyclonedx/json_parser.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ def _get_findings_json(self, file, test):
3636
# better than always 'Medium'
3737
ratings = vulnerability.get("ratings")
3838
if ratings:
39-
severity = ratings[0]["severity"]
39+
# Determine if we can use the severity field
40+
# In some cases, the severity field is missing, so we can rely on either the Medium severity
41+
# or the CVSS vector (retrieved further down below) to determine the severity:
42+
severity = ratings[0].get("severity", "Medium")
4043
severity = Cyclonedxhelper().fix_severity(severity)
4144
else:
4245
severity = "Medium"
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"bomFormat": "CycloneDX",
3+
"specVersion": "1.4",
4+
"version": 1,
5+
"metadata": {
6+
"timestamp": "2025-10-28T14:38:10Z"
7+
},
8+
"vulnerabilities": [
9+
{
10+
"id": "CVE-2021-44228",
11+
"source": {
12+
"name": "NVD",
13+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
14+
},
15+
"ratings": [
16+
{
17+
"source": {
18+
"name": "NVD",
19+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
20+
},
21+
"score": 10.0,
22+
"method": "CVSSv3",
23+
"vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H"
24+
}
25+
],
26+
"created": "2025-09-05T05:05:47Z",
27+
"updated": "2025-03-03T16:51:00Z",
28+
"affects": [
29+
{
30+
"ref": "gerbwetbqt"
31+
}
32+
]
33+
}
34+
]
35+
}

unittests/tools/test_cyclonedx_parser.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,3 +357,17 @@ def test_cyclonedx_issue_8022(self):
357357
self.assertIn(finding.severity, Finding.SEVERITIES)
358358
finding.clean()
359359
self.assertEqual(1, len(findings))
360+
361+
def test_cyclonedx_no_severity(self):
362+
"""CycloneDX version 1.4 JSON format"""
363+
with (get_unit_tests_scans_path("cyclonedx") / "no-severity.json").open(encoding="utf-8") as file:
364+
parser = CycloneDXParser()
365+
findings = parser.get_findings(file, Test())
366+
self.assertEqual(1, len(findings))
367+
finding = findings[0]
368+
# There is so little information in the vulnerability, that we cannot build a proper title
369+
self.assertEqual("None:None | CVE-2021-44228", finding.title)
370+
self.assertEqual("Critical", finding.severity)
371+
# The score will be evaluated when the finding save method is ran
372+
# self.assertEqual(10.0, finding.cvssv3_score)
373+
self.assertEqual("CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H", finding.cvssv3)

0 commit comments

Comments
 (0)