一、SBOM 基础概念:从一张零件清单说起
各位工程师同行,咱们今天聊 SBOM。说实话,我第一次听到这个词的时候,脑子里蹦出来的是「这跟 BOM 有啥区别?」——嗯,别急,咱们一步步拆开看。
1.1 什么是 SBOM?
SBOM,全称 Software Bill of Materials,软件物料清单。说白了,就是把你设备里所有软件成分列个明细——哪个开源库、哪个版本、哪个许可证、有没有已知漏洞,全写清楚。
我习惯把它类比成一张「软件成分表」。就像食品包装袋上写着配料、添加剂、过敏原一样,SBOM 告诉你:这台工业设备的固件里用了 Linux 内核 5.10、OpenSSL 1.1.1、某个第三方协议栈 v2.3……每一条都清清楚楚。
核心定义:SBOM 是机器可读的、结构化的软件组件清单,包含组件名称、版本号、供应商、依赖关系、许可证信息以及已知漏洞引用。
举个例子。你设计了一台 CNC 数控系统,里面跑着实时操作系统、运动控制库、HMI 界面框架、通信协议栈。如果客户问「你们系统里有没有 Log4j 漏洞?」——没有 SBOM,你得翻遍所有开发文档、问一圈供应商,折腾好几天。有 SBOM,一条命令就能查出来。
1.2 SBOM 在工业设备中的价值
工业设备跟消费电子产品不一样。一台 PLC 可能要在产线上跑 10 年、15 年,中间不能随便停机升级。这时候 SBOM 的价值就体现出来了。
价值一:漏洞应急响应
我记得 2021 年 Log4j 漏洞爆发时,我们团队接到紧急通知:排查所有在售和在用设备。当时我们刚推行 SBOM 半年,直接导出清单,匹配 CVE 数据库,3 小时内锁定了受影响的产品线和版本。而隔壁没做 SBOM 的部门,整整查了两周。
价值二:许可证合规
工业设备里大量使用开源软件。GPL、LGPL、MIT、Apache……每个许可证的要求不同。我曾经遇到一个项目,因为用了 GPL 协议的库但没有开源自己的驱动代码,差点被客户法务团队叫停。有了 SBOM,许可证信息一目了然,合规审查从「大海捞针」变成「按图索骥」。
价值三:供应链透明度
现在的工业设备,软件供应链越来越长。主控芯片厂商提供 BSP,第三方公司提供协议栈,你自己写应用层。任何一个环节出问题,都可能影响整台设备。SBOM 让你看清整个供应链的软件组成,知道「谁提供了什么、依赖了什么」。
| 应用场景 | 没有 SBOM | 有 SBOM |
|---|---|---|
| 漏洞应急 | 人工排查,耗时数天到数周 | 自动匹配,数小时内完成 |
| 许可证审计 | 依赖开发者记忆,容易遗漏 | 结构化数据,审计可追溯 |
| 供应链管理 | 信息分散,难以追溯 | 统一视图,依赖关系清晰 |
| 产品维护 | 版本混乱,升级风险高 | 版本可控,变更影响可评估 |
我的经验:刚开始推行 SBOM 时,别追求一步到位。先从一个产品线试点,把核心固件的 SBOM 做起来,跑通流程再推广。我见过太多团队想「大而全」,结果半年过去了连一份完整的 SBOM 都没产出来。
1.3 SBOM 与 BOM 的区别与联系
这个问题,几乎每次培训都有人问。咱们用一张图说清楚。
说白了,BOM 管的是「看得见摸得着」的东西——电阻、电容、芯片、接插件。SBOM 管的是「看不见但跑得起来」的东西——操作系统、中间件、协议栈、应用程序。
区别在哪?
- 管理对象不同:BOM 管硬件物料,SBOM 管软件组件。
- 变更频率不同:硬件 BOM 定型后很少改,软件 SBOM 可能每个固件版本都在变。
- 关注维度不同:BOM 关注料号、封装、供应商、成本;SBOM 关注版本、许可证、漏洞、依赖关系。
- 生命周期不同:硬件 BOM 随产品停产而终结,软件 SBOM 在设备服役期内需要持续更新。
联系在哪?
- 一台完整的工业设备,既需要 BOM 来管理硬件生产,也需要 SBOM 来管理软件维护。
- BOM 中的固件版本号,可以关联到对应的 SBOM 文件。
- 变更管理流程可以打通:硬件 ECO 和软件版本更新,统一纳入产品生命周期管理。
避坑指南:我曾经见过一个团队,把 SBOM 直接塞进 BOM 里当一行「软件物料」处理。结果软件版本一更新,BOM 也跟着改,搞得生产部门天天抱怨「BOM 怎么又变了」。记住:SBOM 和 BOM 是两套体系,可以关联,但不要混为一谈。
1.4 一个简单的 SBOM 示例
说了这么多理论,咱们看个实际的。这是一份工业 PLC 固件的 SBOM 片段,用 SPDX 格式表示:
SPDXVersion: SPDX-2.3
DataLicense: CC0-1.0
DocumentName: PLC-Firmware-v3.2.1
SPDXID: SPDXRef-DOCUMENT
## 包信息
PackageName: linux-kernel
SPDXID: SPDXRef-Package-LinuxKernel
PackageVersion: 5.10.120
PackageSupplier: Organization: The Linux Foundation
PackageLicenseConcluded: GPL-2.0-only
PackageLicenseDeclared: GPL-2.0-only
PackageCopyrightText: Copyright (C) 2023 The Linux Foundation
PackageName: openssl
SPDXID: SPDXRef-Package-OpenSSL
PackageVersion: 1.1.1t
PackageSupplier: Organization: OpenSSL Software Foundation
PackageLicenseConcluded: OpenSSL
PackageLicenseDeclared: OpenSSL
ExternalRef: SECURITY CVE CVE-2023-5678
PackageName: modbus-stack
SPDXID: SPDXRef-Package-ModbusStack
PackageVersion: 2.3.0
PackageSupplier: Person: Internal Team
PackageLicenseConcluded: LicenseRef-Proprietary
PackageLicenseDeclared: LicenseRef-Proprietary
## 依赖关系
Relationship: SPDXRef-Package-LinuxKernel DEPENDS_ON SPDXRef-Package-OpenSSL
Relationship: SPDXRef-Package-ModbusStack DEPENDS_ON SPDXRef-Package-LinuxKernel
这份清单告诉我们:固件 v3.2.1 用了 Linux 内核 5.10.120(GPL-2.0 协议)、OpenSSL 1.1.1t(有已知漏洞 CVE-2023-5678)、以及内部开发的 Modbus 协议栈 v2.3。依赖关系也写得很清楚:Modbus 栈依赖内核,内核依赖 OpenSSL。
我的建议:刚开始做 SBOM,别纠结用 SPDX 还是 CycloneDX 格式。先跑起来,把数据攒起来,格式后面可以转。我团队最开始用 Excel 手工维护,后来才迁移到自动化工具。关键是「先有,再优」。