intermediate Por Mathias Paulenko

Plantilla de Reporte de Vulnerabilidades en Dependencias

Una plantilla para documentar hallazgos de seguridad en dependencias, incluyendo severidad, impacto y pasos de remediacion para equipos de ingenieria.

Nota para desarrolladores hispanohablantes: Esta guía incluye ejemplos y convenciones de nomenclatura adaptadas a equipos que trabajan en español. Cuando existen diferencias significativas en terminología técnica entre el inglés y el español, se indican explícitamente para facilitar la comunicación en equipos multiculturales.

Descripcion General

Una Plantilla de Reporte de Vulnerabilidades en Dependencias captura hallazgos de seguridad provenientes de herramientas de Software Composition Analysis (SCA). Convierte la salida del escaneo en un documento util que desarrolladores, ingenieros de seguridad y product owners pueden usar para priorizar la remediacion.

Cuando Usar

  • For alternatives, see Vulnerability Scan Report Template.

  • Despues de un escaneo SCA programado en CI/CD.

  • Cuando se publica un nuevo CVE en una libreria ampliamente usada.

  • Antes de un release o auditoria de seguridad.

  • Despues de agregar una nueva dependencia a un proyecto.

  • Para reportar hallazgos a un programa de gestion de vulnerabilidades.

Prerequisitos

  • Un escaneo SCA completado con una herramienta como Snyk, OWASP Dependency-Check o GitHub Advanced Security.
  • Acceso al repositorio afectado y al manifesto de dependencias.
  • Un framework de puntuacion de vulnerabilidades, como CVSS o tu propia matriz de riesgo.
  • Un SLA de remediacion definido por severidad.

Solucion

Plantilla

1. Resumen del Hallazgo

CampoDescripcionEjemplo
ID del reporteIdentificador unicoVULN-2026-0042
Fecha descubiertaCuando se identifico el hallazgo2026-06-27
Reportado porPersona o herramienta que lo encontroSnyk bot / Equipo de seguridad
ProyectoRepositorio o servicio afectadopayment-service
AmbienteDonde corre la dependenciaProduccion, CI, Dev

2. Detalles de la Vulnerabilidad

CampoDescripcionEjemplo
ID CVEIdentificador de vulnerabilidadCVE-2026-12345
SeveridadPuntuacion CVSS o severidad personalizadaAlta (8.1)
Paquete afectadoLibreria y ecosistemalog4j-core (Maven)
Version instaladaVersion actual en el proyecto2.14.0
Version parchadaPrimera version corregida2.17.1
Vector de ataqueComo se puede explotar la vulnerabilidadEjecucion remota de codigo via log message
Disponibilidad de exploitExiste un exploit publico?PoC publico disponible

3. Evaluacion de Impacto

PreguntaRespuesta
La funcion vulnerable es alcanzable?Si, via logging de requests
La dependencia esta expuesta a internet?Si, servicio edge
La dependencia procesa input no confiable?Si, contenido proporcionado por usuarios
Existe un control compensatorio?WAF bloquea patrones maliciosos
Impacto de negocio estimadoInterrupcion del flujo de pagos

4. Plan de Remediacion

PasoResponsableFecha LimiteEstado
Actualizar dependencia a 2.17.1Equipo backend2026-07-01No iniciado
Ejecutar pruebas de regresion en stagingQA2026-07-02No iniciado
Desplegar en produccionDevOps2026-07-03No iniciado
Verificar correccion via re-scanSeguridad2026-07-05No iniciado

5. Aceptacion de Riesgo

CampoValor
Se puede aceptar el riesgo?No
JustificacionRCE publico con exploit publico
Dueno del riesgoEngineering manager
Fecha de aprobacionN/A
Fecha de revisionN/A

Explicacion

El reporte conecta los datos crudos del CVE con el proyecto especifico, contexto de ejecucion e impacto de negocio. Esto evita que los equipos traten todas las vulnerabilidades de igual manera y ayuda a priorizar aquellas que realmente son explotables en produccion.

