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 卡、串口升级模式。
- 升级包本身:镜像头、版本号、签名块、压缩格式、差分补丁。
- 设备端逻辑:版本比较、回滚策略、分区切换、校验时机。
- 密钥与证书:私钥存储、证书链验证、根信任锚。
分析时建议采用“数据流 + 信任边界”的方式:从云端签名开始,经过传输、设备接收、校验、写入、重启,逐段标注“谁可以读写、谁可以替换、谁可以重放”。下面这张图展示了固件升级的典型数据流与四类威胁的注入位置。
三、四类典型威胁的机理与案例
篡改(Tampering):攻击者截获升级包后修改固件内容,或替换签名块使其指向恶意镜像。若设备只校验哈希但不校验签名,或签名验证在写入之后才执行,篡改即可生效。典型场景是攻击者控制 CDN 节点,替换下载文件。
降级(Downgrade):攻击者把设备回滚到已知存在漏洞的旧版本,再利用旧漏洞提权。很多设备允许“版本号更低也可升级”以支持售后回滚,这恰恰是降级攻击的温床。防护关键是单调递增的版本计数器,并写入一次性可编程存储(如 eFuse)。
中间人(MITM):攻击者在设备与升级服务器之间架设代理,伪造服务器证书或利用设备不校验证书的缺陷,向设备下发恶意固件。常见于设备只使用 HTTP、或 TLS 证书校验被关闭、或使用自签名证书但未固定根证书的场景。
重放(Replay):攻击者录制一次合法的升级请求或升级包,在稍后重复发送。若设备没有 nonce、时间戳或序列号机制,就会再次执行写入,可能覆盖当前正常固件,或配合降级实现攻击。
常见误区:“用了 HTTPS 就安全了”是固件升级中最危险的假设。HTTPS 只保护传输段,无法阻止已签名的旧包被重放,也无法阻止设备端跳过签名校验。安全必须覆盖“传输—校验—写入—启动”全链路。
四、从威胁到验证:可落地的检查清单
威胁建模的终点不是一张图,而是一组可验证的安全需求。建议在固件升级设计中逐项确认:
- 升级包是否使用私钥签名,设备端是否在写入前完成签名验证?
- 版本号是否单调递增,是否与硬件熔丝或安全存储绑定?
- 传输通道是否启用双向认证,是否固定了根证书或公钥?
- 升级请求是否包含 nonce、时间戳或一次性序列号?
- 升级日志是否记录来源、版本、校验结果,并防篡改?
- 失败回滚是否安全,是否可能因断电导致分区损坏?
# 升级包校验伪代码示例
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 作为枚举工具,把攻击面分析作为定位工具,把四类典型威胁作为验证靶子,你就能在固件升级方案评审阶段提前发现大多数高危问题。安全不是升级完成后的补丁,而是升级流程设计的一部分。