使用 VEX 抑制图像漏洞
漏洞利用交换 (VEX) 是一种添加有关软件产品如何受易受攻击组件影响的上下文的方法。在本指南中,您将了解:
- VEX 如何帮助您抑制图像中发现的不适用或已修复的漏洞
- 如何创建 VEX 文件和报表
- 如何使用 Docker Scout 应用和使用 VEX 数据
实验性的
对 VEX 的支持是 Docker Scout 中的一项实验性功能。我们建议您不要在生产环境中使用此功能,因为此功能可能会更改或从未来版本中删除。
先决条件
如果您想按照本指南的步骤操作,您将需要以下内容:
VEX简介
仅仅因为软件产品包含易受攻击的组件,并不意味着该漏洞是可利用的。例如,当应用程序运行时,易受攻击的组件可能永远不会加载到内存中。或者漏洞可能已被修复,但检测到漏洞的系统并不知道。
VEX的概念是由美国网络安全和基础设施安全局(CISA)的一个工作组定义的。 VEX 的核心是可利用性评估。这些评估描述了产品的给定 CVE 的状态。 VEX中可能的漏洞状态有:
- 不受影响:此漏洞无需修复。
- 受影响:建议采取措施修复或解决此漏洞。
- 已修复:这些产品版本包含针对该漏洞的修复。
- 正在调查中:尚不清楚这些产品版本是否受到该漏洞的影响。将在以后的版本中提供更新。
VEX 有多种实现,VEX 文档的确切格式和属性因您使用的 VEX 实现而异。 VEX 实现的示例包括:
- 开放VEX
- 开放安全咨询框架 (OSAF)
- 旋风DX
- SPDX
本指南在其示例中使用 OpenVEX 实现。有关 OpenVEX 的更多信息,请参阅 规范。
在所有实现中,核心思想都是相同的:提供一个框架来描述漏洞的影响。无论实施方式如何,VEX 的关键组件包括:
- VEX文件
- 一种用于存储 VEX 语句的安全建议。文件的格式取决于具体的实现。
- VEX声明
- 描述产品中漏洞的状态、是否可利用以及是否有修复该问题的方法。
- 理由和影响
- 根据漏洞状态,声明包括说明产品受到或不受影响的原因的理由或影响声明。
- 行动声明
- 描述如何修复或缓解该漏洞。
VEX 提供的有关漏洞的附加上下文可帮助组织对软件产品进行风险评估。
创建并启用存储库
首先,创建一个要使用的示例项目。使用 Docker Scout 演示服务 模板存储库在您自己的 GitHub 组织中引导新存储库。
从模板创建存储库。
将 Git 存储库克隆到您的计算机。
从存储库构建映像并将其推送到新的 Docker Hub 存储库。
$ cd scout-demo-service $ docker build --provenance=true --sbom=true --tag <ORG>/scout-demo-service:v1 --push .
在存储库上启用 Docker Scout。
$ docker scout repo enable <ORG>/scout-demo-service
检查漏洞
使用该docker scout cves
命令查看镜像的漏洞。出于本指南的目的,我们将重点关注特定的 CVE:CVE-2022-24999。
$ docker scout cves --only-cve-id CVE-2022-24999
此命令的输出显示此 CVE 影响映像中的两个 JavaScript 包:express@4.17.1
和qs@6.7.0
。
现在,假设您已检查此漏洞并确定该漏洞不会影响您的应用程序,因为易受攻击的代码从未执行。HIGH
只需将组件包含在 SBOM 中,您的映像仍会显示为包含严重漏洞。
在这种情况下,VEX 可以帮助抑制您产品的 CVE。
创建VEX文档
OpenVEX 是本指南中使用的 VEX 实现,提供了一个用于生成 VEX 文档的 CLI 工具,称为vexctl
.如果您的系统上安装了 Go,则可以vexctl
使用以下go install
命令进行安装:
$ go install github.com/openvex/vexctl@latest
否则,您可以从GitHub 上的vexctl
发布页面获取预构建的二进制文件。
使用该vexctl create
命令创建 OpenVEX 文档。以下命令创建一个 VEX 文档CVE-2022-24999.vex.json
,其中声明 Docker 映像及其子组件不受 CVE 影响,因为存在漏洞的代码永远不会执行。
$ vexctl create \
--author="author@example.com" \
--product="pkg:docker/<ORG>/scout-demo-service@v1" \
--subcomponents="pkg:npm/express@4.17.1" \
--subcomponents="pkg:npm/qs@6.7.0" \
--vuln="CVE-2022-24999" \
--status="not_affected" \
--justification="vulnerable_code_not_in_execute_path" \
--file="CVE-2022-24999.vex.json"
这将创建一个如下所示的 VEX 文档:
{
"@context": "https://openvex.dev/ns/v0.2.0",
"@id": "https://openvex.dev/docs/public/vex-a7e7c69be57bc49dec9cc2f3a3e3329b12674ca53b53a53ab42134dcc0510779",
"author": "author@example.com",
"timestamp": "2024-02-03T09:33:28.913572+01:00",
"version": 1,
"statements": [
{
"vulnerability": {
"name": "CVE-2022-24999"
},
"timestamp": "2024-02-03T09:33:28.913574+01:00",
"products": [
{
"@id": "pkg:docker/<ORG>/scout-demo-service@v1",
"subcomponents": [
{
"@id": "pkg:npm/express@4.17.1"
},
{
"@id": "pkg:npm/qs@6.7.0"
}
]
}
],
"status": "not_affected",
"justification": "vulnerable_code_not_in_execute_path"
}
]
}
验证 CVE 抑制
要测试 VEX 语句是否提供预期的安全建议,请使用命令docker scout cves
查看 CVE 状态。该--vex-location
标志允许您指定包含 VEX 文档的目录。
$ docker scout cves --only-cve-id CVE-2022-24999 --vex-location .
您现在应该看到VEX
命令的输出中出现字段。
✗ HIGH CVE-2022-24999 [OWASP Top Ten 2017 Category A9 - Using Components with Known Vulnerabilities]
https://scout.docker.com/v/CVE-2022-24999
Affected range : <4.17.3
Fixed version : 4.17.3
CVSS Score : 7.5
CVSS Vector : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
VEX : not affected [vulnerable code not in execute path]
: author@example.com
将 VEX 文档附加到图像
要将 VEX 声明与图像一起分发,您可以将 VEX 文档嵌入到整体证明中。这也是 BuildKit 将 SBOM 和出处证明附加到图像的方式。
当您将 VEX 文档封装在 in-toto 证明中时,OpenVEX 规范建议为 VEX 文档使用不同的格式。 In-toto 证明已在证明谓词中包含图像引用,使得products
VEX 文档的密钥中的图像引用变得多余。相反,products
应该参考包含漏洞的软件包(subcomponents
在前面显示的 VEX 文档中)。
in-toto.vex.json
创建一个包含以下内容的新文档:{ "@context": "https://openvex.dev/ns/v0.2.0", "@id": "https://openvex.dev/docs/public/vex-a7e7c69be57bc49dec9cc2f3a3e3329b12674ca53b53a53ab42134dcc0510779", "author": "author@example.com", "timestamp": "2024-02-03T09:33:28.913572+01:00", "version": 1, "statements": [ { "vulnerability": { "name": "CVE-2022-24999" }, "timestamp": "2024-02-03T09:33:28.913574+01:00", "products": [ { "@id": "pkg:npm/express@4.17.1" }, { "@id": "pkg:npm/qs@6.7.0" } ], "status": "not_affected", "justification": "vulnerable_code_not_in_execute_path" } ] }
附上
in-toto.vex.json
VEX 文件作为证明:$ docker scout attestation add \ --file in-toto.vex.json \ --predicate-type https://openvex.dev/ns/v0.2.0 \ <ORG>/scout-demo-service:v1
这会向图像添加一个完整的证明,其谓词类型为
https://openvex.dev/ns/v0.2.0
.使用 分析图像
docker scout cves
。笔记
这仅在分析注册表中的远程图像时有效。要强制 Docker Scout 分析注册表映像而不是本地映像,请使用前缀指定映像引用
registry://
。$ docker scout cves \ --only-cve-id CVE-2022-24999 \ registry://<ORG>/scout-demo-service:v1
概括
在本指南中,您了解了:
- VEX 是一个如何帮助您优化漏洞分类的概念
- 如何创建 VEX 文档并将其用于图像分析
- 如何将您的图像作为整体证明来分发 VEX
有关 VEX 的更多信息: