4. 安全威胁建模

固件升级通道是设备生命周期中最敏感、权限最高的数据通路之一。它既要接受外部输入,又要写入持久化存储,还要在重启后获得执行权。一旦威胁建模缺失,攻击者可能通过篡改、降级、中间人或重放等手段,把一次“正常升级”变成持久化植入。本章围绕 STRIDE 方法、攻击面分析与四类典型威胁展开,帮助你在设计阶段就把风险显性化。

一、STRIDE:把威胁从“感觉”变成“分类”

STRIDE 是微软提出的一种威胁建模框架,它把安全属性与威胁类型一一对应,便于团队系统性地枚举风险,而不是凭经验拍脑袋。其核心映射关系如下:

安全属性STRIDE 威胁固件升级中的典型表现
身份认证Spoofing 仿冒伪造升级服务器或伪造设备身份
完整性Tampering 篡改修改固件镜像、篡改签名或元数据
可审计性Repudiation 抵赖升级日志缺失,无法追溯谁在何时推送
机密性Information Disclosure 信息泄露密钥、调试接口或固件明文暴露
可用性Denial of Service 拒绝服务升级包过大、校验失败导致设备变砖
授权Elevation of Privilege 权限提升低权限进程触发升级并写入受保护分区

在固件升级场景中,STRIDE 的价值在于把“升级流程”拆成可分析的信任边界:设备端 Bootloader、升级代理、传输通道、云端签名服务、存储分区。每个边界都要问:谁能冒充谁?数据能否被改?操作能否被否认?信息是否泄露?服务是否可用?权限是否被越界?

二、攻击面分析:找到真正可被利用的入口

攻击面不是“所有代码”,而是攻击者无需物理拆机即可触达的接口与数据流。固件升级的典型攻击面包括:

  • 网络接口:HTTPS 升级端点、MQTT 推送、OTA 广播、P2P 分发。
  • 本地接口:USB、UART、JTAG、SD 卡、串口升级模式。
  • 升级包本身:镜像头、版本号、签名块、压缩格式、差分补丁。
  • 设备端逻辑:版本比较、回滚策略、分区切换、校验时机。
  • 密钥与证书:私钥存储、证书链验证、根信任锚。

分析时建议采用“数据流 + 信任边界”的方式:从云端签名开始,经过传输、设备接收、校验、写入、重启,逐段标注“谁可以读写、谁可以替换、谁可以重放”。下面这张图展示了固件升级的典型数据流与四类威胁的注入位置。

固件升级数据流与 STRIDE 威胁注入点 云端签名服务 私钥签名 / 版本发布 传输通道 HTTPS / MQTT / OTA 设备升级代理 接收 / 校验 / 暂存 Bootloader 与分区 写入 / 切换 / 启动 篡改 Tampering 修改镜像 / 替换签名块 中间人 MITM 劫持通道 / 伪造服务器 降级 Downgrade 回滚到含漏洞旧版本 重放 Replay 重复旧升级包触发写入 对应防护策略 签名验证 RSA/ECC + 哈希链 双向认证 mTLS / 证书链校验 防降级 单调版本号 / eFuse 防重放 Nonce / 时间戳 / 序列号

三、四类典型威胁的机理与案例

篡改(Tampering):攻击者截获升级包后修改固件内容,或替换签名块使其指向恶意镜像。若设备只校验哈希但不校验签名,或签名验证在写入之后才执行,篡改即可生效。典型场景是攻击者控制 CDN 节点,替换下载文件。

降级(Downgrade):攻击者把设备回滚到已知存在漏洞的旧版本,再利用旧漏洞提权。很多设备允许“版本号更低也可升级”以支持售后回滚,这恰恰是降级攻击的温床。防护关键是单调递增的版本计数器,并写入一次性可编程存储(如 eFuse)。

中间人(MITM):攻击者在设备与升级服务器之间架设代理,伪造服务器证书或利用设备不校验证书的缺陷,向设备下发恶意固件。常见于设备只使用 HTTP、或 TLS 证书校验被关闭、或使用自签名证书但未固定根证书的场景。

重放(Replay):攻击者录制一次合法的升级请求或升级包,在稍后重复发送。若设备没有 nonce、时间戳或序列号机制,就会再次执行写入,可能覆盖当前正常固件,或配合降级实现攻击。

常见误区:“用了 HTTPS 就安全了”是固件升级中最危险的假设。HTTPS 只保护传输段,无法阻止已签名的旧包被重放,也无法阻止设备端跳过签名校验。安全必须覆盖“传输—校验—写入—启动”全链路。

四、从威胁到验证:可落地的检查清单

威胁建模的终点不是一张图,而是一组可验证的安全需求。建议在固件升级设计中逐项确认:

  1. 升级包是否使用私钥签名,设备端是否在写入前完成签名验证?
  2. 版本号是否单调递增,是否与硬件熔丝或安全存储绑定?
  3. 传输通道是否启用双向认证,是否固定了根证书或公钥?
  4. 升级请求是否包含 nonce、时间戳或一次性序列号?
  5. 升级日志是否记录来源、版本、校验结果,并防篡改?
  6. 失败回滚是否安全,是否可能因断电导致分区损坏?
# 升级包校验伪代码示例
verify_image(image):
    if not verify_signature(image.header, image.signature, ROOT_PUBKEY):
        return REJECT_SIGNATURE
    if image.version <= current_version:
        return REJECT_DOWNGRADE
    if image.nonce in used_nonces:
        return REJECT_REPLAY
    if sha256(image.payload) != image.header.hash:
        return REJECT_TAMPER
    return ACCEPT

把 STRIDE 作为枚举工具,把攻击面分析作为定位工具,把四类典型威胁作为验证靶子,你就能在固件升级方案评审阶段提前发现大多数高危问题。安全不是升级完成后的补丁,而是升级流程设计的一部分。