Skip to content

Commit ec00e66

Browse files
committed
Handle scanner errors separately from vulnerability findings
1 parent 93a2e8f commit ec00e66

2 files changed

Lines changed: 65 additions & 46 deletions

File tree

.github/workflows/check-vulns.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ jobs:
7878
exit 0
7979
- name: build matrix
8080
id: set_matrix
81-
if: ${{ steps.scan.outputs.status != '0' }}
81+
if: ${{ steps.scan.outputs.status == '1' }}
8282
working-directory: ./dep_checker
8383
run: |
8484
# Extract vulnerabilities JSON from the log
@@ -89,10 +89,15 @@ jobs:
8989
matrix=$(python3 ../.github/workflows/format_matrix.py "$vulnerabilities_json" "${{ inputs.nsolidStream }}")
9090
echo "Formatted matrix: $matrix"
9191
echo "matrix=$matrix" >> $GITHUB_OUTPUT
92+
- name: Fail on scan error
93+
if: ${{ steps.scan.outputs.status != '0' && steps.scan.outputs.status != '1' }}
94+
run: |
95+
echo "Dependency vulnerability scan failed; no issue matrix was generated."
96+
exit 1
9297
9398
create-issues:
9499
needs: check-vulns
95-
if: ${{ needs.check-vulns.outputs.scan_status != '0' }}
100+
if: ${{ needs.check-vulns.outputs.scan_status == '1' }}
96101
runs-on: ubuntu-latest
97102
strategy:
98103
matrix: ${{ fromJson(needs.check-vulns.outputs.matrix) }}

dep_checker/main.py

Lines changed: 58 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,16 @@
2424
from packaging.specifiers import SpecifierSet
2525
from typing import Optional, List
2626
from pathlib import Path
27+
from requests.exceptions import RequestException
2728

2829
import json
2930
import logging
31+
import traceback
32+
33+
34+
EXIT_SUCCESS = 0
35+
EXIT_VULNERABILITIES_FOUND = 1
36+
EXIT_SCAN_ERROR = 2
3037

3138

3239
class Vulnerability:
@@ -332,51 +339,58 @@ def main() -> int:
332339
"Warning: NVD API key not provided, queries will be slower due to rate limiting"
333340
)
334341

335-
dependencies = resolve_dependencies(repo_path, repo_branch)
336-
ghad_vulnerabilities: list[Vulnerability] = (
337-
list() if gh_token is None else query_ghad(dependencies, gh_token, repo_path)
338-
)
339-
nvd_vulnerabilities: list[Vulnerability] = query_nvd(
340-
dependencies, nvd_key, repo_path
341-
)
342+
try:
343+
dependencies = resolve_dependencies(repo_path, repo_branch)
344+
ghad_vulnerabilities: list[Vulnerability] = (
345+
list() if gh_token is None else query_ghad(dependencies, gh_token, repo_path)
346+
)
347+
nvd_vulnerabilities: list[Vulnerability] = query_nvd(
348+
dependencies, nvd_key, repo_path
349+
)
342350

343-
# NPM package vulnerability checking
344-
npm_vulnerabilities: list[Vulnerability] = []
345-
if include_npm:
346-
try:
347-
# Configure logging for npm audit
348-
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
349-
350-
from npm_audit import NPMAuditChecker
351-
print("Running npm package vulnerability audit...")
352-
npm_checker = NPMAuditChecker(repo_path, npm_timeout)
353-
npm_vulnerabilities = npm_checker.check_npm_vulnerabilities(Vulnerability)
354-
print(f"Found {len(npm_vulnerabilities)} npm package vulnerabilities")
355-
except ImportError as e:
356-
print(f"Warning: npm_audit module not found, skipping npm vulnerability checking: {e}")
357-
except Exception as e:
358-
print(f"Warning: npm vulnerability checking failed: {e}")
359-
import traceback
360-
print(f"Traceback: {traceback.format_exc()}")
361-
362-
all_vulnerabilities = {
363-
"vulnerabilities": ghad_vulnerabilities + nvd_vulnerabilities + npm_vulnerabilities
364-
}
365-
no_vulnerabilities_found = not ghad_vulnerabilities and not nvd_vulnerabilities and not npm_vulnerabilities
366-
if json_output:
367-
print(json.dumps(all_vulnerabilities, cls=VulnerabilityEncoder))
368-
return 0 if no_vulnerabilities_found else 1
369-
elif no_vulnerabilities_found:
370-
print(f"No new vulnerabilities found ({len(ignore_list)} ignored)")
371-
return 0
372-
else:
373-
print("WARNING: New vulnerabilities found")
374-
for vuln in all_vulnerabilities["vulnerabilities"]:
375-
print(
376-
f"- {vuln.dependency} (version {vuln.version}) : {vuln.id} ({vuln.url})"
377-
)
378-
print(f"\n{vulnerability_found_message}")
379-
return 1
351+
# NPM package vulnerability checking
352+
npm_vulnerabilities: list[Vulnerability] = []
353+
if include_npm:
354+
try:
355+
# Configure logging for npm audit
356+
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
357+
358+
from npm_audit import NPMAuditChecker
359+
print("Running npm package vulnerability audit...")
360+
npm_checker = NPMAuditChecker(repo_path, npm_timeout)
361+
npm_vulnerabilities = npm_checker.check_npm_vulnerabilities(Vulnerability)
362+
print(f"Found {len(npm_vulnerabilities)} npm package vulnerabilities")
363+
except ImportError as e:
364+
print(f"Warning: npm_audit module not found, skipping npm vulnerability checking: {e}")
365+
except Exception as e:
366+
print(f"Warning: npm vulnerability checking failed: {e}")
367+
print(f"Traceback: {traceback.format_exc()}")
368+
369+
all_vulnerabilities = {
370+
"vulnerabilities": ghad_vulnerabilities + nvd_vulnerabilities + npm_vulnerabilities
371+
}
372+
no_vulnerabilities_found = not ghad_vulnerabilities and not nvd_vulnerabilities and not npm_vulnerabilities
373+
if json_output:
374+
print(json.dumps(all_vulnerabilities, cls=VulnerabilityEncoder))
375+
return EXIT_SUCCESS if no_vulnerabilities_found else EXIT_VULNERABILITIES_FOUND
376+
elif no_vulnerabilities_found:
377+
print(f"No new vulnerabilities found ({len(ignore_list)} ignored)")
378+
return EXIT_SUCCESS
379+
else:
380+
print("WARNING: New vulnerabilities found")
381+
for vuln in all_vulnerabilities["vulnerabilities"]:
382+
print(
383+
f"- {vuln.dependency} (version {vuln.version}) : {vuln.id} ({vuln.url})"
384+
)
385+
print(f"\n{vulnerability_found_message}")
386+
return EXIT_VULNERABILITIES_FOUND
387+
except RequestException as exc:
388+
print(f"Error: vulnerability database request failed: {exc}")
389+
return EXIT_SCAN_ERROR
390+
except Exception as exc:
391+
print(f"Error: vulnerability scan failed: {exc}")
392+
print(traceback.format_exc())
393+
return EXIT_SCAN_ERROR
380394

381395

382396
if __name__ == "__main__":

0 commit comments

Comments
 (0)