跳转至

OTA 安全更新机制

难度:🟡 中级 | 领域:固件更新、设备管理 | 阅读时间:约 20 分钟

日常类比

手机系统更新:通知 → 下载 → 验证 → 安装 → 重启。装到一半断电通常不会变砖,因为有旧系统可回退。

物联网(Internet of Things, IoT)空中下载(Over-The-Air, OTA)更苛刻:设备可能在野外、链路时断时续、闪存只够一份半固件。一次失败的更新可能意味着上门换机,差旅成本远高于器件本身。因此 OTA 的核心不是"能升级",而是验真、抗断、可回滚[8][1]。

摘要

安全 OTA 覆盖云端签名发布、差分传输、设备端验签与 A/B(或等效)槽位切换,以及车队灰度。本文对照 MCUboot、SWUpdate、RAUC、Mender、hawkBit,说明 Ed25519/清单(manifest)实践与 IETF SUIT/RFC 9019 架构要点,并列出局限与改进[1][8][9]。

1. OTA 更新架构

1.1 系统组成

云端:构建 → 签名服务 → 发布管理 → CDN/对象存储
                ↓ HTTPS / CoAP 等
设备:OTA Agent → 验证模块 → 安装/切换 → 结果上报

1.2 推荐流程

  1. 检查更新或接收推送
  2. 下载并验证 manifest 签名
  3. 下载镜像或差分包(断点续传)
  4. 校验摘要(如 SHA-256)与镜像签名
  5. 防回滚版本检查
  6. 写入非当前槽位
  7. 试启动 → 应用确认(confirm)或自动回滚
  8. 上报结果

缺任一步(尤其是试启动确认)都会在现场制造"半砖"或"静默回退循环"[1][8]。


2. 差分更新

2.1 为何需要

场景 全量(例) 差分(例) 节省倾向
小修补 数百 KB 数十 KB 很高
小功能 数百 KB 不足百 KB
大改版 数百 KB 接近全量 有限

窄带物联网(Narrowband IoT, NB-IoT)等低速率链路上,差分往往从"数分钟"降到"数秒–数十秒"量级,具体取决于固件体积与信号质量,表中数字为数量级示意。

2.2 算法对照

算法 压缩倾向 生成速度 设备内存 适用
bsdiff 常需接近旧镜像缓冲 资源较足
HDiffPatch/detools 较快 可流式、峰值低 受限 MCU
VCDIFF/xdelta3 通用
zstd --patch-from 很快 大文件/Linux

受限设备应优先流式打补丁,避免把整包旧固件读进随机存取存储器(Random Access Memory, RAM)[6]。


3. A/B 分区与状态机

Bootloader | 槽位表/启动标志 | Slot A | Slot B | Scratch | NVS
正常运行(A) → 下载写入(B) → 试启动(B)
                 ↓成功确认          ↓失败/看门狗
              以 B 为活跃         回滚到 A

MCUboot 等引导程序在应用调用"确认"前把新槽视为试验启动;不确认则下次启动回滚,这是防变砖的关键契约[1][2]。


4. 签名与清单

4.1 算法选择

Ed25519 在嵌入式上常见优势:签名与公钥短、验证相对快、确定性签名(减少对高质量随机数的依赖)。RSA/ECDSA 亦广泛支持,需权衡镜像头开销与硬件加速[1]。

验证失败必须丢弃并审计,不可"先装后验"。

4.2 Manifest 字段(逻辑例)

字段 作用
version / min_version 升级与防降级
size + sha256 完整性
uri / delta 获取位置
hardware_rev 防刷错板
rollout_percentage 灰度
signature 对清单绑定签名

IETF RFC 9019 描述 IoT 固件更新架构;SUIT 用简明二进制对象表示(CBOR)清单承载授权与安装步骤,适合带宽极紧的设备[8][9]。


5. 框架对比

特性 MCUboot SWUpdate RAUC Mender hawkBit
目标 MCU/RTOS Linux Linux Linux 管理后端
槽位 A/B、交换等 A/B 等 A/B A/B 策略侧
差分 多靠外部 可集成 可集成 支持 外部产物
签名 RSA/ECDSA/Ed25519 CMS 等 X.509 密钥体系 后端策略
回滚 试验启动 可配置 依赖设备实现
许可 Apache-2.0 GPL-2.0 LGPL-2.1 Apache-2.0 EPL-2.0

