降级保护
为了防止设备被降级到有已知漏洞的固件版本,MCUboot 支持降级保护策略,分为 软件降级保护 与 硬件降级保护。 其中 软件降级保护 又分为基于版本号(version) 和基于安全计数器(security counter) 两种实现方式。
软件降级保护(基于版本号)
基于版本号的软件降级保护,只有 !BOOT_DIRECT_XIP 升级方式下存在。该方式为纯软件实现,无法抵御物理攻击(如 Flash 擦除、重编程)。
原理:
MCUboot 每次启动对固件版本号进行比较。
若新固件版本号低于当前运行固件版本,则拒绝启动。
若新固件版本号大于或等于当前版本,则允许启动。
配置:
CONFIG_MCUBOOT_DOWNGRADE_PREVENTION=y
固件签名时嵌入版本号:
# 示例:在应用程序 prj.conf 或板卡特定配置中设置 CONFIG_MCUBOOT_IMGTOOL_SIGN_VERSION="0.0.1"
备注
版本号被嵌入固件头部(image header)的 image_version 结构体中(参考 MCUboot app 固件)。
软件降级保护(基于安全计数器)
基于 security counter 的软件降级保护,只有 (BOOT_SWAP_USING_MOVE || BOOT_SWAP_USING_SCRATCH || BOOT_SWAP_USING_OFFSET) 方式下存在。
该方式为纯软件实现,无法抵御物理攻击(如 Flash 擦除、重编程)。
原理:
MCUboot 每次启动对 security counter 进行比较。
若新固件的 security counter 小于当前运行固件的 security counter,则拒绝启动。
若新固件的 security counter 大于或等于当前运行固件的 security counter,则允许启动。
配置:
CONFIG_MCUBOOT_DOWNGRADE_PREVENTION=y # security counter 选项开启依赖于该配置 CONFIG_MCUBOOT_DOWNGRADE_PREVENTION_SECURITY_COUNTER=y
固件签名时嵌入 security counter :
# 示例:在应用程序 prj.conf 或板卡特定配置中设置 CONFIG_MCUBOOT_EXTRA_IMGTOOL_ARGS="--security-counter 1"
备注
security counter 是以 IMAGE_TLV_SEC_CNT(0x50)的 TLV 记录形式写入固件受保护 TLV 区域(参考 MCUboot app 固件)。
硬件降级保护(基于 OTP)
原理:
MCUboot 将当前已接受的 security counter 保存到硬件计数器(OTP)中。
如果新固件的 security counter 小于 OTP 记录值,则拒绝启动。
如果新固件的 security counter 大于或等于 OTP 记录值,则允许启动。
配置:
CONFIG_MCUBOOT_HW_DOWNGRADE_PREVENTION=y
固件签名时嵌入 security counter :
# 示例:在应用程序 prj.conf 或板卡特定配置中设置 CONFIG_MCUBOOT_EXTRA_IMGTOOL_ARGS="--security-counter 1"
备注
security counter 保存在一个 32 位 OTP 字中,地址为
0x380(sysreg_sec偏移0x380[31:0])。硬件计数器有上限,请仅在必要时更新,达到上限后可能造成设备启动失败。