docker scout cves

描述显示软件工件中识别的 CVE
用法docker scout cves [OPTIONS] [IMAGE|DIRECTORY|ARCHIVE]

描述

docker scout cves 命令分析软件工件以查找漏洞。

如果未指定图像,则使用最近构建的图像。

支持以下工件类型

  • 图像
  • OCI 布局目录
  • 通过 docker save 创建的 Tarball 归档文件
  • 本地目录或文件

默认情况下,该工具期望一个图像引用,例如

  • redis
  • curlimages/curl:7.87.0
  • mcr.microsoft.com/dotnet/runtime:7.0

如果您要分析的工件是 OCI 目录、Tarball 归档文件、本地文件或目录,或者您希望控制图像解析的来源,则必须在引用之前添加以下前缀之一

  • image://(默认)使用本地图像,或回退到注册表查找
  • local:// 使用本地图像存储中的图像(不进行注册表查找)
  • registry:// 使用注册表中的图像(不使用本地图像)
  • oci-dir:// 使用 OCI 布局目录
  • archive:// 使用通过 docker save 创建的 Tarball 归档文件
  • fs:// 使用本地目录或文件
  • sbom:// SPDX 文件或带有 SPDX 谓词的 in-toto 证明文件或 syft json SBOM 文件。如果使用 sbom:// 前缀,如果未定义文件,则它将尝试从标准输入读取文件。

选项

选项默认值描述
--details在默认文本输出上打印详细信息
--env环境名称
--epss显示 EPSS 分数,并根据其 EPSS 分数组织软件包的 CVE
--epss-percentile排除 EPSS 分数低于指定百分位数(0 到 1)的 CVE
--epss-score排除 EPSS 分数低于指定值(0 到 1)的 CVE
-e, --exit-code如果检测到漏洞,则返回退出代码“2”
--formatpackages生成的漏洞报告的输出格式
- packages:默认输出,纯文本,漏洞按包分组
- sarif:json Sarif 输出
- spdx:json SPDX 输出
- gitlab:json GitLab 输出
- markdown:markdown 输出(包括一些 html 标签,如可折叠部分)
- sbom:json SBOM 输出
--ignore-base过滤掉从基础镜像引入的 CVE
--locations打印包位置,包括文件路径和层 diff_id
--multi-stage显示来自多阶段 Docker 构建的包
--only-base仅显示由基础镜像引入的 CVE
--only-cisa-kev过滤到 CISA KEV 目录中列出的 CVE
--only-cve-id要搜索的 CVE ID 的逗号分隔列表(如 CVE-2021-45105)
--only-fixed过滤到可修复的 CVE
--only-metric逗号分隔的 CVSS 指标列表(如 AV:N 或 PR:L),用于根据这些指标过滤 CVE
--only-package逗号分隔的正则表达式,用于按包过滤
--only-package-type逗号分隔的包类型列表(如 apk、deb、rpm、npm、pypi、golang 等)
--only-severity逗号分隔的严重程度列表(严重、高、中、低、未指定),用于根据这些严重程度过滤 CVE
--only-stage逗号分隔的多阶段 Docker 构建阶段名称列表
--only-unfixed过滤到未修复的 CVE
--only-vex-affected根据 VEX 语句(状态不影响)过滤 CVE
--only-vuln-packages与 --format=only-packages 一起使用时,忽略没有漏洞的包
--orgDocker 组织的命名空间
-o, --output将报告写入文件
--platform要分析的镜像的平台
--ref如果提供的 tarball 包含多个引用,则要使用的引用。
只能与存档一起使用
--vex-author要接受的 VEX 语句作者列表
--vex-location包含 VEX 语句的目录或文件的文件夹位置

示例

按包显示漏洞

$ docker scout cves alpine
Analyzing image alpine
✓ Image stored for indexing
✓ Indexed 18 packages
✓ No vulnerable package detected

显示来自 docker save tarball 的漏洞

$ docker save alpine > alpine.tar

$ docker scout cves archive://alpine.tar
Analyzing archive alpine.tar
✓ Archive read
✓ SBOM of image already cached, 18 packages indexed
✓ No vulnerable package detected

显示来自 OCI 目录的漏洞

$ skopeo copy --override-os linux docker://alpine oci:alpine

$ docker scout cves oci-dir://alpine
Analyzing OCI directory alpine
✓ OCI directory read
✓ Image stored for indexing
✓ Indexed 19 packages
✓ No vulnerable package detected

显示来自当前目录的漏洞

$ docker scout cves fs://.

将漏洞导出到 SARIF JSON 文件

$ docker scout cves --format sarif --output alpine.sarif.json alpine
Analyzing image alpine
✓ SBOM of image already cached, 18 packages indexed
✓ No vulnerable package detected
✓ Report written to alpine.sarif.json

显示 markdown 输出

