Skip to content

Commit 1056229

Browse files
bluesentinelsecMichael Long
andauthored
Show vulnerability summary on zero vulns (#60)
* Show vulnerability summary on zero vulns * Test zero vulns table * Show vuln table summary on zero vulns * Show summary markdown table on zero vulns * rework zero vuln report * Rename resource to artifact for clarity * Set workflow version to v1.1.0 * fix typo in version * minor refactor --------- Co-authored-by: Michael Long <mlongii@amazon.com>
1 parent 5785a96 commit 1056229

File tree

3 files changed

+47
-20
lines changed

3 files changed

+47
-20
lines changed

entrypoint/entrypoint/orchestrator.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def execute(args) -> int:
3838
set_github_actions_output('inspector_scan_results_csv', args.out_scan_csv)
3939

4040
pkg_vuln_markdown = write_pkg_vuln_report_markdown(args, total_vulns, criticals, highs, mediums, lows, others)
41-
post_pkg_vuln_github_actions_step_summary(args, total_vulns, pkg_vuln_markdown)
41+
post_pkg_vuln_github_actions_step_summary(args, pkg_vuln_markdown)
4242
set_github_actions_output('inspector_scan_results_markdown', args.out_scan_markdown)
4343

4444
dockerfile.write_dockerfile_report_csv(args.out_scan, args.out_dockerfile_scan_csv)
@@ -60,7 +60,7 @@ def post_dockerfile_step_summary(args, total_vulns):
6060
with open(args.out_dockerfile_scan_md, "r") as f:
6161
dockerfile_markdown = f.read()
6262
except Exception as e:
63-
logging.debug(e) # can be spammy, so set as debug log
63+
logging.debug(e) # can be spammy, so set as debug log
6464
return
6565

6666
if not dockerfile_markdown:
@@ -379,10 +379,6 @@ def write_pkg_vuln_report_csv(args, criticals, highs, mediums, lows, others):
379379

380380

381381
def write_pkg_vuln_report_markdown(args, total_vulns, criticals, highs, mediums, lows, others):
382-
if int(total_vulns) == 0:
383-
logging.info(f"skipping package vulnerability markdown report because no vulnerabilities were detected")
384-
return
385-
386382
with open(args.out_scan, "r") as f:
387383
inspector_scan = json.load(f)
388384
vulns = pkg_vuln.vulns_to_obj(inspector_scan)
@@ -422,8 +418,8 @@ def print_vuln_count_summary(args, total_vulns, criticals, highs, mediums, lows,
422418
print(findings)
423419

424420

425-
def post_pkg_vuln_github_actions_step_summary(args, total_vulns, markdown):
426-
if args.display_vuln_findings == "enabled" and total_vulns > 0:
421+
def post_pkg_vuln_github_actions_step_summary(args, markdown):
422+
if args.display_vuln_findings == "enabled":
427423
logging.info("posting Inspector scan findings to GitHub Actions step summary page")
428424
pkg_vuln.post_github_step_summary(markdown)
429425

entrypoint/entrypoint/pkg_vuln.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -339,16 +339,16 @@ def to_markdown(vulns,
339339
markdown += f"| Other | {others}|\n"
340340
markdown += "\n\n"
341341

342+
if not vulns:
343+
markdown += ":green_circle: Your artifact was scanned with Amazon Inspector and no vulnerabilities were detected."
344+
markdown += "\n\n"
345+
return markdown
346+
342347
# create vulnerability details table
343348
markdown += "## Vulnerability Findings\n\n"
344-
345349
markdown += "| ID | Severity | [CVSS](https://www.first.org/cvss/) | Installed Package ([PURL](https://github.com/package-url/purl-spec/tree/master?tab=readme-ov-file#purl)) | Fixed Package | Path | [EPSS](https://www.first.org/epss/) | Exploit Available | Exploit Last Seen | CWEs |\n"
346350
markdown += "|----------|-------|-------|-------|-------|-------|-------|-------|-------|-------|\n"
347351

348-
if not vulns:
349-
markdown += "\n\n"
350-
return markdown
351-
352352
# sort vulns by CVSS score
353353
vulns = sort_vulns(vulns)
354354

@@ -421,16 +421,13 @@ def sort_vulns(vulns):
421421
return sorted_vulns
422422

423423

424-
def post_github_step_summary(markdown="null"):
425-
if markdown == "null":
426-
return
427-
428-
job_summary_file = "/tmp/inspector.md"
424+
def post_github_step_summary(markdown):
425+
step_summary_path = "/tmp/inspector.md"
429426
if os.getenv('GITHUB_ACTIONS'):
430-
job_summary_file = os.environ["GITHUB_STEP_SUMMARY"]
427+
step_summary_path = os.environ["GITHUB_STEP_SUMMARY"]
431428

432429
try:
433-
with open(job_summary_file, "a") as f:
430+
with open(step_summary_path, "a") as f:
434431
f.write(markdown)
435432
except Exception as e:
436433
logging.error(e)

entrypoint/tests/test_pkg_vuln.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
import os
23
import unittest
34

45
from entrypoint import pkg_vuln
@@ -37,6 +38,32 @@ def test_vulns_to_obj(self):
3738
vulns = pkg_vuln.vulns_to_obj(inspector_scan)
3839
self.assertTrue(vulns != None)
3940

41+
def test_post_github_step_summary_no_vulns(self):
42+
43+
markdown_dst_path = "/tmp/inspector.md"
44+
cleanup_stale_markdown_report(markdown_dst_path)
45+
46+
zero_vuln_summary_md = pkg_vuln.to_markdown(vulns=None,
47+
artifact_name="test_image:latest",
48+
artifact_type="container",
49+
artifact_hash="null",
50+
build_id="null",
51+
criticals="0",
52+
highs="0",
53+
mediums="0",
54+
lows="0",
55+
others="0")
56+
57+
expected_list = ["| Critical | 0|",
58+
"| High | 0|",
59+
"| Medium | 0|",
60+
"| Low | 0|",
61+
"| Other | 0|",
62+
]
63+
for expected in expected_list:
64+
self.assertIn(expected, zero_vuln_summary_md)
65+
cleanup_stale_markdown_report(markdown_dst_path)
66+
4067

4168
def get_scan_body(test_file):
4269
# test_file = "tests/test_data/artifacts/containers/dockerfile_checks/inspector-scan-cdx.json"
@@ -47,5 +74,12 @@ def get_scan_body(test_file):
4774
return scan_body
4875

4976

77+
def cleanup_stale_markdown_report(path):
78+
try:
79+
os.remove(path)
80+
except:
81+
return
82+
83+
5084
if __name__ == '__main__':
5185
unittest.main()

0 commit comments

Comments
 (0)