1、SBOM基础概念:什么是SBOM、SBOM的组成要素、SBOM在设备生命周期中的价值

各位同学,咱们今天聊点实在的。

做嵌入式安全这么多年,我见过太多设备因为“不知道用了什么”而出事。有的被爆出开源漏洞,有的被合规审查卡住,有的甚至被监管部门直接下架。问题根源在哪?说白了,就是缺一份清晰的物料清单。

你想想看,造一台设备,用了哪个内核版本、哪几个开源库、哪家供应商的固件——这些信息如果全靠工程师脑子记,或者散落在几十封邮件里,那不出事才怪。SBOM,就是来解决这个问题的。

1.1 什么是SBOM

SBOM,全称 Software Bill of Materials,软件物料清单。它跟制造业的BOM一个道理——你造一台车,得知道用了哪些螺丝、哪些芯片。造一台物联网设备,也得知道里面塞了哪些软件成分。

我个人的理解更直接:SBOM就是设备的“软件成分表”。它把设备里每一个软件组件、版本号、许可证、依赖关系,全都白纸黑字写清楚。

核心定义:SBOM 是一份结构化、机器可读的清单,记录了构建某个软件产品所使用的所有组件及其供应链关系。

为什么强调“机器可读”?因为设备一多,人工翻Excel根本翻不过来。SBOM 通常用 SPDX、CycloneDX 这类标准格式,工具可以直接解析、比对、告警。

我记得2019年帮一家医疗设备厂商做审计,他们一台呼吸机里用了200多个开源组件。工程师说“版本都更新了”,结果我一扫SBOM,发现三个组件还是2015年的老版本,CVE漏洞一查一大把。嗯,这就是没有SBOM的代价。

1.2 SBOM的组成要素

一份完整的SBOM,不是随便列几个名字就完事。它得包含以下核心要素:

要素 说明 我踩过的坑
组件名称 软件包或库的官方名称 大小写不一致,工具匹配失败
版本号 精确到 patch 的版本字符串 有人只写“latest”,审计直接不通过
供应商 组件作者或维护组织 开源项目没写供应商,合规卡住
许可证 如 GPL、MIT、Apache 2.0 GPL 传染性没注意,产品差点开源
依赖关系 该组件依赖哪些其他组件 间接依赖漏了,漏洞扫描不完整
校验和 SHA-256 等哈希值 没校验,被供应链投毒都不知道
唯一标识 如 PURL、CPE 不同工具用不同ID,对不上账

我的习惯:每个组件至少保留 PURL 和 CPE 两种标识。一个给开发工具用,一个给漏洞库匹配用,两边都不耽误。

你可能会问:这么多字段,是不是每个都得填?我建议是:能填的都填。少填一个字段,审计时可能就多一个“不通过”的理由。

1.3 SBOM在设备生命周期中的价值

SBOM不是审计时才拿出来用的。它在设备整个生命周期里,每个阶段都有用。我画了张图,你看一眼就明白:

SBOM在设备生命周期中的价值 SBOM 在设备生命周期中的价值 SBOM 核心 设计阶段 组件选型 & 许可证评估 开发阶段 依赖追踪 & 版本锁定 构建阶段 自动生成 SBOM 部署阶段 漏洞扫描 & 合规检查 运维阶段 持续监控 & 补丁管理 退役阶段 数据清理 & 归档 💡 关键洞察 SBOM 不是一次性的交付物,而是贯穿设备全生命周期的“活文档”。 从设计选型到退役归档,每个阶段都需要维护和更新 SBOM。

我挑几个重点阶段说说:

设计阶段:提前避坑

选开源组件时,SBOM能帮你提前看清许可证风险。我曾经有个项目,开发到一半才发现核心库是GPL的,整个产品都得开源。如果当时有SBOM,设计阶段就能换掉它。

开发阶段:依赖不迷路

一个组件可能依赖十几个子组件。没有SBOM,你根本不知道“间接依赖”里藏着什么。我见过一个案例:主库没问题,但它的一个子依赖有高危漏洞,结果整个设备被攻破。

运维阶段:快速响应

Log4j漏洞爆发那天,我凌晨三点被电话叫醒。客户问:你们的设备受影响吗?我打开SBOM,搜索“log4j”,三分钟就给出了答案。没有SBOM的团队,花了三天才排查完。

⚠️ 注意:SBOM 不是生成一次就完事了。设备固件升级、组件替换、补丁更新后,SBOM 必须同步更新。否则审计时拿出来的还是旧版本,等于白做。

1.4 一个简单的SBOM示例

光说不练假把式。我拿一个嵌入式设备常用的 CycloneDX 格式 SBOM 给你看看:

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.4",
  "version": 1,
  "metadata": {
    "component": {
      "name": "smart-meter-firmware",
      "version": "2.3.1",
      "type": "firmware"
    }
  },
  "components": [
    {
      "name": "FreeRTOS",
      "version": "10.4.3",
      "purl": "pkg:github/FreeRTOS/FreeRTOS@10.4.3",
      "licenses": [{"license": {"id": "MIT"}}]
    },
    {
      "name": "mbedtls",
      "version": "2.28.1",
      "purl": "pkg:github/ARMmbed/mbedtls@2.28.1",
      "licenses": [{"license": {"id": "Apache-2.0"}}]
    },
    {
      "name": "lwIP",
      "version": "2.1.3",
      "purl": "pkg:github/lwIP-tcpip/lwIP@2.1.3",
      "licenses": [{"license": {"id": "BSD-3-Clause"}}]
    }
  ],
  "dependencies": [
    {
      "ref": "pkg:github/ARMmbed/mbedtls@2.28.1",
      "dependsOn": ["pkg:github/lwIP-tcpip/lwIP@2.1.3"]
    }
  ]
}

你看,这份SBOM清楚写着:固件用了FreeRTOS、mbedtls、lwIP,每个组件的版本、许可证、依赖关系一目了然。审计人员拿到手,直接就能对账。

我的建议:从项目第一天就引入SBOM生成工具。别等到审计前再补,那时候组件版本都记不清了,补出来的SBOM全是坑。