
Proyecto de ejemplo que usa VEX para suprimir CVE-2024-29415.
Este proyecto de ejemplo depende del paquete npm node-ip, que es vulnerable a CVE-2024-29415.
Sin embargo, como nuestro proyecto no utiliza directamente la función vulnerable .isPublic(), no es explotable por CVE-2024-29415.
Puedo empaquetar mi proyecto como una imagen de Docker:
docker buildx build -t felipecruz1638514/node-ip-vex:v1 .
Y ejecutar un análisis de Docker Scout para comprobar si mi proyecto es vulnerable a CVE-2024-29415:
docker scout cves felipecruz1638514/node-ip-vex:v1 --only-cve-id CVE-2024-29415
✓ Image stored for indexing
✓ Indexed 221 packages
✓ Provenance obtained from attestation
✗ Detected 1 vulnerable package with 1 vulnerability
## Overview
│ Analyzed Image
────────────────────┼─────────────────────────────────────
Target │ felipecruz1638514/node-ip-vex:v1
digest │ 972354a74233
platform │ linux/arm64
vulnerabilities │ 0C 1H 0M 0L
size │ 48 MB
packages │ 221
## Packages and Vulnerabilities
0C 1H 0M 0L ip 2.0.1
pkg:npm/[email protected]
✗ HIGH CVE-2024-29415 [Server-Side Request Forgery (SSRF)]
https://scout.docker.com/v/CVE-2024-29415
Affected range : <=2.0.1
Fixed version : not fixed
1 vulnerability found in 1 package
LOW 0
MEDIUM 0
HIGH 1
CRITICAL 0
La salida de este comando muestra que este CVE afecta al paquete npm [email protected] en la imagen.
El siguiente paso es generar un documento VEX para añadir contexto sobre el hecho de que, por el mero hecho de contener un paquete vulnerable - [email protected] - no significa que la vulnerabilidad sea explotable por CVE-2024-29415.
Podemos usar vexctl para crear un documento VEX:
vexctl create \
--author="[email protected]" \
--product="pkg:docker/felipecruz1638514/node-ip-vex@v2" \
--subcomponents="pkg:npm/[email protected]" \
--vuln="CVE-2024-29415" \
--status="not_affected" \
--justification="vulnerable_code_not_in_execute_path" \
--file="CVE-2024-29415.vex.json"
Para comprobar si el CVE ha sido suprimido, podemos volver a construir la imagen con una nueva etiqueta (v2) y copiar la declaración VEX en el sistema de archivos de la imagen. Ese paso ya está cubierto mediante el COPY . . en el Dockerfile existente.
docker buildx build -t felipecruz1638514/node-ip-vex:v2 .
A continuación, ejecuta de nuevo el análisis de Docker Scout cargando el documento VEX:
docker scout cves felipecruz1638514/node-ip-vex:v2 --only-cve-id CVE-2024-29415 --vex-location .
✓ Image stored for indexing
✓ Indexed 324 packages
✓ Loaded 1 VEX document
✗ Detected 1 vulnerable package with 1 vulnerability
## Overview
│ Analyzed Image
────────────────────┼─────────────────────────────────────
Target │ felipecruz1638514/node-ip-vex:v2
digest │ 646daafacd8e
platform │ linux/arm64
vulnerabilities │ 0C 1H 0M 0L
size │ 76 MB
packages │ 324
## Packages and Vulnerabilities
0C 1H 0M 0L ip 2.0.1
pkg:npm/[email protected]
✗ HIGH CVE-2024-29415 [Server-Side Request Forgery (SSRF)]
https://scout.docker.com/v/CVE-2024-29415
Affected range : <=2.0.1
Fixed version : not fixed
VEX : not affected [vulnerable code not in execute path]
: [email protected]
1 vulnerability found in 1 package
LOW 0
MEDIUM 0
HIGH 1
CRITICAL 0
Observa en la salida anterior que CVE-2024-29415 ha sido suprimido:
VEX : not affected [vulnerable code not in execute path]
: [email protected]
También puedes usar la opción --only-vex-affected para filtrar el CVE suprimido:
docker scout cves felipecruz1638514/node-ip-vex:v2 --only-cve-id CVE-2024-29415 --vex-location . --only-vex-affected
✓ SBOM of image already cached, 324 packages indexed
✓ Loaded 1 VEX document
✓ No vulnerable package detected
## Overview
│ Analyzed Image
────────────────────┼─────────────────────────────────────
Target │ felipecruz1638514/node-ip-vex:v2
digest │ 646daafacd8e
platform │ linux/arm64
vulnerabilities │ 0C 0H 0M 0L
size │ 76 MB
packages │ 324
Por último, subamos la imagen a Docker Scout (scout.docker.com) e inspeccionémosla en la interfaz:
docker buildx build --sbom=false --provenance=false -t felipecruz1638514/node-ip-vex:v2 --push .
Nota: los documentos VEX incrustados en el sistema de archivos de la imagen no se tienen en cuenta para imágenes que tengan attestations. Si tu imagen tiene attestations, Docker Scout solo buscará excepciones en las attestations, y no en el sistema de archivos de la imagen. Por eso deshabilitamos el SBOM y la provenance en el comando
docker buildx build.
En el sitio web de Docker Scout, la etiqueta v2 ya no muestra la vulnerabilidad CVE-2024-29415 con severidad HIGH, ya que Scout tiene en cuenta el documento VEX incrustado en el sistema de archivos de la imagen.

En la página de detalles de la imagen, podemos ver el documento VEX que se cargó desde el sistema de archivos de la imagen:
