1. SBOM 基础概念:从一份清单说起

大家好,我是老赵。今天咱们聊聊 SBOM——软件物料清单。

你可能听过这个名字,也可能已经在项目里用过。但说实话,很多人对 SBOM 的理解还停留在「不就是个依赖列表吗」的阶段。嗯,这其实是个误区。

我最早接触 SBOM 是在 2019 年,帮一家金融客户做供应链安全评估。那时候他们被审计问到一个问题:「你们用的这个开源组件,版本号是多少?有没有已知漏洞?」结果整个团队翻了两天代码,才把依赖理清楚。从那以后,我就意识到——没有 SBOM,安全就是一笔糊涂账。

1.1 什么是 SBOM?

SBOM,全称 Software Bill of Materials,软件物料清单。

说白了,它就是一份「软件成分表」。就像食品包装袋上会列出配料和营养成分一样,SBOM 会列出软件里用了哪些组件、什么版本、从哪里来的、有没有许可证问题。

一个典型的 SBOM 包含以下信息:

字段 说明 示例
组件名称 软件包的名称 log4j-core
版本号 精确版本,含补丁号 2.17.1
供应商 组件作者或组织 Apache Software Foundation
许可证 开源许可证类型 Apache-2.0
依赖关系 该组件依赖的其他组件 log4j-api:2.17.1
哈希值 用于校验组件完整性 SHA256:abc123...

核心要点:SBOM 不是一份静态文档,它是软件供应链的「DNA 图谱」。没有它,你根本不知道自己的软件里有什么。

1.2 SBOM 的起源:从硬件到软件

SBOM 这个概念其实是从硬件行业借来的。

在制造业,物料清单(BOM)已经用了上百年。造一辆汽车,你需要知道用了哪些螺丝、哪些芯片、哪些线束。一旦某个零件出问题,召回时能精准定位。

软件行业呢?以前没人管这个。直到 2014 年,美国国家标准与技术研究院(NIST)开始推动软件供应链安全。2018 年,美国国防部要求所有供应商必须提供 SBOM。2021 年,Log4j 漏洞爆发——整个行业都炸了。

我记得 Log4j 那段时间,我连续加班两周,帮客户排查所有 Java 应用里有没有 log4j-core 2.0 到 2.14.1 的版本。没有 SBOM 的团队,只能靠人肉搜索代码仓库。有 SBOM 的团队,五分钟就出结果了。

为什么会这样?因为 SBOM 让「我知道我有什么」这件事,从手工活变成了自动化。

1.3 SBOM 的标准:SPDX 与 CycloneDX

目前主流的 SBOM 标准有两个:SPDX 和 CycloneDX。

我两个都用过,各有千秋。简单说说区别:

维度 SPDX CycloneDX
发起方 Linux 基金会 OWASP
侧重点 许可证合规 安全漏洞管理
格式 Tag-value / JSON / RDF JSON / XML
漏洞描述 支持,但较弱 原生支持,与 CVE/CSAF 集成
适用场景 法律合规、审计 DevSecOps、漏洞修复

SPDX 是「老大哥」,2011 年就出来了。它最擅长处理许可证问题。如果你的法务团队需要知道每个组件的许可证类型,SPDX 是首选。

CycloneDX 是「后起之秀」,2017 年才发布。但它天生为安全而生。它支持组件漏洞映射、服务依赖、环境依赖,甚至能描述加密算法。我个人更推荐在 DevSecOps 流水线里用 CycloneDX。

我的建议:如果项目偏合规审计,用 SPDX。如果偏安全运营和漏洞修复,用 CycloneDX。两个都支持当然更好——它们可以互相转换。

来看一个 CycloneDX 的示例片段:

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.4",
  "components": [
    {
      "type": "library",
      "name": "log4j-core",
      "version": "2.17.1",
      "purl": "pkg:maven/org.apache.logging.log4j/log4j-core@2.17.1",
      "licenses": [
        {
          "license": {
            "id": "Apache-2.0"
          }
        }
      ],
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "abc123..."
        }
      ]
    }
  ]
}

注意那个 purl 字段——Package URL。它是个好东西,能唯一标识一个组件,不管它来自 Maven、npm 还是 PyPI。有了 purl,漏洞数据库就能自动匹配。

1.4 SBOM 的核心价值:为什么你需要它?

说了这么多,SBOM 到底能帮你解决什么问题?我总结了三句话:

  1. 知道有什么——不再依赖「人肉翻代码」
  2. 知道哪里有问题——漏洞出来时,秒级定位受影响组件
  3. 知道怎么修——依赖关系清晰,升级或打补丁不踩坑

举个例子。假设你有一个 Java 微服务,依赖了 Spring Boot 2.6.3,而 Spring Boot 又依赖了 Tomcat 9.0.58。某天 Tomcat 爆出一个高危漏洞。没有 SBOM 的团队:

  • 先查代码里有没有直接引用 Tomcat
  • 没找到,以为没事
  • 实际上 Tomcat 是间接依赖,藏在 Spring Boot 里
  • 等被攻击了才反应过来

有 SBOM 的团队:

  • 直接查 SBOM,看到 Tomcat 9.0.58 在依赖树里
  • 确认漏洞影响范围
  • 升级 Spring Boot 到包含修复的版本
  • 重新生成 SBOM,确认漏洞已消除

整个过程,从发现到修复,可能只需要半小时。

避坑提醒:我曾经见过一个团队,SBOM 倒是生成了,但只生成了一次,放在 wiki 里吃灰。等漏洞爆发时,SBOM 已经过时了。SBOM 必须持续生成、持续更新,否则就是废纸。

1.5 SBOM 知识体系全景图

下面这张图,是我梳理的 SBOM 核心知识结构。你可以把它当作本章的「思维导图」:

SBOM 知识体系结构图 SBOM 知识体系 什么是 SBOM 起源与背景 标准:SPDX / CycloneDX 核心价值 组件清单 依赖关系 硬件 BOM 借鉴 Log4j 推动 SPDX 许可证 CycloneDX 安全 快速定位漏洞 供应链合规 SBOM 不是终点,而是安全闭环的起点

这张图把 SBOM 拆成了四个维度:定义、起源、标准、价值。每个维度下面还有细分。你可以把它当作一个「检查清单」——学完本章后,看看自己是不是每个点都理解了。

1.6 小结:SBOM 不是银弹,但它是必需品

最后说几句掏心窝的话。

SBOM 不是万能的。它不能自动修复漏洞,不能阻止恶意代码,也不能替代安全测试。但它能让你「看见」你的软件供应链。在安全领域,看不见的东西,你永远无法保护。

我见过太多团队,花大价钱买安全工具,却连自己用了哪些开源组件都说不清楚。SBOM 就是那个「补短板」的东西。它不贵,不复杂,但能让你在漏洞爆发时,从「一脸懵」变成「心中有数」。