Skip to content

Commit 2d53c0b

Browse files
authored
[test] Unskip ECR Scan and report findings (#892)
1 parent be5809f commit 2d53c0b

File tree

2 files changed

+40
-8
lines changed

2 files changed

+40
-8
lines changed

test/dlc_tests/sanity/test_security_check.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import json
2+
13
from datetime import datetime
24
from time import sleep, time
35

@@ -9,6 +11,7 @@
911

1012
from test.test_utils import get_framework_and_version_from_tag
1113
from test.test_utils import ecr as ecr_utils
14+
from test.test_utils.ecr import CVESeverity
1215

1316

1417
@pytest.mark.model("N/A")
@@ -50,11 +53,7 @@ def test_ecr_scan(image, ecr_client):
5053
:param image: str Image URI for image to be tested
5154
:param ecr_client: boto3 Client for ECR
5255
"""
53-
# TODO: Unskip this test for TF 2.4.1 images
54-
framework, version = get_framework_and_version_from_tag(image)
55-
if framework == "tensorflow" and Version(version) == Version("2.4.1"):
56-
pytest.skip("Skip ECR Scan on TF 2.4.1 DLC images")
57-
56+
minimum_sev_threshold = "HIGH"
5857
scan_status = None
5958
start_time = time()
6059
ecr_utils.start_ecr_image_scan(ecr_client, image)
@@ -68,6 +67,10 @@ def test_ecr_scan(image, ecr_client):
6867
if scan_status != "COMPLETE":
6968
raise TimeoutError(f"ECR Scan is still in {scan_status} state. Exiting.")
7069
severity_counts = ecr_utils.get_ecr_image_scan_severity_count(ecr_client, image)
71-
assert not (
72-
severity_counts.get("HIGH", 0) or severity_counts.get("CRITICAL", 0)
73-
), f"Found vulnerabilities in image {image}: {str(severity_counts)}"
70+
scan_results = ecr_utils.get_ecr_image_scan_results(ecr_client, image, minimum_vulnerability=minimum_sev_threshold)
71+
assert all(
72+
count == 0 for sev, count in severity_counts.items() if CVESeverity[sev] >= CVESeverity[minimum_sev_threshold]
73+
), (
74+
f"Found vulnerabilities in image {image}: {str(severity_counts)}\n"
75+
f"Vulnerabilities: {json.dumps(scan_results, indent=4)}"
76+
)

test/test_utils/ecr.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
11
import json
22

3+
from enum import IntEnum
4+
35
from test.test_utils import get_repository_and_tag_from_image_uri, LOGGER
46

57

8+
class CVESeverity(IntEnum):
9+
UNDEFINED = 0
10+
INFORMATIONAL = 1
11+
LOW = 2
12+
MEDIUM = 3
13+
HIGH = 4
14+
CRITICAL = 5
15+
16+
617
class ECRScanFailedError(Exception):
718
pass
819

@@ -65,3 +76,21 @@ def get_ecr_image_scan_severity_count(ecr_client, image_uri):
6576
scan_info = ecr_client.describe_image_scan_findings(repositoryName=repository, imageId={"imageTag": tag})
6677
severity_counts = scan_info["imageScanFindings"]["findingSeverityCounts"]
6778
return severity_counts
79+
80+
81+
def get_ecr_image_scan_results(ecr_client, image_uri, minimum_vulnerability="HIGH"):
82+
"""
83+
Get list of vulnerabilities from ECR image scan results
84+
:param ecr_client:
85+
:param image_uri:
86+
:param minimum_vulnerability: str representing minimum vulnerability level to report in results
87+
:return: list<dict> Scan results
88+
"""
89+
repository, tag = get_repository_and_tag_from_image_uri(image_uri)
90+
scan_info = ecr_client.describe_image_scan_findings(repositoryName=repository, imageId={"imageTag": tag})
91+
scan_findings = [
92+
finding
93+
for finding in scan_info["imageScanFindings"]["findings"]
94+
if CVESeverity[finding["severity"]] >= CVESeverity[minimum_vulnerability]
95+
]
96+
return scan_findings

0 commit comments

Comments
 (0)