6.10. 安全启动

6.10.1. 安全目标

本方案中安全启动要达成的安全目标如下:

防止篡改

只有合法的固件才能在安全设备上运行,保护平台和数据。

防止抄板

固件只能在已授权的平台上运行,防止被复制到其他非授权平台。保护固件。

防止固件版本回滚

升级之后,旧版本的固件重新烧录不能运行。防止已知漏洞被利用。

6.10.2. 总体流程

../../_images/secure_boot_flow.png

图 6.11 安全验证流程

6.10.3. 密钥管理

密钥分为签名密钥和固件加解密的密钥。有部分密钥在出厂阶段烧录在 eFuse 相关密钥区域, 部分密钥嵌入到启动镜像中,保存在存储介质。

6.10.3.1. 签名密钥

当前芯片支持对启动镜像进行签名,固定使用 RSA-2048 进行签名和验证。涉及的密钥和相关数据有:

  1. RSA-2048 非对称密钥对(公钥和私钥)

  2. 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. 签名验证

签名验证流程如下:

  1. 将启动镜像加载到芯片内部 RAM 中

  2. 首先计算公钥数据的数据摘要(MD5),与 ROTPK 中的值进行对比

  3. 如果公钥有效,则使用公钥对镜像的签名数据进行解密,得到镜像的原始数据摘要

  4. 重新计算镜像的数据摘要,并与原始数据摘要进行比较

  5. 结果一致,则签名验证通过

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. 固件解密

固件解密流程如下:

  1. 配置硬件加解密模块(CE),使用 SSK 对代码区域进行 AES-CBC 解密

  2. 解密是原地进行的,直接覆盖原来的加密数据区域

在制作固件的时候,在签名和加密功能都打开的情况下,总是想对固件进行加密,再对加密后的结果进行签名。

6.10.7. 安全 eFuse 配置

eFuse 中与启动安全相关的区域有:

  1. SECURE

  2. SSK

  3. ROTPK

  4. NV CNTR