1. SBOM 基础概念:什么是 SBOM、组成要素与供应链角色

各位同学好,我是老周。在物联网安全这个行当摸爬滚打了十几年,今天咱们来聊聊 SBOM——软件物料清单。说实话,我第一次接触这个概念是在 2018 年,当时帮一家智能家居厂商做安全审计,发现他们的固件里用了三十多个开源组件,但没人能说清楚到底用了哪些、版本是多少。嗯,那场面,相当混乱。

从那以后,我就养成了一个习惯:不管做什么物联网设备,先把 SBOM 理清楚。你想想看,连自己用了什么都不知道,怎么谈安全?

1.1 什么是 SBOM?

SBOM,全称 Software Bill of Materials,直译过来就是“软件物料清单”。说白了,它就像你买家电时附带的零件清单——告诉你这台设备里用了哪些软件组件、什么版本、从哪里来的、有没有已知漏洞。

我习惯把它比作“软件成分表”。就像食品包装上会列出配料和营养成分,SBOM 把设备的软件成分一五一十地列出来。没有它,你根本不知道吃进去的是什么。

核心定义:SBOM 是一份结构化、机器可读的清单,详细记录了软件产品中所有组件的名称、版本、供应商、依赖关系以及许可证信息。

为什么物联网设备特别需要 SBOM?因为物联网设备不像 PC 或服务器,它们通常资源受限、更新困难、生命周期长。我见过不少设备出厂时固件没问题,但三年后里面的开源库爆出高危漏洞,厂商却连哪个组件受影响都查不出来。这就是没有 SBOM 的代价。

1.2 SBOM 的组成要素

一份完整的 SBOM 应该包含哪些东西?我根据多年实战经验,把它归纳为六个核心要素。记住这六点,你就能看懂任何一份 SBOM。

要素 说明 示例
组件名称 软件组件的官方名称 OpenSSL, libcurl, busybox
版本号 精确到补丁级别的版本标识 1.1.1w, 7.88.1, 1.35.0
供应商 组件的作者或维护组织 OpenSSL Foundation, curl project
依赖关系 组件之间的上下游依赖 A → B → C(A 依赖 B,B 依赖 C)
许可证 开源许可证类型 Apache 2.0, GPL v3, MIT
哈希值 用于验证组件完整性的校验码 SHA-256: a3f5b2c8...

这里我要特别强调一下版本号。我曾经遇到过一个案例:某智能门锁的固件里用了 OpenSSL 1.0.2,但 SBOM 里写的是 1.0.2a。你可能会觉得差不多,但 1.0.2a 修复了 Heartbleed 漏洞,而 1.0.2 没有。就这一个字母的差别,整个设备的安全等级完全不同。所以,版本号必须精确到补丁级别,不能含糊。

我的习惯:在生成 SBOM 时,我会强制要求包含每个组件的 SHA-256 哈希值。这样即使版本号被人为篡改,也能通过哈希校验发现异常。这个做法帮我堵过好几次供应链攻击。

1.3 SBOM 的格式标准

光有内容还不够,还得有统一的格式。目前业界主流的 SBOM 格式有三种,我简单介绍一下:

  • SPDX(Software Package Data Exchange):由 Linux 基金会维护,最成熟,支持许可证管理。我个人偏爱这种格式,因为它对合规审计特别友好。
  • CycloneDX:由 OWASP 推动,专为安全场景设计,支持漏洞关联。如果你做安全分析,这个格式更顺手。
  • SWID(Software Identification):ISO 标准,主要用于软件资产管理。在物联网场景下用得相对少一些。

下面是一个 SPDX 格式的 SBOM 片段,展示了一个物联网设备固件中的部分组件:

SPDXVersion: SPDX-2.3
DataLicense: CC0-1.0
SPDXID: SPDXRef-DOCUMENT
DocumentName: smart-lock-firmware-v2.1