选型:裸机/Zephyr 类 → MCUboot;嵌入式 Linux → RAUC/SWUpdate/Mender;多租户车队编排 → hawkBit 等[1][3][4][5][10]。


6. 车队灰度与失败恢复

6.1 灰度

金丝雀(约 1%)→ 早期(约 10%)→ 分批全量。自动暂停条件示例:失败率或崩溃率超过预设阈值、关键健康指标恶化。阈值应按业务风险标定,表中 5%/2% 仅为教学默认值。

6.2 失败恢复

失败类型 检测 恢复
下载中断 超时/校验失败 HTTP Range 续传
验签失败 密码学验证错误 丢弃、告警、限次重下
写入失败 Flash 错误 有限重试后放弃
启动失败 看门狗/启动计数 自动回滚
运行不稳定 连续崩溃 标记坏版本并回滚

汽车等安全关键域还有领域标准与供应链签名要求,不能只套消费级 OTA 流程[7]。


7. 实践建议

带宽:差分优先;压缩选 zstd 等现代算法;低峰推送;受限网用约束应用协议(Constrained Application Protocol, CoAP)分块。

可靠:看门狗回滚必开;最大重试;保留工厂恢复区;低电量禁止升级。

安全:签名私钥进硬件安全模块(Hardware Security Module, HSM);传输层安全(TLS)+ 证书固定;防回滚计数器落安全存储或一次性可编程(OTP)熔丝;构建与签名职责分离。


8. 局限、挑战与可改进方向

1. 双槽位闪存成本

局限:A/B 近似双倍应用分区,小容量 MCU 放不下[1]。 改进:交换/压缩槽、外部闪存、或单槽+可靠恢复分区(接受更长不可用窗口);差分+流式降低临时缓冲。

2. 密钥泄露即车队沦陷

局限:同一 OEM 公钥刷写全系设备,签名钥泄露影响面极大。 改进:HSM、密钥分层/设备组密钥、快速吊销与紧急吊销清单;检测异常版本分布。

3. 差分对大改版效果差

局限:结构重排或工具链变化时补丁接近全量,窄带仍可能超时[6]。 改进:发布策略区分"补丁通道/大版本通道";大版本走 Wi-Fi/有线窗口;控制符号与段布局稳定性。

4. 灰度指标滞后

局限:某些缺陷只在特定硬件批次或地域网络出现,金丝雀覆盖不足。 改进:按硬件修订、运营商、固件基线分层抽样;健康上报含启动次数与关键子系统错误码。

5. 标准碎片化

局限:MCUboot 镜像头、SUIT、各云厂商清单并存,多生态设备难统一[8][9]。 改进:设备侧抽象"验证-安装-确认"接口;云端适配多种 manifest;新项目优先对齐 RFC 9019/SUIT。


参考文献

[1] MCUboot Project, "MCUboot Documentation," 2024. [2] Zephyr Project, "Device Firmware Upgrade (DFU)," Documentation, 2024. [3] SWUpdate, "Software Update for Embedded Linux," Documentation, 2024. [4] RAUC, "Robust Auto-Update Controller," Documentation, 2024. [5] Mender.io, "OTA Software Updates for IoT," Documentation, 2024. [6] C. Percival, "Naive Differences of Executable Code (bsdiff)," 2003. [7] D. Barrera et al., "Securing Software Updates for Automobiles," ESCAR, 2019. [8] IETF, "RFC 9019: A Firmware Update Architecture for Internet of Things," 2021. [9] IETF SUIT WG, "A Concise Binary Object Representation (CBOR)-based Serialization Format for the Software Updates for Internet of Things (SUIT) Manifest," 近年版本. [10] Eclipse hawkBit, "IoT Update Management," Documentation, 2024. [11] ESP-IDF, "Over The Air Updates (OTA)" 编程指南, Espressif, 近年版本. [12] Uptane / 汽车 OTA 安全框架相关规范与白皮书, 近年.