本博客只涉及技术问题,尊重原创,不涉及商用问题。
目录
2 配置Root-of-Trust to QFPROM eFuses. 10
一 概述
安全启动是指为安全应用程序建立可信平台的启动序列。它以一个不变的启动序列开始,该序列使用加密身份校验来验证代码的来源,因此只能执行授权的软件。启动序列将设备置于已知的安全状态,防止用二进制修改软件和镜像重刷攻击。
安全启动系统向启动过程的每个阶段添加加密检查。每个过程判断设备执行的所有安全软件镜像的真实性。这个附加检查可防止任何未经授权或恶意修改的软件在设备上运行。安全启动通过一组硬件熔丝来启用。必须由硬件保险丝中标识的受信任签署实体程序才能被运行。
二 原理及流程
2.1 安全启动原理
设备的启动包含多个过程。每个过程中的镜像都会执行特定的功能,并且每个镜像都由上一个镜像(例如,主引导加载程序(PBL)→辅助引导加载程序(SBL)→ARM TrustZone)进行验证。根信任(启动此过程的最受信任的实体)是PBL,它是出厂固化在ROM中,因此已经受信任。在执行启动序列中的下一个镜像之前,首先对该镜像进行身份验证,以确保它是授权软件。例如,只有当SBL被PBL成功验证之后,才会让SBL运行。因为SBL现在是可信的,所以可以信任它来对下一个镜像进行身份验证。这些镜像通过其功能进一步建立了设备的安全性。
2.2 安全启动结构图:
2.3 安全启动流程图
三 证书简介
证书链用于对镜像进行身份验证。首先,验证镜像的证书链。例如,sbl使用appsbl的证书链对应用程序引导加载程序(appsbl)镜像进行身份验证。链中的认证证书根据中间证书进行认证(认证CA,反过来根据根CA进行认证(见下图)。根证书本身根据不可变区域中提供的散列进行身份验证–位于受信任区域中的QFPROM或qti的密钥表。
验证证书链后,使用认证证书(公钥A)中的公钥对其进行解密,来验证代码签名(签名D)。
四 签名镜像格式
安全启动场景:
五 熔丝熔断
5.1 熔断使能
以下熔丝必须被熔断来使能安全启动:
5.2 熔断过程
5.2.1 使用Sectorols.py工具生成一组自定义的熔丝熔断值。此工具生成具有以下格式的sec.dat二进制文件:
5.2.2 生成的sec.dat文件被烧写到设备nand中的sec分区。以下命令用于将sec.dat烧写到sec分区中:
Fastboot flash sec <Path of sec.dat>
5.2.3 在烧写后的下一次重新启动中,SBL1从设备读取SE分区数据并将其加载到TrustZone DDR区域
5.2.4 在跳转到appsbl之前,trustzone确定是否已发生熔丝熔断。这是通过读取QFPROM_RAW_RD_WR_PERM_MSB中的OEM_SEC_BOOT位是否断开来完成的。
5.2.5 如果没有断开,trustzone将解析DDR中加载的sec.dat文件,并逐个解析熔丝列表中的熔丝值。
5.2.5 要强制执行熔丝值,TrustZone将重新启动设备
5.2.6 重新启动后,将对所有预期的熔丝列表进行熔断。
流程框图如下:
六 安全启动使能步骤
1 利用openssl工具生成证书链
1.1 新建临时目录tmp
mkdir tmp
cd tmp
1.2 复制opensslroot.cfg和v3.ext到tmp目录,这两个文件在后面的命令中要用到: