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.1 | 1.7 |
| 文档标识 | 按具体版本定义 | 序列号与清单修订版本 |
| 依赖关系 | 带类型的关系 | 依赖图 |
| 验证基线 | 所选版本的规则 | 所选版本的格式定义 |
依赖关系与许可证字段
SPDX 2.3 中,CONTAINS 表示包含关系,DEPENDS_ON 表示依赖关系。一个软件包位于压缩包中,与另一个软件包构建或运行时需要它,是不同关系。导入时应保留关系类型和方向。
SPDX 2.3 还区分声明的许可证与分析确认的许可证。供应商的声明和分析人员的结论,转换时不应将两者合并。如果这个区别影响评审,接收工具就需要保留它。
使用 CycloneDX 时,检查所选版本中的依赖图与组件引用。转换后平铺清单仍然可读,但可能已经丢失了判断哪个产品使用某组件所需的依赖路径。
转换结果检查
一份小型测试文件就能帮助发现转换时丢失的信息。可以包含产品、直接依赖和间接依赖,再加入同一组件的两个版本、一个许可证表达式和一个明确标为未知的字段。这样能检查工具是否正确保留了信息含义。
- 按照声明的规范版本校验原始文件。
- 导入接收工具,检查识别出的目标产品。
- 比较组件标识、版本和关系方向。
- 检查许可证字段与未知信息的表达方式。
- 若支持再导出,比较信息含义,而非文本排版。
交付格式的选择
客户要求 SPDX 2.3 时,应按该版本和约定字段交付。如果转换会丢失其他数据,同时保留信息更完整的源记录。如果既有流程已经接收 CycloneDX,并能保留所需依赖图,则使用双方支持的 CycloneDX 版本。
客户需要两种格式时,需要维护并验证格式之间的字段映射,说明转换时丢失或转入扩展字段的信息。格式转换需要按照目标规范重新组织数据。
导入后,还需要检查接收方能否按预期使用这些信息。例如,进行漏洞分析时,是否能从一个组件找到使用它的产品和版本。