第19章

安全与固件保护

1. MCUboot 实现安全启动

什么是MCUboot?

MCUboot是一个开源的、安全的引导加载程序,专为微控制器设计。它为Zephyr OS提供了安全启动功能,确保只有经过验证的固件才能被执行。

MCUboot架构图

MCUboot架构示意图

MCUboot的主要功能

  • 固件验证:使用加密签名验证固件完整性
  • 安全升级:支持安全无线(OTA)更新
  • 回滚保护:防止降级到不安全的旧版本
  • 多镜像支持:管理多个固件镜像
  • 硬件抽象:支持多种MCU架构

在Zephyr中集成MCUboot

要在Zephyr项目中使用MCUboot,需要以下步骤:

# 添加MCUboot作为子模块
west config manifest.project-filter -- +mcuboot

# 配置项目使用MCUboot
CONFIG_BOOTLOADER_MCUBOOT=y
CONFIG_MCUBOOT_SERIAL=y  # 启用串口DFU
                
注意: MCUboot需要特定的分区表配置。确保你的flash分区包含bootloader、primary和secondary镜像区域。

签名固件

MCUboot使用公钥/私钥对来验证固件。生成签名密钥和签名固件的步骤:

# 生成新的密钥对
imgtool keygen -k my_key.pem -t rsa-2048

# 签名固件
imgtool sign --key my_key.pem --header-size 0x200 --align 8 \
             --version 1.0.0 --slot-size 0x60000 \
             zephyr.bin signed.bin
                
重要: 私钥必须安全存储,绝不能包含在设备固件中。泄露私钥会导致系统安全完全失效。

2. 固件签名与防回滚

固件签名原理

固件签名使用非对称加密技术确保固件的完整性和来源真实性:

  1. 开发者使用私钥对固件哈希值进行加密,生成签名
  2. 签名与固件一起发布
  3. 设备使用预置的公钥验证签名
  4. 只有验证通过的固件才会被执行
安全启动流程

安全启动验证流程

防回滚机制

防回滚是通过固件版本号和安全计数器实现的:

  • 每个固件包含版本号和安全计数器值
  • 设备存储当前运行固件的安全计数器
  • 只有版本号更高或安全计数器更大的固件才能被安装
  • 防止攻击者安装已知漏洞的旧版本固件
// 在MCUboot中配置防回滚
CONFIG_MCUBOOT_DOWNGRADE_PREVENTION=y
CONFIG_MCUBOOT_HW_ROLLBACK_PROT=y
                

安全存储与信任锚

实现完整的安全启动链需要:

  • 信任锚:设备出厂时预置的不可变根密钥
  • 安全存储:使用硬件安全模块(HSM)或信任区(TrustZone)保护密钥
  • 安全计数器:存储在非易失性存储器中的防回滚计数器
  • 安全调试:限制生产设备的调试接口
安全建议: 对于生产设备,应启用所有可用的硬件安全功能,包括闪存写保护、调试接口锁定和安全启动。

扫描购买完整课程

客服小姐姐(优先添加)

扫描联系客服

客服微信