Skip to content

Commit 2de94c9

Browse files
authored
fix(awssecurityhub): use parse_cvss_data helper for CVSS extraction (#14481)
1 parent e2ad47c commit 2de94c9

2 files changed

Lines changed: 30 additions & 0 deletions

File tree

dojo/tools/awssecurityhub/inspector.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from dojo.models import Endpoint, Finding
66
from dojo.tools.locations import LocationData
7+
from dojo.utils import parse_cvss_data
78

89
SEVERITY_MAP = {
910
"INFORMATIONAL": "Info",
@@ -31,6 +32,7 @@ def get_item(self, finding: dict, test):
3132
references = []
3233
unsaved_vulnerability_ids = []
3334
epss_score = finding.get("EpssScore")
35+
cvss_data = {}
3436
description = f"This is an Inspector Finding\n{finding.get('Description', '')}" + "\n"
3537
description += f"**AWS Finding ARN:** {finding_id}\n"
3638
description += f"**AwsAccountId:** {finding.get('AwsAccountId', '')}\n"
@@ -52,6 +54,10 @@ def get_item(self, finding: dict, test):
5254
references.append(vendor_url)
5355
if vulnerability.get("EpssScore") is not None:
5456
epss_score = vulnerability.get("EpssScore")
57+
# Extract and validate CVSS vectors using the common parse_cvss_data helper
58+
for cvss_entry in vulnerability.get("Cvss", []):
59+
if not cvss_data and cvss_entry.get("BaseVector"):
60+
cvss_data = parse_cvss_data(cvss_entry.get("BaseVector"))
5561
if finding.get("ProductFields", {}).get("aws/inspector/FindingStatus", "ACTIVE") == "ACTIVE":
5662
mitigated = None
5763
is_Mitigated = False
@@ -120,6 +126,22 @@ def get_item(self, finding: dict, test):
120126
result.unsaved_endpoints = locations
121127
if epss_score is not None:
122128
result.epss_score = epss_score
129+
if cvss_data:
130+
if cvss_data.get("cvssv3"):
131+
result.cvssv3 = cvss_data["cvssv3"]
132+
if cvss_data.get("cvssv4"):
133+
result.cvssv4 = cvss_data["cvssv4"]
134+
# Build severity justification from available CVSS data
135+
severity_parts = []
136+
if cvss_data.get("cvssv3"):
137+
severity_parts.append(f"CVSS v3 vector: {cvss_data['cvssv3']}")
138+
if cvss_data.get("cvssv4"):
139+
severity_parts.append(f"CVSS v4 vector: {cvss_data['cvssv4']}")
140+
severity_label = finding.get("Severity", {}).get("Label", "")
141+
if severity_label:
142+
severity_parts.append(f"AWS severity: {severity_label}")
143+
if severity_parts:
144+
result.severity_justification = "\n".join(severity_parts)
123145
# Add the unsaved vulnerability ids
124146
result.unsaved_vulnerability_ids = unsaved_vulnerability_ids
125147
return result

unittests/tools/test_awssecurityhub_parser.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ def test_inspector_ec2(self):
7272
self.assertEqual(1, len(finding.unsaved_vulnerability_ids))
7373
self.assertEqual("CVE-2022-3643", finding.unsaved_vulnerability_ids[0])
7474
self.assertEqual("- Update kernel-4.14.301\n\t- yum update kernel\n", finding.mitigation)
75+
# Verify CVSS v3 extraction via parse_cvss_data helper
76+
self.assertEqual("CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H", finding.cvssv3)
77+
self.assertIn("CVSS v3 vector:", finding.severity_justification)
78+
self.assertIn("AWS severity: CRITICAL", finding.severity_justification)
7579
location = self.get_unsaved_locations(finding)[0]
7680
self.assertEqual("AwsEc2Instance_arn_aws_ec2_us-east-1_XXXXXXXXXXXX_i-11111111111111111".lower(), location.host.lower())
7781

@@ -97,6 +101,8 @@ def test_inspector_ec2_ghsa(self):
97101
self.assertIn("GHSA-p98r-538v-jgw5", finding.title)
98102
self.assertSetEqual({"CVE-2023-34256", "GHSA-p98r-538v-jgw5"}, set(finding.unsaved_vulnerability_ids))
99103
self.assertEqual("https://github.com/bottlerocket-os/bottlerocket/security/advisories/GHSA-p98r-538v-jgw5", finding.references)
104+
# Verify backward compatibility: no CVSS data in this fixture
105+
self.assertIsNone(finding.cvssv3)
100106
location = self.get_unsaved_locations(finding)[0]
101107
self.assertEqual("AwsEc2Instance_arn_aws_ec2_eu-central-1_012345678912_instance_i-07c11cc535d830123".lower(), location.host.lower())
102108

@@ -115,6 +121,8 @@ def test_inspector_ecr(self):
115121
self.assertIn("repo-os/sha256:af965ef68c78374a5f987fce98c0ddfa45801df2395bf012c50b863e65978d74", finding.impact)
116122
self.assertIn("Repository: repo-os", finding.impact)
117123
self.assertEqual(0.0014, finding.epss_score)
124+
# Verify CVSS v3 extraction from the ECR fixture
125+
self.assertEqual("CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H", finding.cvssv3)
118126
location = self.get_unsaved_locations(finding)[0]
119127
self.assertEqual("AwsEcrContainerImage_arn_aws_ecr_eu-central-1_123456789012_repository_repo-os_sha256_af965ef68c78374a5f987fce98c0ddfa45801df2395bf012c50b863e65978d74".lower(), location.host.lower())
120128

0 commit comments

Comments
 (0)