6.10. 安全启动
6.10.1. 安全目标
本方案中安全启动要达成的安全目标如下:
防止篡改 |
只有合法的固件才能在安全设备上运行,保护平台和数据。 |
防止抄板 |
固件只能在已授权的平台上运行,防止被复制到其他非授权平台。保护固件。 |
防止固件版本回滚 |
升级之后,旧版本的固件重新烧录不能运行。防止已知漏洞被利用。 |
6.10.2. 总体流程
6.10.3. 密钥管理
密钥分为签名密钥和固件加解密的密钥。有部分密钥在出厂阶段烧录在 eFuse 相关密钥区域, 部分密钥嵌入到启动镜像中,保存在存储介质。
6.10.3.1. 签名密钥
当前芯片支持对启动镜像进行签名,固定使用 RSA-2048 进行签名和验证。涉及的密钥和相关数据有:
RSA-2048 非对称密钥对(公钥和私钥)
ROTPK
RSA 密钥对可由 Openssl 工具生成。RSA 私钥用于对启动镜像进行签名,在生成量产固件时使用,厂商必须严密保管以防泄露; RSA 公钥保存为标准的 DER 公钥文件,并且保存在启动镜像中,设备启动过程中 BROM 用其对加载的启动镜像进行签名认证。
为了保证公钥的真实性,还需要将 RSA 公钥的数据摘要信息(MD5)烧录到eFuse 的 ROTPK 区域, BROM 在使用公钥前首先要检查其数据摘要信息与 ROTPK 中的数据摘要信息是否一致。 ROTPK 需要在出厂时设置写保护,以防被恶意修改。
6.10.3.2. AES 密钥
当前芯片支持使用 AES-128 算法对启动镜像的可执行代码区域进行加密,其使用的密钥在出厂阶段烧录在 eFuse 的 SSK 区域。BROM 在启动时会使用SSK 对固件进行解密。
SSK 区域需要在出厂时设置为仅硬件加解密模块可以读访问,CPU 不可读写,以防被攻击者读取到密钥的信息。
6.10.4. 签名验证
签名验证流程如下:
将启动镜像加载到芯片内部 RAM 中
首先计算公钥数据的数据摘要(MD5),与 ROTPK 中的值进行对比
如果公钥有效,则使用公钥对镜像的签名数据进行解密,得到镜像的原始数据摘要
重新计算镜像的数据摘要,并与原始数据摘要进行比较
结果一致,则签名验证通过
6.10.5. 防回滚检查
固件防回滚的目的是防止有已知漏洞的固件,被重新烧录到平台上运行,攻击者利用已知漏洞对平台进行攻击。 D211 的固件防回滚是通过受保护的 eFuse 记录版本号来实现的。在固件升级重启期间, BROM 会拿当前固件的版本计数值与 eFuse 中的记录版本计数值进行比较,如果当前版本计数值大于 eFuse 记录的版本计数值,则更新 eFuse NV Counter,成功则正常启动;如果当前版本计数值小于 eFuse 记录的版本计数值,则启动失败。
eFuse NV Counter 总共128 位,最多可记录128个不同的版本计数值。如果 NV Counter 中的所有位都被使用完, 则只要是版本计数值大于 128 的都可以运行。
这里的版本计数值与固件版本号是两个独立的值,制作固件的时候指定。 eFuse NV Counter 仅 BROM 有权限更新,BROM 退出后所有模块只能读取 eFuse NV Counter 的值。
6.10.6. 固件解密
固件解密流程如下:
配置硬件加解密模块(CE),使用 SSK 对代码区域进行 AES-CBC 解密
解密是原地进行的,直接覆盖原来的加密数据区域
在制作固件的时候,在签名和加密功能都打开的情况下,总是想对固件进行加密,再对加密后的结果进行签名。
6.10.7. 安全 eFuse 配置
eFuse 中与启动安全相关的区域有:
SECURE
SSK
ROTPK
NV CNTR