此示例项目依赖于 node-ip npm 包,该包存在 CVE-2024-29415 漏洞。
然而,由于我们的项目并未直接使用存在漏洞的函数 .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
## 概述
│ 分析镜像
────────────────────┼─────────────────────────────────────
Target │ felipecruz1638514/node-ip-vex:v1
digest │ 972354a74233
platform │ linux/arm64
vulnerabilities │ 0C 1H 0M 0L
size │ 48 MB
packages │ 221
## 包与漏洞
0C 1H 0M 0L ip 2.0.1
pkg:npm/[email protected]
✗ HIGH CVE-2024-29415 [服务器端请求伪造 (SSRF)]
https://scout.docker.com/v/CVE-2024-29415
Affected range : <=2.0.1
Fixed version : not fixed
在 1 个包中发现 1 个漏洞
LOW 0
MEDIUM 0
HIGH 1
CRITICAL 0
此命令的输出显示,该 CVE 影响了镜像中的 npm 包 [email protected]。
下一步是生成一份 VEX 文档,用于添加上下文说明:尽管项目中包含了存在漏洞的包 [email protected],但这并不意味着漏洞 CVE-2024-29415 是可利用的。
我们可以使用 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 .
然后,再次运行 Docker Scout 分析并加载 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
## 概述
│ 分析镜像
────────────────────┼─────────────────────────────────────
Target │ felipecruz1638514/node-ip-vex:v2
digest │ 646daafacd8e
platform │ linux/arm64
vulnerabilities │ 0C 1H 0M 0L
size │ 76 MB
packages │ 324
## 包与漏洞
0C 1H 0M 0L ip 2.0.1
pkg:npm/[email protected]
✗ HIGH CVE-2024-29415 [服务器端请求伪造 (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 个包中发现 1 个漏洞
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
## 概述
│ 分析镜像
────────────────────┼─────────────────────────────────────
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 文档不会用于包含证明(attestations)的镜像。如果你的镜像包含任何证明,Docker Scout 将仅在这些证明中查找例外情况,而不会检查镜像文件系统。这就是为什么我们在
docker buildx build命令中禁用了 SBOM 和 provenance。
在 Docker Scout 网站上,v2 标签不再显示 CVE-2024-29415 的高严重性漏洞,因为 Scout 考虑了嵌入在镜像文件系统中的 VEX 文档。

在镜像详情页面上,我们可以看到从镜像文件系统加载的 VEX 文档:
