intermediate By Mathias Paulenko

Dependency Vulnerability Report Template

A template for documenting security findings in dependencies, including severity, impact, and remediation steps for engineering teams.

Note: This guide follows English-language naming conventions and terminology standards common in international development teams. Examples use English identifiers and comments to maximize compatibility across codebases and tooling.

Overview

A Dependency Vulnerability Report Template captures security findings from software composition analysis (SCA) tools. It turns scan output into a useful document that developers, security engineers, and product owners can use to prioritize remediation.

When to Use

  • After a scheduled SCA scan in CI/CD.
  • When a new CVE is disclosed in a widely used library.
  • Before a release or security audit.
  • After adding a new dependency to a project.
  • To report findings to a vulnerability management program.

Prerequisites

  • A completed SCA scan from a tool such as Snyk, OWASP Dependency-Check, or GitHub Advanced Security.
  • Access to the affected repository and dependency manifest.
  • A vulnerability scoring framework, such as CVSS or your own risk matrix.
  • A defined remediation SLA by severity.

Solution

Template

1. Finding Summary

FieldDescriptionExample
Report IDUnique identifierVULN-2026-0042
Date discoveredWhen the finding was identified2026-06-27
ReporterPerson or tool that found itSnyk bot / Security team
ProjectRepository or service affectedpayment-service
EnvironmentWhere the dependency runsProduction, CI, Dev

2. Vulnerability Details

FieldDescriptionExample
CVE IDCommon Vulnerabilities and Exposures identifierCVE-2026-12345
SeverityCVSS score or custom severityHigh (8.1)
Affected packageLibrary and ecosystemlog4j-core (Maven)
Installed versionCurrent version in the project2.14.0
Patched versionFirst fixed version2.17.1
Attack vectorHow the vulnerability can be exploitedRemote code execution via log message
Exploit availabilityIs a public exploit known?Public PoC available

3. Impact Assessment

QuestionAnswer
Is the vulnerable function reachable?Yes, via request logging
Is the dependency exposed to the internet?Yes, edge service
Does the dependency process untrusted input?Yes, user-supplied content
Is a compensating control in place?WAF blocks malicious patterns
Estimated business impactPayment flow interruption

4. Remediation Plan

StepOwnerDue DateStatus
Upgrade dependency to 2.17.1Backend team2026-07-01Not started
Run regression tests in stagingQA team2026-07-02Not started
Deploy to productionDevOps2026-07-03Not started
Verify fix via re-scanSecurity team2026-07-05Not started

5. Risk Acceptance

FieldValue
Can the risk be accepted?No
JustificationInternet-facing RCE with public exploit
Risk ownerEngineering manager
Approval dateN/A
Review dateN/A

Explanation

The report connects the raw CVE data to the specific project, runtime context, and business impact. This prevents teams from treating every vulnerability the same way and helps prioritize those that are actually exploitable in production.

Variants

  • Executive summary report: One-page version with only severity, count, and risk trend for leadership.
  • CI/CD failure report: Captures why a pipeline was blocked and tracks unblocking steps.
  • Open-source maintainer report: Formatted for upstream disclosure and CVE publication.
  • Historical trend report: Aggregates findings across months to track security posture improvement.

What works

  • Keep a single report per finding or per CVE/project pair to avoid duplicates.
  • Always include exploitability analysis, not just CVSS score.
  • Assign an owner and a due date before closing the report.
  • Link to the SCA scan output, SBOM, and pull request for traceability.
  • Re-scan after remediation to verify the fix.
  • Review accepted risks quarterly.

Common Mistakes

  • Remediating only by CVSS score without considering exploitability.
  • Forgetting to test the upgraded dependency in a real workload.
  • Closing reports before a re-scan confirms the fix.
  • Missing transitive dependencies because the report only lists direct ones.
  • Accepting risk without documenting the business justification.

Advanced Solutions

Automated SCA scan in GitHub Actions

Integrate Snyk and Trivy into a GitHub Actions workflow to scan dependencies on every PR:

name: Dependency Security Scan
on:
  pull_request:
    paths:
      - "package.json"
      - "package-lock.json"
      - "requirements.txt"
      - "pom.xml"
  schedule:
    - cron: "0 6 * * 1"  # Weekly Monday scan

jobs:
  sca-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Run Snyk scan
        uses: snyk/actions/node@master
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
        with:
          args: --severity-threshold=high --json > snyk-results.json

      - name: Run Trivy filesystem scan
        run: |
          trivy fs --format json --output trivy-results.json .
          trivy fs --format table --exit-code 1 --severity HIGH,CRITICAL .

      - name: Generate vulnerability report
        run: |
          node -e "
            const snyk = require('./snyk-results.json');
            const trivy = require('./trivy-results.json');
            const findings = [
              ...snyk.vulnerabilities.map(v => ({
                source: 'snyk', cve: v.identifiers.CVE?.[0] || 'N/A',
                package: v.name, severity: v.severity,
                fixedVersion: v.fixInfo?.[0]?.version || 'N/A'
              })),
              ...trivy.Results.flatMap(r => r.Vulnerabilities || []).map(v => ({
                source: 'trivy', cve: v.VulnerabilityID,
                package: v.PkgName, severity: v.Severity,
                fixedVersion: v.FixedVersion || 'N/A'
              }))
            ];
            console.log('| Source | CVE | Package | Severity | Fixed Version |');
            console.log('|--------|-----|---------|----------|---------------|');
            findings.forEach(f => {
              console.log('| ' + f.source + ' | ' + f.cve + ' | ' + f.package + ' | ' + f.severity + ' | ' + f.fixedVersion + ' |');
            });
          " > vulnerability-report.md

      - name: Upload report as artifact
        uses: actions/upload-artifact@v4
        with:
          name: vulnerability-report
          path: vulnerability-report.md

SBOM generation with CycloneDX

Generate a Software Bill of Materials (SBOM) to track all dependencies including transitive ones:

#!/bin/bash
set -euo pipefail

# Generate SBOM for Node.js project
npx @cyclonedx/cyclonedx-npm --output-format json --output-file sbom.json

# Generate SBOM for Python project
pip install cyclonedx-bom
cyclonedx-py requirements.txt --format json --output - > sbom-python.json

# Enrich SBOM with vulnerability data using Trivy
trivy sbom --format json --output sbom-enriched.json sbom.json

# Extract vulnerable packages from enriched SBOM
jq '.Results[] | select(.Class=="sbom") | .Vulnerabilities[] | {
  cve: .VulnerabilityID,
  package: .PkgName,
  severity: .Severity,
  fixed_version: .FixedVersion
}' sbom-enriched.json

Transitive dependency analysis script

Identify which transitive dependencies introduce vulnerabilities in a Node.js project:

#!/bin/bash
set -euo pipefail

echo "=== Direct vs Transitive Vulnerable Dependencies ==="
echo ""

# Get all vulnerable packages
npm audit --json > audit-output.json 2>/dev/null || true

# Extract vulnerable packages and their dependency paths
jq -r '.vulnerabilities | to_entries[] | {
  package: .key,
  severity: .value.severity,
  is_direct: (.value.isDirect | tostring),
  via: (.value.via | map(.name // .source | tostring) | join(", ")),
  fixAvailable: (.value.fixAvailable | tostring)
}' audit-output.json

echo ""
echo "=== Transitive dependency chains ==="
# Show the full path from direct dependency to vulnerable transitive
npm ls --all --json 2>/dev/null | \
  jq -r '
    def walk_deps($name):
      .. | objects | select(.name == $name) | path;
    .vulnerabilities // {} | keys[] as $pkg |
    "Vulnerable: \($pkg)"
  ' audit-output.json 2>/dev/null || true

Additional Best Practices

  1. Use reachability analysis to reduce false positives. Tools like Snyk Code and OWASP Dep-Check can determine if the vulnerable function is actually called in your code. Suppress findings for unreachable code with documented justification:
# Snyk reachability analysis
snyk test --json --reachable-vulns | \
  jq '.vulnerabilities[] | {
    name: .name,
    reachable: .reachable,
    functions: .reachableFunctions
  }'
  1. Set up automated PR comments for new vulnerabilities. Configure Dependabot or Snyk to comment on PRs that introduce vulnerable dependencies, blocking merge until reviewed:
# .github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    allow:
      - dependency-type: "all"
    labels:
      - "security"
      - "dependencies"
    open-pull-requests-limit: 10

Additional Common Mistakes

  1. Ignoring dev dependencies in vulnerability scans. Dev dependencies can be exploited in CI environments or by malicious PRs. Scan all dependencies, not just production ones:
# Scan both production and dev dependencies
npm audit --production=false
snyk test --dev
  1. Not tracking vulnerabilities in Docker base images. Application dependency scans miss OS-level packages in your container base image. Scan the image separately:
# Scan Docker image for OS-level vulnerabilities
trivy image --severity HIGH,CRITICAL myapp:latest
grype myapp:latest --fail-on high

Frequently Asked Questions

How do I choose which vulnerabilities to fix first?
Prioritize by reachability, exploit availability, severity, and exposure to the internet. A medium CVSS vulnerability in a public-facing service can be more urgent than a high CVSS finding in an...
What if no patched version exists?
Document the compensating control, such as a WAF rule, network isolation, or input validation. If the risk remains unacceptable, consider removing the dependency or replacing it with an alternative.
Who should receive this report?
Engineering teams for remediation, security for oversight, product owners for risk decisions, and DevOps for deployment coordination.