
Projeto de exemplo que usa VEX para suprimir CVE-2024-29415.
Este projeto de exemplo depende do pacote npm node-ip que é vulnerável a CVE-2024-29415.
No entanto, porque o nosso projeto não utiliza diretamente a função vulnerável .isPublic(), ele não é explorável para CVE-2024-29415.
Posso empacotar meu projeto como uma imagem Docker:
docker buildx build -t felipecruz1638514/node-ip-vex:v1 .
E executar uma análise do Docker Scout para verificar se meu projeto é vulnerável 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
A saída deste comando mostra que este CVE afeta o pacote npm [email protected] na imagem.
O próximo passo é gerar um documento VEX para adicionar contexto sobre o fato de que, só porque contém um pacote vulnerável - [email protected] - não significa que a vulnerabilidade seja explorável para CVE-2024-29415.
Podemos usar vexctl para criar um 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 testar se o CVE foi suprimido, podemos construir a imagem novamente sob uma nova tag (v2) e copiar a declaração VEX para o sistema de arquivos da imagem. Esse passo já está coberto usando o COPY . . no Dockerfile existente.
docker buildx build -t felipecruz1638514/node-ip-vex:v2 .
Em seguida, execute a análise do Docker Scout novamente carregando o 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
Observe na saída acima que CVE-2024-29415 foi suprimido:
VEX : not affected [vulnerable code not in execute path]
: [email protected]
Além disso, você pode usar a flag --only-vex-affected para filtrar o 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
Finalmente, vamos enviar a imagem para o Docker Scout (scout.docker.com) e inspecioná-la na interface:
docker buildx build --sbom=false --provenance=false -t felipecruz1638514/node-ip-vex:v2 --push .
Nota: Documentos VEX incorporados no sistema de arquivos da imagem não são considerados para imagens que possuem atestações. Se sua imagem tiver alguma atestação, o Docker Scout procurará apenas exceções nas atestações, e não no sistema de arquivos da imagem. É por isso que desabilitamos o SBOM e a proveniência no comando
docker buildx build.
No site do Docker Scout, a tag v2 não mostra mais a vulnerabilidade CVE-2024-29415 com severidade ALTA, pois o Scout leva em conta o documento VEX incorporado no sistema de arquivos da imagem.

Na página de detalhes da imagem, podemos ver o documento VEX que foi carregado do sistema de arquivos da imagem:
