3、SBOM与设备身份绑定:如何将SBOM与设备唯一标识关联

好,我们进入第三章。前面两章我们把SBOM的基础概念和它在物联网里的价值聊清楚了。但有个问题一直悬着——你拿到的SBOM,怎么证明它属于这台设备?

说白了,SBOM只是一份清单。如果它跟设备本身是脱钩的,那攻击者完全可以伪造一份干净的SBOM,贴到被篡改过的设备上。我在项目里见过这种案例:设备固件被替换了,但云端查SBOM还是旧的、安全的版本。为什么?因为SBOM和设备之间没有建立信任锚点。

这一章,我们就来解决这个核心问题——如何把SBOM和设备的物理身份绑死。

3.1 设备唯一标识:从软件到硬件的信任迁移

先想一个问题:设备的“身份”到底是什么?

传统做法是用MAC地址、序列号、IMEI。但这些玩意儿都是软件可读的,说白了就是一段字符串。攻击者改个系统文件就能换掉。你想想看,如果身份标识本身不可信,那基于它做的所有校验都是白搭。

所以,真正的信任必须下沉到硬件层。我们需要一个不可克隆、不可篡改的硬件锚点。

目前业界主流方案有两个:

  • TPM(可信平台模块):国际标准,有专门的密码协处理器,内置RSA/ECC密钥对、PCR寄存器、安全存储。
  • 安全芯片(SE):类似TPM,但更轻量,常见于IoT终端,如NXP SE050、Microchip ATECC608。

这两种芯片出厂时就会烧录一个唯一设备密钥(UDK),私钥永远不出芯片。这就是信任的起点。

核心原则:信任必须从硬件硅片开始,而不是从操作系统启动之后才开始。硬件锚定信任根,软件只能继承信任,不能创造信任。

3.2 硬件锚定信任根:TPM/Security Element的工作机制

我简单画个图,帮你理解硬件信任根是怎么工作的。

硬件锚定信任根:SBOM与设备身份绑定流程 硬件信任根 TPM / 安全芯片 设备唯一密钥 (UDK) 私钥永不出芯片 设备身份证书 X.509 / IDevID 派生 签名 SBOM 生成阶段 扫描固件 → 生成SPDX/CycloneDX → 计算哈希 SBOM 签名绑定 使用 UDK 私钥对 SBOM 哈希签名 → 生成 SBOM 签名块 安全存储 SBOM + 签名块 → 写入安全芯片 / TPM NVRAM 验证时:读取SBOM → 用UDK公钥验签 → 比对哈希 → 确认SBOM未被篡改且属于本设备

流程其实不复杂。核心就三步:

  1. 硬件生成密钥对:TPM或安全芯片在内部生成RSA-2048或ECC-P256密钥对,私钥永远不暴露给CPU或操作系统。
  2. 签发设备身份证书:用私钥签名一个CSR,交给工厂CA签发X.509证书。这个证书就是设备的“身份证”。
  3. SBOM签名绑定:在设备首次启动或固件更新时,用同一把私钥对SBOM的哈希值签名。签名结果和SBOM一起存储。

我的经验:曾经有个客户,为了省成本,把SBOM签名密钥放在文件系统里。结果设备被提权后,攻击者直接替换了SBOM和签名。后来改成用ATECC608存储密钥,同样的问题再没出现过。硬件锚定不是锦上添花,是底线。

3.3 绑定方案对比:TPM vs 安全芯片

很多工程师会问:我到底该用TPM还是安全芯片?我列个表,你一看就明白。

对比维度 TPM(如Infineon SLB9670) 安全芯片(如NXP SE050)
标准规范 ISO/IEC 11889, TCG 标准 无统一标准,厂商自定义
密钥存储 NVRAM + PCR 保护 安全EEPROM/Flash
密码算法 RSA/ECC/SHA/HMAC,支持TPM2.0 RSA/ECC/AES,部分支持国密
性能 中等,适合网关/边缘设备 高,适合传感器/终端节点
成本 较高($2-$5) 较低($0.5-$2)
SBOM绑定方式 TPM2_Quote + TPM2_Sign 内部签名指令 + 证书链

我个人习惯这样选:如果设备是网关、路由器这类有Linux系统的,用TPM,因为它能配合IMA(完整性度量架构)做启动时度量。如果是传感器、智能锁这类MCU设备,用安全芯片,轻量、便宜、够用。

3.4 实战:用TPM2.0对SBOM签名

光说不练假把式。我写一段实际可用的代码,展示如何用TPM2.0对SBOM进行签名绑定。

前提:设备已初始化TPM,并已生成持久化密钥(Handle 0x81000001)。

#!/bin/bash
# SBOM签名绑定脚本 - 使用TPM2.0

# 1. 生成SBOM(假设已存在sbom.json)
SBOM_FILE="sbom.json"
SBOM_HASH="sbom.sha256"

# 2. 计算SBOM哈希
sha256sum $SBOM_FILE | awk '{print $1}' > $SBOM_HASH

# 3. 使用TPM私钥签名(持久化密钥handle)
# 注意:私钥永不出TPM,签名操作在芯片内部完成
tpm2_sign \
  --key-context 0x81000001 \
  --hash-algorithm sha256 \
  --scheme rsassa \
  --digest $SBOM_HASH \
  --signature sbom.sig

# 4. 将SBOM + 签名打包
tar -czf sbom_bundle.tar.gz $SBOM_FILE sbom.sig

# 5. 可选:将签名块写入TPM NVRAM
tpm2_nvwrite \
  --hierarchy o \
  --index 0x01C00001 \
  --size 256 \
  --input sbom.sig

echo "SBOM签名绑定完成,签名块已写入TPM NVRAM"

注意:上面的tpm2_sign命令中,--digest参数传入的是哈希文件,不是原始SBOM。TPM内部会对哈希再做一次填充和签名。另外,NVRAM索引需要提前定义好大小和属性,否则写入会失败。我曾经因为忘记设置nvdefine,调试了整整一个下午。

3.5 验证流程:如何证明SBOM属于这台设备

签名只是第一步。真正关键的是验证。我见过不少方案,签名做得花里胡哨,验证却形同虚设。

正确的验证流程应该是:

  1. 读取设备证书:从TPM/安全芯片中读取设备身份证书(或公钥)。
  2. 提取SBOM签名块:从NVRAM或安全存储中读取签名。
  3. 计算SBOM哈希:对当前SBOM重新计算哈希。
  4. 验签:用设备公钥验证签名是否匹配。
  5. 比对证书链:确认设备证书是由可信CA签发的,没有被吊销。

只有这五步全部通过,才能说“SBOM属于这台设备且未被篡改”。

避坑指南:我曾经在项目里只做了验签,没做证书链校验。结果攻击者用自己的CA签了个假证书,替换了设备证书。验签通过了,但设备已经被完全控制。记住:验签只证明签名有效,不证明签名者可信。证书链校验才是信任的闭环。

3.6 小结:硬件锚定是SBOM可信的基石

这一章的核心就一句话:SBOM必须和硬件身份绑定,绑定必须基于硬件信任根。

没有硬件锚定的SBOM,就像没有签名的合同——谁都可以伪造。TPM和安全芯片不是可选项,而是物联网设备身份认证的必选项。你想想看,如果连设备身份都保不住,那SBOM里列的那些组件信息还有什么意义?