使用 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 组织中引导新存储库。

  1. 从模板创建存储库。

  2. 将 Git 存储库克隆到您的计算机。

  3. 从存储库构建映像并将其推送到新的 Docker Hub 存储库。

    $ cd scout-demo-service
    $ docker build --provenance=true --sbom=true --tag <ORG>/scout-demo-service:v1 --push .
    
  4. 在存储库上启用 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.1qs@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 证明已在证明谓词中包含图像引用,使得productsVEX 文档的密钥中的图像引用变得多余。相反,products应该参考包含漏洞的软件包(subcomponents在前面显示的 VEX 文档中)。

  1. 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"
        }
      ]
    }
  2. 附上in-toto.vex.jsonVEX 文件作为证明:

    $ 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.

  3. 使用 分析图像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 的更多信息: