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能帮你提前看清许可证风险。我曾经有个项目,开发到一半才发现核心库是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全是坑。