This document is under active development and has not been finalised.
Skip to content

3.1 CVE Monitoring

Process

CVE monitoring scans all active product SBOMs against current CVE databases on a daily basis. The objective is the early detection of newly published vulnerabilities in dependencies of already delivered products.

LEGAL BASIS

Art. 10(6) CRA: "The manufacturer shall have effective and regular procedures and mechanisms in place to identify vulnerabilities in the product with digital elements."

Annex I, Part II, No. 5: "The manufacturer shall actively monitor third-party vulnerabilities contained in the product."

Workflow Design

Trigger

yaml
on:
  schedule:
    - cron: '0 6 * * *'    # Daily at 06:00 UTC
  workflow_dispatch:         # Manual trigger

Sequence

1. Load SBOMs of active product versions
   +-- Source: Compliance repo (sbom/) or GitHub release assets

2. Scan each SBOM against current CVE databases
   +-- trivy sbom sbom.cdx.json --severity CRITICAL,HIGH
   +-- grype sbom:sbom.cdx.json --only-fixed --fail-on high

3. Parse results
   +-- Filter by severity (CRITICAL, HIGH)
   +-- Extract: CVE ID, package, version, fixed version
   +-- Check for duplicates (previously reported CVEs)

4. On new findings:
   +-- Create GitHub issue
   |   +-- Title: "[CVE-YYYY-XXXXX] <Package> – <Severity>"
   |   +-- Labels: security, cve, <severity>
   |   +-- Body: CVE details, affected products, fix version
   |   +-- Assignee: Security Lead
   +-- Teams notification (for CRITICAL)
   +-- If actively exploited -> trigger ENISA reporting process

5. Archive scan report
   +-- As GitHub Actions artifact (90 days)

Workflow Specification

yaml
name: CVE Monitor

on:
  schedule:
    - cron: '0 6 * * *'
  workflow_dispatch:
    inputs:
      severity:
        description: 'Minimum severity to report'
        default: 'HIGH'
        type: choice
        options: ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW']

jobs:
  scan-sboms:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        product: [product-a, product-b, firmware-esp32]
    steps:
      - name: Checkout Compliance Repo
        uses: actions/checkout@v4

      - name: Get Latest SBOM
        run: |
          SBOM=$(ls -t sbom/${{ matrix.product }}/sbom-*.cdx.json | head -1)
          echo "SBOM_PATH=$SBOM" >> $GITHUB_ENV

      - name: Trivy SBOM Scan
        uses: aquasecurity/trivy-action@master
        with:
          input: ${{ env.SBOM_PATH }}
          scan-type: sbom
          severity: CRITICAL,HIGH
          format: json
          output: trivy-results.json

      - name: Create Issues for New CVEs
        uses: actions/github-script@v7
        with:
          script: |
            const results = require('./trivy-results.json');
            // Create issue for each new CVE
            // Check for duplicates via existing issues

CVE Databases

DatabaseToolCoverage
NVD (NIST)Trivy, GrypeComprehensive -- all CVEs
GitHub Advisory DBDependabotLanguage-specific
OSV (Open Source Vulnerability)TrivyOpen-source-focused
Red Hat Security DataTrivyLinux packages
Alpine SecDBTrivyAlpine packages

Issue Template

markdown
## CVE-[YYYY-XXXXX]: [Package Name] – [Severity]

**Severity:** CRITICAL / HIGH
**CVSS Score:** X.X
**Affected:** [Product name] v[Version]

### Details
- **Package:** [name]@[version]
- **Fixed in:** [fixed-version]
- **CVE:** https://nvd.nist.gov/vuln/detail/CVE-YYYY-XXXXX
- **Description:** [CVE description]

### Affected Products
| Product | Version | SBOM |
|---------|---------|------|
| [Name]  | [Ver]   | [Link] |

### Recommended Action
- [ ] Update package to version [fixed-version]
- [ ] Test patch
- [ ] Create release
- [ ] Update SBOM
- [ ] Check: Is the CVE actively exploited? -> [ENISA reporting process](/en/incident-response/enisa-reporting)

### Classification
- **Actively exploited:** Yes / No / Unknown
- **ENISA reporting obligation:** Yes / No

SLA for CVE Handling

SeverityResponse TimePatch DeadlineReference
CRITICAL4 hours48 hoursAnnex I, Part II, No. 7
HIGH24 hours7 daysAnnex I, Part II, No. 7
MEDIUM72 hours30 daysBest practice
LOW7 daysNext releaseBest practice

Documentation licensed under CC BY-NC 4.0 · Code licensed under MIT