Variantes

  • Reporte ejecutivo: Version de una pagina con solo severidad, cantidad y tendencia de riesgo para liderazgo.
  • Reporte de fallo en CI/CD: Captura por que se bloqueo un pipeline y rastrea los pasos para desbloquearlo.
  • Reporte para mantenedores open source: Formateado para divulgacion upstream y publicacion de CVE.
  • Reporte de tendencia historica: Agrega hallazgos a lo largo de meses para rastrear la mejora de la postura de seguridad.

Lo que funciona

  • Manten un reporte por hallazgo o por par CVE/proyecto para evitar duplicados.
  • Incluye siempre analisis de explotabilidad, no solo puntuacion CVSS.
  • Asigna un dueno y fecha limite antes de cerrar el reporte.
  • Linkea la salida del escaneo SCA, SBOM y pull request para trazabilidad.
  • Re-escanea despues de la remediacion para verificar el fix.
  • Revisa riesgos aceptados trimestralmente.

Errores Comunes

  • Remediar solo por puntuacion CVSS sin considerar explotabilidad.
  • Olvidar probar la dependencia actualizada en una carga real.
  • Cerrar reportes antes de que un re-scan confirme la correccion.
  • Ignorar dependencias transitivas porque el reporte solo lista directas.
  • Aceptar riesgo sin documentar la justificacion de negocio.

Soluciones Avanzadas

Escaneo SCA automatizado en GitHub Actions

Integra Snyk y Trivy en un workflow de GitHub Actions para escanear dependencias en cada PR:

name: Dependency Security Scan
on:
  pull_request:
    paths:
      - "package.json"
      - "package-lock.json"
      - "requirements.txt"
      - "pom.xml"
  schedule:
    - cron: "0 6 * * 1"  # Escaneo semanal los lunes

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

Generacion de SBOM con CycloneDX

Genera un Software Bill of Materials (SBOM) para rastrear todas las dependencias incluyendo las transitivas:

#!/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

Script de analisis de dependencias transitivas

Identifica que dependencias transitivas introducen vulnerabilidades en un proyecto Node.js:

#!/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

Mejores Practicas Adicionales

  1. Usa analisis de alcanzabilidad para reducir falsos positivos. Herramientas como Snyk Code y OWASP Dep-Check pueden determinar si la funcion vulnerable es realmente llamada en tu codigo. Suprime hallazgos de codigo inalcanzable con justificacion documentada:
# Snyk reachability analysis
snyk test --json --reachable-vulns | \
  jq '.vulnerabilities[] | {
    name: .name,
    reachable: .reachable,
    functions: .reachableFunctions
  }'
  1. Configura comentarios automaticos en PRs para nuevas vulnerabilidades. Configura Dependabot o Snyk para comentar en PRs que introducen dependencias vulnerables, bloqueando el merge hasta que se revisen:
# .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

Errores Comunes Adicionales

  1. Ignorar dependencias de desarrollo en escaneos de vulnerabilidad. Las dependencias dev pueden ser explotadas en entornos CI o por PRs maliciosos. Escanea todas las dependencias, no solo las de produccion:
# Scan both production and dev dependencies
npm audit --production=false
snyk test --dev
  1. No rastrear vulnerabilidades en imagenes base Docker. Los escaneos de dependencias de aplicacion no detectan paquetes a nivel SO en tu imagen base de contenedor. Escanea la imagen por separado:
# Scan Docker image for OS-level vulnerabilities
trivy image --severity HIGH,CRITICAL myapp:latest
grype myapp:latest --fail-on high

Preguntas frecuentes

Como elijo que vulnerabilidades corregir primero?
Prioriza por alcanzabilidad, disponibilidad de exploit, severidad y exposicion a internet. Una vulnerabilidad de CVSS medio en un servicio publico puede ser mas urgente que una de CVSS alto en un job...
Que pasa si no existe una version parchada?
Documenta el control compensatorio, como una regla de WAF, aislamiento de red o validacion de input. Si el riesgo sigue siendo inaceptable, considera eliminar la dependencia o reemplazarla por una...
Quien debe recibir este reporte?
Equipos de ingenieria para remediacion, seguridad para supervision, product owners para decisiones de riesgo y DevOps para coordinacion de despliegue.