是什么
SBOM(Software Bill of Materials,软件物料清单):一份软件中包含的所有组件的结构化清单。
类比:食品的配料表、制造业的 BOM(物料清单)。
通常包含:
- 每个组件的名称、版本;
- 供应商/作者;
- 依赖关系(谁依赖谁);
- 许可证信息;
- 唯一标识符(便于跨系统比对)。
为什么重要
一、漏洞响应
当一个新漏洞公布时(如 Log4Shell),最关键的问题是:
"我们哪些系统用了这个组件?"
没有 SBOM,这个问题可能需要数天到数周去排查——逐个检查代码仓库、构建产物、部署环境。
有了 SBOM,答案可以在几分钟内得到——只需查询清单。
在紧急漏洞响应的时间窗口内,这个差异至关重要。
二、合规要求
越来越多的法规和采购要求 SBOM:
- 美国行政令 14028(2021)要求向联邦政府供应的软件提供 SBOM;
- 欧盟《网络韧性法案》(CRA)包含相关要求;
- 多个行业的采购标准开始纳入。
三、许可证合规
SBOM 中包含许可证信息,便于管理开源许可证的合规风险(如 GPL 的传染性)。
四、供应链透明度
了解你的软件到底由什么构成——包括间接依赖(依赖的依赖)。
主要格式
SPDX(Software Package Data Exchange):
- 由 Linux 基金会主导,已成为国际标准(ISO/IEC 5962);
- 格式丰富,支持 JSON、YAML、RDF、tag-value 等;
- 包含许可证信息的标准化表达(SPDX License Identifiers 被广泛使用)。
CycloneDX:
- 由 OWASP 社区发起;
- 设计轻量,对安全和供应链用例有良好支持;
- 支持 JSON、XML;
- 有 VEX(漏洞可利用性交换)的配套能力。
SWID Tags(ISO/IEC 19770-2):较老的标准,多用于软件资产管理。
SPDX 和 CycloneDX 是目前的主流,两者可以互相转换。
怎么生成
构建时(推荐):
- 从构建系统和依赖清单中直接生成——最准确,因为它反映的是实际的构建产物;
- 工具:Syft、CycloneDX 的各语言插件、
spdx-sbom-generator、以及各包管理器的原生命令(如npm sbom、pip-licenses)。
从产物扫描:
- 对容器镜像、二进制文件扫描;
- 工具:Syft、Trivy、Grype。
- 优势:能发现构建时清单看不到的内容(如操作系统包、静态链接的库)。
实践建议:两者结合——构建时生成(准确覆盖应用依赖)+ 镜像扫描(覆盖系统层)。
关键实践
一、SBOM 需要更新
软件在演进,SBOM 必须随之更新——否则它只是一份过时的快照。
做法:在 CI/CD 中自动生成,随产物一起存储和分发。
二、SBOM 需要被使用
生成了但没人用,等于没有。
关键:把它接入漏洞管理流程——当新漏洞公布时,自动比对 SBOM,定位受影响的系统。
三、配合 VEX
VEX(Vulnerability Exploitability Exchange,漏洞可利用性交换):
SBOM 告诉你"有哪些组件",但一个组件存在漏洞不等于你的系统可被利用(可能该漏洞的代码路径从未被调用)。
VEX 就是用来说明:"这个已知的 CVE 在我们的产品中不受影响 / 已修复 / 正在调查 / 受影响"。
这能大幅减少误报噪音——是 SBOM 的重要补充。
现实挑战
一、覆盖率
间接依赖、静态链接的库、容器基础镜像中的包——完整覆盖不容易。
二、准确性
版本信息可能缺失或被混淆(尤其在 JS 的打包产物中)。
三、生态割裂
不同语言、不同工具生成的 SBOM 格式和质量不一。
四、它是"清单"不是"证明"
SBOM 说明你用了什么,但不证明这些组件是安全的——还需要漏洞扫描、来源验证(如签名)等措施。
一句话
SBOM 不是安全工具,而是"安全的地图"——它让你在危机来临时,知道该去哪里救火。
说明:本文为供应链安全的知识整理。