OTA(Over-The-Air)固件升级是嵌入式设备生命周期管理的核心。然而,便捷性也带来了巨大的安全风险。如果攻击者能够植入伪造的、包含后门的固件,设备的完整性将荡然无存。确保OTA升级的安全性,就像给固件加了一道“生死线”,核心在于两大关键机制:数字签名校验和回滚保护。
1. 数字签名:确认固件的“身份”
数字签名是防止非法固件植入的第一道防线。它使用非对称加密技术,确保固件确实来自可信的发行者(即你),并且在传输过程中未被篡改。
工作原理
- 密钥对创建:开发者生成一对RSA或ECC密钥(私钥用于签名,公钥烧录进设备)。
- 固件签名:在发布固件前,私钥用于对固件二进制文件计算哈希值,然后对该哈希值进行加密生成数字签名。
- 设备校验:设备端的安全引导加载程序(Secure Bootloader)接收到新固件后,使用预先存储的公钥来解密签名,得到原始哈希值。同时,它独立计算新固件的哈希值。如果这两个哈希值一致,则固件被认为是有效且未经篡改的。
实操示例:使用OpenSSL进行签名(概念演示)
我们以一个简单的firmware.bin文件为例,展示如何在服务器端生成签名,以及设备端如何进行校验。
步骤一:生成私钥和公钥(服务器端)
# 生成一个2048位的RSA私钥
openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keysize:2048
# 提取公钥(公钥将被烧录进设备的安全存储区)
openssl pkey -in private.key -pubout -out public.pem
步骤二:对固件进行签名(服务器端)
假设我们有一个待升级的固件文件 new_firmware.bin:
# 使用私钥对固件的SHA256摘要进行签名
openssl dgst -sha256 -sign private.key -out new_firmware.sig new_firmware.bin
步骤三:设备端的校验逻辑(概念验证)
设备端的Bootloader收到 new_firmware.bin 和 new_firmware.sig 后,使用预置的public.pem进行校验:
# 验证签名
openssl dgst -sha256 -verify public.pem -signature new_firmware.sig new_firmware.bin
# 如果输出 'Verified OK',则签名有效,固件可信。
2. 回滚保护:封死旧版本漏洞的入口
仅有数字签名是不够的。如果攻击者设法获取了一个老版本(例如版本V1.0,该版本存在已知的安全漏洞)的合法签名固件包,并试图通过OTA降级设备,那么即使签名有效,设备仍然会暴露在高风险之中。这就是回滚保护(Anti-rollback Protection)的价值所在。
工作原理:单调递增版本号
回滚保护的核心是确保设备只接受版本号严格高于当前运行版本的固件。这通常通过以下机制实现:
- 版本号嵌入:每个固件包中都包含一个清晰、不可篡改的版本号(V1.0, V1.1, V2.0等)。
- 安全存储:当前已安装的固件版本号必须存储在一个安全、不可轻易擦除或篡改的位置(例如,主控芯片的熔丝位、一次性可编程存储区OTP,或受保护的启动配置块)。
- Bootloader校验:在进行固件安装之前,安全引导程序会执行一个关键的比较步骤:
- if (New_Firmware_Version > Current_Installed_Version):
- 通过,允许安装。
- else:
- 失败,拒绝安装,即使数字签名校验通过。
- if (New_Firmware_Version > Current_Installed_Version):
伪代码示例:引导加载程序的关键决策点
// 假设 CurrentVersion 存储在安全区域
int CurrentVersion = GetSecureBootVersion();
// 从OTA包中解析新固件的版本号
int NewVersion = ParseFirmwareHeader(ota_package);
if (VerifyDigitalSignature(ota_package) == SUCCESS) {
if (NewVersion > CurrentVersion) {
// 签名通过且版本号递增,更新固件
InstallFirmware(ota_package);
// 更新安全存储区的版本号
UpdateSecureBootVersion(NewVersion);
printf("OTA Update Success.\n");
} else {
// 签名通过,但版本号不满足单调递增要求 (试图回滚)
printf("Error: Rollback attempt detected. Update aborted.\n");
}
} else {
// 签名校验失败
printf("Error: Digital signature verification failed. Update aborted.\n");
}
总结
数字签名解决了固件的真实性和完整性问题,确保固件来自可信源且未被篡改;回滚保护解决了时效性问题,确保设备只能运行最新、最安全的固件版本。在设计任何嵌入式设备的OTA升级机制时,必须将这两者紧密结合到安全引导加载程序中,才能真正锁死非法固件的入口,保障设备的长期安全。
汤不热吧