ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Trivy VEX SBOM Reference 实战指南:通过 CycloneDX externalReferences 动态关联外部 VEX 文档

Trivy VEX SBOM Reference 实战指南:通过 CycloneDX externalReferences 动态关联外部 VEX 文档 Trivy VEX SBOM Reference 实战指南通过 CycloneDX externalReferences 动态关联外部 VEX 文档【免费下载链接】trivyFind vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more项目地址: https://gitcode.com/GitHub_Trending/tr/trivyTrivy 在漏洞扫描中支持以 VEXVulnerability Exploitability eXchange漏洞可利用性交换文档过滤已检出漏洞其中sbom-refSBOM Reference模式可让 Trivy 从被扫描的 CycloneDX SBOM 的externalReferences中自动发现并拉取远程托管的 VEX 文档无需在命令行中显式指定 VEX 文件路径。本文以 docs/guide/supply-chain/vex/sbom-ref.md 为核心结合仓库源码讲解该模式的启用方式、SBOM 声明格式、底层检索与过滤原理帮助你为SBOM 即漏洞声明载体的供应链场景构建可自动同步的 VEX 分发链路。功能状态EXPERIMENTAL实验性。该特性当前可能在不保证向后兼容的情况下变更生产环境启用前请关注版本更新与升级公告。一、VEX 与 Trivy 的四种使用方式VEX 是行业标准化的漏洞可利用性信息交换格式通过提前声明某个产品不受某个漏洞影响not affected等状态扫描器可以在扫描阶段直接过滤掉这些已确认的漏洞从而减少误报。Trivy 将其作为漏洞过滤机制之一当前共支持四种 VEX 接入方式见 docs/guide/supply-chain/vex/index.mdVEX Repository--vex repo从 VEX 仓库自动同步更新见 docs/guide/supply-chain/vex/repo.mdLocal VEX Files--vex /path/to/vex.json显式指定本地文件支持 CycloneDX、OpenVEX、CSAF 三种格式见 docs/guide/supply-chain/vex/file.mdVEX Attestation--vex oci在 OCI 镜像仓库中发现并加载 VEX 签名声明见 docs/guide/supply-chain/vex/oci.mdSBOM Reference--vex sbom-ref从被扫描 SBOM 的externalReferences中动态解析远程 VEX 文档即本文主题见 docs/guide/supply-chain/vex/sbom-ref.md。这四种方式可以同时启用--vex参数的指定顺序决定了优先级先指定的来源优先。sbom-ref的特殊价值在于VEX 文件的地址被编码在 SBOM 本身中SBOM 的持有者、发布者或分发链路例如制品仓库、镜像仓库、CI 流水线都可以直接维护这份远程声明消费者拿到 SBOM 即可自动获得对应的 VEX无需额外协调文件分发渠道。二、--vex sbom-ref的工作原理2.1 整体流程sbom-ref模式的完整链路可以分为四个阶段扫描入口用户对 CycloneDX 格式的 SBOM 执行trivy sbom trivy.cdx.json --vex sbom-ref来源解析Trivy 读取 SBOM 顶层的externalReferences筛选出类型为exploitability-statement的引用pkg/sbom/cyclonedx/unmarshal.go#L142-L150 将其映射为内部类型ExternalReferenceVEX定义于 pkg/sbom/core/bom.go#L62远程拉取仅对http/https绝对 URL 通过 HTTP GET 下载 VEX 文档pkg/vex/sbomref.go漏洞过滤下载的 VEX 与显式指定的文件 VEX 走同一套解码与过滤逻辑将声明为not_affected的漏洞从扫描结果中剔除。2.2 源码级解析NewSBOMReferenceSetsbom-ref对应的核心实现是NewSBOMReferenceSetpkg/vex/sbomref.go#L23-L42关键逻辑如下前置约束report.ArtifactType必须为ftypes.TypeCycloneDX否则直接报错 externalReferences can only be used when scanning CycloneDX SBOMs——也就是说该模式只适用于 CycloneDX SBOM 扫描引用提取通过report.BOM.ExternalReferences()实现见 pkg/sbom/core/bom.go#L357-L359取出 SBOM 中全部外部引用URL 解析过滤parseToURLspkg/vex/sbomref.go#L44-L56只保留类型为ExternalReferenceVEX且 scheme 为https或http的绝对 URL相对 URL 会被忽略并发拉取与解码retrieveExternalVEXDocumentpkg/vex/sbomref.go#L77-L100逐个执行http.Get校验响应状态码必须为 200然后读取响应体并交给统一的decodeVEX解码器无引用容错若 SBOM 中不存在任何合法引用retrieveExternalVEXDocuments返回nilNewSBOMReferenceSet相应返回nil此时 Trivy 会记录 No external VEX documents found 并静默跳过不会中断扫描。在 pkg/vex/vex.go#L118-L124 的New函数中TypeSBOMReference分支调用上述构造函数若返回nil无可用 VEXTrivy 会输出 VEX filtering is disabled 并继续执行常规扫描。2.3 过滤器如何生效下载的 VEX 文档会被纳入Client的VEXes列表与文件来源的 VEX 完全等价。过滤时Filterpkg/vex/vex.go#L69-L91会基于扫描结果重新编码内部 BOMsbomio.NewEncoder以还原组件依赖树对每个检出的漏洞调用NotAffected判断是否存在 VEX 声明其不受影响reachRootpkg/vex/vex.go#L177-L219沿组件树从叶子向根做深度优先遍历——只有当从漏洞组件到根节点的所有路径都被 VEX 声明为不受影响时该漏洞才会被过滤只要存在一条未声明路径默认视为受影响漏洞就保留被过滤的漏洞会追加到result.ModifiedFindings可用--show-suppressed标志在结果中显示。三、在 CycloneDX SBOM 中声明外部 VEX3.1 顶层 externalReferences 结构要让 Trivy 动态解析远程 VEX 文件被扫描的 CycloneDX SBOM 的顶层必须包含如下externalReferences注意该字段在 CycloneDX JSON 中位于 BOM 的顶层与metadata、components平级externalReferences: [ { type: exploitability-statement, url: https://vex.example.com/vex } ]两个关键字段字段取值说明typeexploitability-statement必须是该枚举值Trivy 才会将其识别为 VEX 外部引用其他类型会被忽略pkg/sbom/cyclonedx/unmarshal.go#L142-L150urlhttp://或https://绝对地址VEX 文档的下载地址仅支持 HTTP(S) scheme相对路径不会被解析pkg/vex/sbomref.go#L44-L56SBOM 可以同时声明多个外部引用Trivy 会依次拉取并全部纳入过滤。注意任何被引用的 URL 返回非 200 状态码如 404或文档无法解码为合法 VEX 时retrieveExternalVEXDocuments会返回错误并使sbom-ref来源加载失败——这一点在下方测试用例中有所印证。3.2 将 VEX 托管在 GitHub 上该机制同样支持把 VEX 文件存放在 GitHub 等代码托管平台通过 raw 链接引用。官方文档给出的示例指向 Trivy 项目自身的 OpenVEX 文件externalReferences: [ { type: exploitability-statement, url: https://raw.githubusercontent.com/aquasecurity/trivy/refs/heads/main/.vex/trivy.openvex.json } ]这种做法的实际收益是VEX 的更新与代码/SBOM 发布解耦。当维护者提交新的 VEX 声明例如某组件经分析确认不受某 CVE 影响时消费者无需重新生成 SBOM 或升级 Trivy只要重新扫描即可拉到最新声明SBOM 与 VEX 之间的引用关系天然记录了这份声明是针对哪个 BOM 的可追溯性也更强。3.3 支持的 VEX 文档格式通过externalReferences下载的 VEX 文档与本地文件模式走同一个解码器decodeVEX因此支持的格式与 docs/guide/supply-chain/vex/file.md 一致CycloneDX VEXIndependent BOM 形式即独立的 VEX BOMOpenVEXCSAF。以 OpenVEX 为例一份合法的 VEX 文档形如仓库测试数据 pkg/vex/testdata/openvex.json{ context: https://openvex.dev/ns/v0.2.0, author: Aqua Security, role: Project Release Bot, timestamp: 2023-01-16T19:07:16.853479631-06:00, version: 1, statements: [ { vulnerability: { name: CVE-2021-44228 }, products: [ { id: pkg:maven/org.springframework.boot/spring-boot2.6.0 } ], status: not_affected, justification: vulnerable_code_not_in_execute_path } ] }其中products[].id使用 PURLPackage URL标识产品匹配规则无版本匹配所有版本、无 qualifier 匹配任意变体、带 qualifier 则需完全一致等详见 docs/guide/supply-chain/vex/file.md 附录的 PURL matching 一节。四、实战启用 sbom-ref 扫描4.1 命令与预期输出假设本地已有一份包含上述externalReferences的 CycloneDX SBOM 文件trivy.cdx.json执行$ trivy sbom trivy.cdx.json --vex sbom-ref 2025-01-19T13:29:3101:00 INFO [vex] Retrieving external VEX document from host vex.example.com typeexternalReference 2025-01-19T13:29:3101:00 INFO Some vulnerabilities have been ignored/suppressed. Use the --show-suppressed flag to display them.输出解读第一条 INFO 日志日志前缀为vex属性typeexternalReference对应 pkg/vex/sbomref.go#L28-L29 设置的上下文表示 Trivy 正在从vex.example.com拉取外部 VEX第二条 INFO 表示已有漏洞依据 VEX 被抑制/过滤若想查看被过滤的具体漏洞追加--show-suppressed即可。4.2 与命令行--vex的关系--vex sbom-ref只是把 VEX 文档的获取方式从用户显式指定文件换成从 SBOM 引用自动发现。在 pkg/vex/vex.go#L48-L62 的NewSource中sbom-ref是关键字来源类型之一另有repo/oci其余字符串一律视为文件路径并在 pkg/flag/vulnerability_flags.go#L28-L32 中注册为--vex标志配置项名vulnerability.vex。因此--vex同样接受逗号分隔的多来源例如$ trivy sbom trivy.cdx.json --vex repo --vex sbom-ref会先尝试 VEX Repository再尝试 SBOM 外部引用两个来源的声明共同参与过滤。4.3 与其它扫描目标的关系需要强调的是externalReferences目前仅在扫描 CycloneDX SBOM 时被读取pkg/vex/sbomref.go#L23-L26 的强类型校验。对容器镜像、文件系统、代码仓库等目标执行trivy image/trivy fs时请改用--vex repo、--vex oci或本地文件路径这些目标上的 VEX 支持矩阵见 docs/guide/supply-chain/vex/file.md 中的各格式表格。五、行为验证单元测试覆盖的场景仓库在 pkg/vex/sbomref_test.go 中通过httptest本地服务器对sbom-ref行为做了完整验证覆盖了四类典型场景可作为理解该特性边界的参考测试场景预期结果说明外部 VEX 正常检索/openvex成功返回 1 个 VEX服务器返回合法 OpenVEX 文档pkg/vex/testdata/openvex.json不兼容的外部 VEX/unknown报错unable to load VEX from external reference返回内容无法被解码为受支持的 VEX 格式VEX 不存在/not-found报错unexpected status code 404服务器返回 404非 200 状态码直接失败无任何外部引用返回空0 个 VEX没有externalReferences时静默跳过不报错这些用例印证了 2.1 节的完整链路类型过滤仅exploitability-statement→ URL scheme 校验仅 http/https→ HTTP GET 与状态码校验必须 200→ 统一解码三种 VEX 格式→ 进入漏洞过滤管线。六、使用建议与限制明确适用场景sbom-ref最适合SBOM 随制品一起分发、VEX 集中远程维护的供应链场景。发布方在 SBOM 中写入exploitability-statement引用后消费方扫描即可自动应用最新漏洞声明省去了 VEX 文件的人工分发与版本对齐成本。注意网络可达性拉取是扫描时实时进行的 HTTP(S) 请求若扫描环境如离线 CI 节点无法访问被引用主机sbom-ref来源会加载失败。离线或内网环境建议改用--vex repo或本地文件方式。谨慎对待误报VEX 声明的是不受影响判断只应在确认漏洞不可利用时使用Trivy 会要求从漏洞组件到根节点的所有路径都被声明才过滤pkg/vex/vex.go#L177-L219但仍需由发布方保证声明的准确性。关注实验性状态该特性含--vex整体标记为 EXPERIMENTAL接口与行为可能在不兼容的情况下变化升级 Trivy 后请回归验证过滤结果。检查被抑制漏洞生产扫描建议同时使用--show-suppressed审计被 VEX 过滤的漏洞确保声明与预期一致避免安全漏洞被误屏蔽。七、相关文档与源码索引本文主文档docs/guide/supply-chain/vex/sbom-ref.mdVEX 使用方式总览docs/guide/supply-chain/vex/index.md本地 VEX 文件格式与 PURL 匹配规则docs/guide/supply-chain/vex/file.mdVEX 仓库模式docs/guide/supply-chain/vex/repo.mdVEX OCI Attestation 模式docs/guide/supply-chain/vex/oci.md核心实现pkg/vex/sbomref.go、pkg/vex/vex.go单元测试pkg/vex/sbomref_test.go、测试数据 pkg/vex/testdata/openvex.json类型映射pkg/sbom/cyclonedx/unmarshal.go#L142-L150、pkg/sbom/core/bom.go#L62标志定义pkg/flag/vulnerability_flags.go#L28-L32【免费下载链接】trivyFind vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more项目地址: https://gitcode.com/GitHub_Trending/tr/trivy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表