## Package: OpenSSL
PackageName: OpenSSL
SPDXID: SPDXRef-Package-OpenSSL
PackageVersion: 1.1.1w
PackageSupplier: Organization: OpenSSL Foundation
PackageChecksum: SHA256: a3f5b2c8d9e1f0a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5
PackageLicenseConcluded: Apache-2.0

## Package: libcurl
PackageName: libcurl
SPDXID: SPDXRef-Package-libcurl
PackageVersion: 7.88.1
PackageSupplier: Person: Daniel Stenberg
PackageChecksum: SHA256: b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3
PackageLicenseConcluded: MIT

你看,每一行都很清晰。组件名、版本、供应商、哈希值、许可证,一目了然。这就是 SBOM 的价值——让软件供应链变得透明。

1.4 SBOM 在软件供应链中的角色

聊完了 SBOM 是什么,咱们再来说说它在软件供应链里到底扮演什么角色。我用一张图来展示:

SBOM 在物联网软件供应链中的角色 开源组件库 OpenSSL / curl / MQTT 第三方 SDK 芯片 SDK / 云平台 SDK 自研代码 业务逻辑 / 协议栈 SBOM 软件物料清单 漏洞管理 CVE 关联 / 风险评级 许可证合规 GPL / Apache / MIT 审计 身份认证 设备指纹 / 信任链 核心作用: SBOM 是连接上游组件与下游安全管理的“数据枢纽”。 没有 SBOM,漏洞来了你都不知道该修哪个组件;有了 SBOM, 你可以在几分钟内定位受影响的范围并制定修复方案。

从这张图你能看到,SBOM 处于供应链的中间位置。上游是各种开源组件、第三方 SDK 和自研代码,下游是漏洞管理、许可证合规和身份认证等安全能力。SBOM 就像一根“数据总线”,把上下游串联起来。

具体来说,SBOM 在供应链中承担了三个关键角色:

  1. 透明度提供者:让厂商和用户清楚知道设备里装了什么软件。我在做设备安全评估时,第一步就是要求客户提供 SBOM。没有它,我根本没法做有效的安全分析。
  2. 漏洞响应加速器:当新的 CVE 公布时,SBOM 能帮你快速判断自己是否受影响。我曾经帮一家客户处理 Log4j 漏洞,他们有 SBOM 的团队 2 小时内就完成了影响评估,而没有 SBOM 的团队花了整整两周。
  3. 信任链锚点:在物联网设备身份认证中,SBOM 可以作为设备指纹的一部分。通过比对设备的实际组件与 SBOM 记录,可以检测固件是否被篡改。这个应用场景,我们后面几章会详细展开。

注意:SBOM 不是一次性的工作。物联网设备的固件会升级,组件会更新,依赖关系会变化。我建议把 SBOM 生成集成到 CI/CD 流水线中,每次构建都自动生成新的 SBOM。否则,你手里的 SBOM 很快就会变成一张废纸。

1.5 为什么物联网设备身份认证需要 SBOM?

这个问题可能你已经猜到了。简单说:没有 SBOM,你无法确认设备里跑的是什么软件,也就无法建立真正的信任。

物联网设备身份认证的核心是“证明我是我”。传统做法是给设备烧录一个证书或密钥,但这只能证明硬件没被换,证明不了软件没被篡改。如果攻击者替换了固件里的某个组件,设备依然能用证书通过认证,但实际已经在执行恶意代码了。

SBOM 的出现改变了这个局面。通过将 SBOM 的哈希值绑定到设备身份中,认证服务器可以验证设备当前的软件组成是否与出厂时一致。任何组件的增删改都会导致哈希值变化,从而被认证系统发现。

嗯,这个思路我在 2020 年帮一家车联网公司实现过。当时他们的 T-Box(车载通信终端)经常被刷机篡改,我们就是在身份认证协议里嵌入了 SBOM 校验,效果非常好。具体怎么实现,后面几章我会手把手带大家做。

一句话总结:SBOM 让物联网设备的身份认证从“认硬件”升级到“认软件+硬件”,安全等级直接提升一个量级。