以下示例演示如何将漏洞报告生成 markdown 格式。

$ docker scout cves --format markdown alpine
✓ Pulled
✓ SBOM of image already cached, 19 packages indexed
✗ Detected 1 vulnerable package with 3 vulnerabilities
<h2>:mag: Vulnerabilities of <code>alpine</code></h2>

<details open="true"><summary>:package: Image Reference</strong> <code>alpine</code></summary>
<table>
<tr><td>digest</td><td><code>sha256:e3bd82196e98898cae9fe7fbfd6e2436530485974dc4fb3b7ddb69134eda2407</code></td><tr><tr><td>vulnerabilities</td><td><img alt="critical: 0" src="https://img.shields.io/badge/critical-0-lightgrey"/> <img alt="high: 0" src="https://img.shields.io/badge/high-0-lightgrey"/> <img alt="medium: 2" src="https://img.shields.io/badge/medium-2-fbb552"/> <img alt="low: 0" src="https://img.shields.io/badge/low-0-lightgrey"/> <img alt="unspecified: 1" src="https://img.shields.io/badge/unspecified-1-lightgrey"/></td></tr>
<tr><td>platform</td><td>linux/arm64</td></tr>
<tr><td>size</td><td>3.3 MB</td></tr>
<tr><td>packages</td><td>19</td></tr>
</table>
</details></table>
</details>
...

列出特定类型的漏洞包

以下示例演示如何生成包列表,只包含指定类型的包,并且只显示有漏洞的包。

$ docker scout cves --format only-packages --only-package-type golang --only-vuln-packages golang:1.18.0
✓ Pulled
✓ SBOM of image already cached, 296 packages indexed
✗ Detected 1 vulnerable package with 40 vulnerabilities

Name   Version   Type         Vulnerabilities
───────────────────────────────────────────────────────────
stdlib  1.18     golang     2C    29H     8M     1L

显示 EPSS 分数(--epss)

--epss 标志将 漏洞预测评分系统 (EPSS) 分数添加到 docker scout cves 的输出中。EPSS 分数是软件漏洞在未来 30 天内在野外被利用的可能性(概率)的估计。分数越高,漏洞被利用的可能性越大。

$ docker scout cves --epss nginx
 ✓ Provenance obtained from attestation
 ✓ SBOM obtained from attestation, 232 packages indexed
 ✓ Pulled
 ✗ Detected 23 vulnerable packages with a total of 39 vulnerabilities

...

 ✗ HIGH CVE-2023-52425
   https://scout.docker.com/v/CVE-2023-52425
   Affected range  : >=2.5.0-1
   Fixed version   : not fixed
   EPSS Score      : 0.000510
   EPSS Percentile : 0.173680
  • EPSS 分数 是一个介于 0 和 1 之间的浮点数,表示在未来 30 天(在分数发布后)在野外被利用的概率。
  • EPSS 百分位数 是当前分数的百分位数,即所有具有相同或更低 EPSS 分数的漏洞的比例。

您可以使用 --epss-score--epss-percentile 标志根据这些分数过滤 docker scout cves 的输出。例如,要仅显示 EPSS 分数高于 0.5 的漏洞

$ docker scout cves --epss --epss-score 0.5 nginx
 ✓ SBOM of image already cached, 232 packages indexed
 ✓ EPSS scores for 2024-03-01 already cached
 ✗ Detected 1 vulnerable package with 1 vulnerability

...

 ✗ LOW CVE-2023-44487
   https://scout.docker.com/v/CVE-2023-44487
   Affected range  : >=1.22.1-9
   Fixed version   : not fixed
   EPSS Score      : 0.705850
   EPSS Percentile : 0.979410

EPSS 分数每天更新。默认情况下,将显示最新的可用分数。您可以使用 --epss-date 标志以 yyyy-mm-dd 格式手动指定一个日期,用于获取 EPSS 分数。

$ docker scout cves --epss --epss-date 2024-01-02 nginx

列出来自 SPDX 文件的漏洞

以下示例演示如何使用 syft 从 SPDX 文件生成漏洞列表。

$ syft -o spdx-json alpine:3.16.1 | docker scout cves sbom://
 ✔ Pulled image
 ✔ Loaded image                                                                                                                              alpine:3.16.1
 ✔ Parsed image                                                                    sha256:3d81c46cd8756ddb6db9ec36fa06a6fb71c287fb265232ba516739dc67a5f07d
 ✔ Cataloged contents                                                                     274a317d88b54f9e67799244a1250cad3fe7080f45249fa9167d1f871218d35f
   ├── ✔ Packages                        [14 packages]
   ├── ✔ File digests                    [75 files]
   ├── ✔ File metadata                   [75 locations]
   └── ✔ Executables                     [16 executables]
    ✗ Detected 2 vulnerable packages with a total of 11 vulnerabilities