SPDX 与 CycloneDX:如何选择 SBOM 格式

Sytance · 更新于

SPDX 与 CycloneDX 都能描述软件组件及其关系。选择哪一种,取决于接收方需要的信息,以及其工具支持的格式版本。因此,约定交付格式时,需要写明格式名称、版本、编码方式和必需字段。

接收方需要的信息

固件供应商向制造商交付 SBOM,与产品团队将清单导入漏洞管理服务,可能面对不同的接收要求。接收方支持的格式版本和编码方式决定了哪些文件能够被处理,可以用一份有代表性的文件确认。

列出产品标识、组件标识、依赖关系、许可证,以及本次需要的漏洞或来源信息。如果接收方只支持格式的一部分,应判断丢失字段是否影响这次交换的用途。

规范版本与工具支持

SPDX 2.3 和 SPDX 3.0.1 是分别发布的规范。SPDX 3.0.1 将模型按领域划分,其中定义了软件 SBOM 类。接收工具支持 SPDX 2.3 JSON,并不表示它能够读取 3.x 文档。

CycloneDX 官方规范总览列出的版本是 1.7,其对象模型包含组件、服务、依赖关系和漏洞信息。生成工具可能支持新版规范,而下游导入工具仍只支持较早版本。

交换事项SPDX 示例CycloneDX 示例
版本2.3 或 3.0.11.7
文档标识按具体版本定义序列号与清单修订版本
依赖关系带类型的关系依赖图
验证基线所选版本的规则所选版本的格式定义

依赖关系与许可证字段

SPDX 2.3 中,CONTAINS 表示包含关系,DEPENDS_ON 表示依赖关系。一个软件包位于压缩包中,与另一个软件包构建或运行时需要它,是不同关系。导入时应保留关系类型和方向。

SPDX 2.3 还区分声明的许可证与分析确认的许可证。供应商的声明和分析人员的结论,转换时不应将两者合并。如果这个区别影响评审,接收工具就需要保留它。

使用 CycloneDX 时,检查所选版本中的依赖图与组件引用。转换后平铺清单仍然可读,但可能已经丢失了判断哪个产品使用某组件所需的依赖路径。

转换结果检查

一份小型测试文件就能帮助发现转换时丢失的信息。可以包含产品、直接依赖和间接依赖,再加入同一组件的两个版本、一个许可证表达式和一个明确标为未知的字段。这样能检查工具是否正确保留了信息含义。

  • 按照声明的规范版本校验原始文件。
  • 导入接收工具,检查识别出的目标产品。
  • 比较组件标识、版本和关系方向。
  • 检查许可证字段与未知信息的表达方式。
  • 若支持再导出,比较信息含义,而非文本排版。

交付格式的选择

客户要求 SPDX 2.3 时,应按该版本和约定字段交付。如果转换会丢失其他数据,同时保留信息更完整的源记录。如果既有流程已经接收 CycloneDX,并能保留所需依赖图,则使用双方支持的 CycloneDX 版本。

客户需要两种格式时,需要维护并验证格式之间的字段映射,说明转换时丢失或转入扩展字段的信息。格式转换需要按照目标规范重新组织数据。

导入后,还需要检查接收方能否按预期使用这些信息。例如,进行漏洞分析时,是否能从一个组件找到使用它的产品和版本。

延伸阅读