
VEX를 사용하여 CVE-2024-29415를 억제하는 샘플 프로젝트.
이 샘플 프로젝트는 CVE-2024-29415에 취약한 node-ip npm 패키지에 의존합니다.
그러나 우리 프로젝트는 취약한 함수 .isPublic()을 직접 사용하지 않기 때문에 CVE-2024-29415에 대해 악용 가능하지 않습니다.
프로젝트를 Docker 이미지로 패키징할 수 있습니다:
docker buildx build -t felipecruz1638514/node-ip-vex:v1 .
그리고 Docker Scout 분석을 실행하여 프로젝트가 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
이 명령의 출력은 이 CVE가 이미지 내의 npm 패키지 [email protected]에 영향을 미친다는 것을 보여줍니다.
다음 단계는 취약한 패키지([email protected])가 포함되어 있다고 해서 CVE-2024-29415에 대해 악용 가능한 것은 아니라는 맥락을 추가하는 VEX 문서를 생성하는 것입니다.
vexctl을 사용하여 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"
CVE가 억제되었는지 테스트하기 위해 새 태그(v2)로 이미지를 다시 빌드하고 VEX 문을 이미지 파일 시스템에 복사할 수 있습니다. 이 단계는 기존 Dockerfile의 COPY . .를 사용하여 이미 처리되어 있습니다.
docker buildx build -t felipecruz1638514/node-ip-vex:v2 .
그런 다음 VEX 문서를 로드하여 Docker Scout 분석을 다시 실행합니다:
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
위 출력에서 CVE-2024-29415가 억제되었음을 확인할 수 있습니다:
VEX : not affected [vulnerable code not in execute path]
: [email protected]
또한 --only-vex-affected 플래그를 사용하여 억제된 CVE를 필터링할 수 있습니다:
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
마지막으로 이미지를 Docker Scout(scout.docker.com)에 푸시하고 UI에서 검사해 보겠습니다:
docker buildx build --sbom=false --provenance=false -t felipecruz1638514/node-ip-vex:v2 --push .
참고: 이미지 파일 시스템에 포함된 VEX 문서는 증명(attestation)이 있는 이미지에서는 고려되지 않습니다. 이미지에 증명이 있는 경우 Docker Scout는 증명 내에서만 예외를 찾고 이미지 파일 시스템에서는 찾지 않습니다. 그래서
docker buildx build명령에서 SBOM과 증명을 비활성화했습니다.
Docker Scout 웹사이트에서 v2 태그는 더 이상 HIGH 심각도의 CVE-2024-29415 취약점을 표시하지 않습니다. Scout가 이미지 파일 시스템에 포함된 VEX 문서를 고려하기 때문입니다.

이미지 세부 정보 페이지에서 이미지 파일 시스템에서 로드된 VEX 문서를 볼 수 있습니다:
