Skip to content

Commit e842d53

Browse files
committed
fix(awssecurityhub): extract CVSS v3/v4 scores from Inspector findings
1 parent 90a0c88 commit e842d53

2 files changed

Lines changed: 43 additions & 0 deletions

File tree

dojo/tools/awssecurityhub/inspector.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ def get_item(self, finding: dict, test):
3131
references = []
3232
unsaved_vulnerability_ids = []
3333
epss_score = finding.get("EpssScore")
34+
cvssv3 = None
35+
cvssv3_score = None
36+
cvssv4 = None
37+
cvssv4_score = None
3438
description = f"This is an Inspector Finding\n{finding.get('Description', '')}" + "\n"
3539
description += f"**AWS Finding ARN:** {finding_id}\n"
3640
description += f"**AwsAccountId:** {finding.get('AwsAccountId', '')}\n"
@@ -52,6 +56,15 @@ def get_item(self, finding: dict, test):
5256
references.append(vendor_url)
5357
if vulnerability.get("EpssScore") is not None:
5458
epss_score = vulnerability.get("EpssScore")
59+
# Extract CVSS v3/v4 scores from the Cvss array
60+
for cvss_entry in vulnerability.get("Cvss", []):
61+
version = cvss_entry.get("Version", "")
62+
if version.startswith("3") and cvssv3 is None:
63+
cvssv3 = cvss_entry.get("BaseVector")
64+
cvssv3_score = cvss_entry.get("BaseScore")
65+
elif version.startswith("4") and cvssv4 is None:
66+
cvssv4 = cvss_entry.get("BaseVector")
67+
cvssv4_score = cvss_entry.get("BaseScore")
5568
if finding.get("ProductFields", {}).get("aws/inspector/FindingStatus", "ACTIVE") == "ACTIVE":
5669
mitigated = None
5770
is_Mitigated = False
@@ -120,6 +133,25 @@ def get_item(self, finding: dict, test):
120133
result.unsaved_endpoints = locations
121134
if epss_score is not None:
122135
result.epss_score = epss_score
136+
if cvssv3 is not None:
137+
result.cvssv3 = cvssv3
138+
if cvssv3_score is not None:
139+
result.cvssv3_score = cvssv3_score
140+
if cvssv4 is not None:
141+
result.cvssv4 = cvssv4
142+
if cvssv4_score is not None:
143+
result.cvssv4_score = cvssv4_score
144+
# Build severity justification from available CVSS data
145+
severity_parts = []
146+
if cvssv3 is not None:
147+
severity_parts.append(f"CVSS v3 vector: {cvssv3} (base score: {cvssv3_score})")
148+
if cvssv4 is not None:
149+
severity_parts.append(f"CVSS v4 vector: {cvssv4} (base score: {cvssv4_score})")
150+
severity_label = finding.get("Severity", {}).get("Label", "")
151+
if severity_label:
152+
severity_parts.append(f"AWS severity: {severity_label}")
153+
if severity_parts:
154+
result.severity_justification = "\n".join(severity_parts)
123155
# Add the unsaved vulnerability ids
124156
result.unsaved_vulnerability_ids = unsaved_vulnerability_ids
125157
return result

unittests/tools/test_awssecurityhub_parser.py renamed to unittests/tools/test_aws_security_hub_parser.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ 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 from the Cvss array
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.assertEqual(10.0, finding.cvssv3_score)
78+
self.assertIn("CVSS v3 vector:", finding.severity_justification)
79+
self.assertIn("AWS severity: CRITICAL", finding.severity_justification)
7580
location = self.get_unsaved_locations(finding)[0]
7681
self.assertEqual("AwsEc2Instance_arn_aws_ec2_us-east-1_XXXXXXXXXXXX_i-11111111111111111".lower(), location.host.lower())
7782

@@ -97,6 +102,9 @@ def test_inspector_ec2_ghsa(self):
97102
self.assertIn("GHSA-p98r-538v-jgw5", finding.title)
98103
self.assertSetEqual({"CVE-2023-34256", "GHSA-p98r-538v-jgw5"}, set(finding.unsaved_vulnerability_ids))
99104
self.assertEqual("https://github.com/bottlerocket-os/bottlerocket/security/advisories/GHSA-p98r-538v-jgw5", finding.references)
105+
# Verify backward compatibility: no CVSS data in this fixture
106+
self.assertIsNone(finding.cvssv3)
107+
self.assertIsNone(finding.cvssv3_score)
100108
location = self.get_unsaved_locations(finding)[0]
101109
self.assertEqual("AwsEc2Instance_arn_aws_ec2_eu-central-1_012345678912_instance_i-07c11cc535d830123".lower(), location.host.lower())
102110

@@ -115,6 +123,9 @@ def test_inspector_ecr(self):
115123
self.assertIn("repo-os/sha256:af965ef68c78374a5f987fce98c0ddfa45801df2395bf012c50b863e65978d74", finding.impact)
116124
self.assertIn("Repository: repo-os", finding.impact)
117125
self.assertEqual(0.0014, finding.epss_score)
126+
# Verify CVSS v3 extraction from the ECR fixture
127+
self.assertEqual("CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H", finding.cvssv3)
128+
self.assertEqual(6.5, finding.cvssv3_score)
118129
location = self.get_unsaved_locations(finding)[0]
119130
self.assertEqual("AwsEcrContainerImage_arn_aws_ecr_eu-central-1_123456789012_repository_repo-os_sha256_af965ef68c78374a5f987fce98c0ddfa45801df2395bf012c50b863e65978d74".lower(), location.host.lower())
120131

0 commit comments

Comments
 (0)