ARMv8安全世界切换深度解析(EL3 → SEL1 切换流程)
EL3 → SEL1 切换流程详解当EL3的Secure Monitor需要将控制权交给安全世界的TEE操作系统时就会执行EL3→SEL1的切换。这个流程是安全世界启动的关键也是两个世界之间通信的重要环节。1.1 标准ARMv8实现1.1.1 切换前的准备工作在执行EL3→SEL1切换之前EL3的代码需要完成以下准备工作验证SEL1镜像的签名确保TEE操作系统的镜像没有被篡改。初始化安全内存配置TZC-400总线防火墙划分安全内存区域。初始化安全中断配置GIC中断控制器将安全中断路由到安全世界。准备SEL1的上下文设置ELR_EL3和SPSR_EL3寄存器为切换做准备。1.1.2 上下文准备的具体步骤上下文准备是EL3→SEL1切换中最关键的步骤需要正确设置以下寄存器设置SCR_EL3.NS位将SCR_EL3.NS位清零标记CPU即将进入安全状态。设置ELR_EL3寄存器将ELR_EL3寄存器设置为SEL1镜像的入口地址。设置SPSR_EL3寄存器将SPSR_EL3寄存器设置为SEL1的程序状态包括M[3:0] 0b0101表示返回后运行在EL1使用SP_EL1栈指针D/A/I/F 0b1111屏蔽所有异常其他位根据需要设置代码示例/* 设置SCR_EL3.NS0进入安全状态 */ mrs x0, scr_el3 bic x0, x0, #SCR_NS_BIT msr scr_el3, x0 isb /* 设置ELR_EL3为TEE的入口地址 */ ldr x0, TEE_ENTRY_POINT msr elr_el3, x0 /* 设置SPSR_EL3为EL1状态 */ mov x0, #(SPSR_EL1h | SPSR_DAIF_MASK) msr spsr_el3, x01.1.3 ERET指令的执行过程当所有准备工作完成后EL3的代码执行ERET指令触发异常返回CPU从EL3切换到SEL1。ERET指令的执行过程如下恢复程序计数器将ELR_EL3寄存器的值加载到PC中。恢复程序状态将SPSR_EL3寄存器的值加载到PSTATE中。切换异常等级将当前异常等级从EL3降低到EL1。切换安全状态根据SCR_EL3.NS位的值将CPU切换到安全状态。跳转到SEL1入口CPU跳转到ELR_EL3指向的地址开始执行TEE操作系统的代码。关键要点ERET指令是唯一可以降低异常等级的指令。整个切换过程是原子的不会被中断打断。所有通用寄存器X0-X30的值保持不变不会被硬件修改。1.1.4 硬件自动完成的操作当执行ERET指令时硬件会自动完成以下操作检查SPSR_EL3寄存器中的模式位是否合法。根据SPSR_EL3寄存器中的值更新PSTATE。根据ELR_EL3寄存器的值更新PC。切换异常等级和安全状态。清除异常屏蔽位如果SPSR_EL3中的D/A/I/F位为0。2.2 MT8766定制实现MT8766的EL3→SEL1切换流程与标准ATF有很大差异这主要是因为其合并的preloader.img架构和闭源的Kinibi TEE。2.2.1 Preloader跳转到Kinibi的流程MT8766的preloader.img运行在EL3它负责加载和验证Kinibi TEE的镜像tee.img然后直接跳转到Kinibi的入口地址。具体流程如下加载tee.imgpreloader从eMMC的tee分区加载tee.img到DDR的安全区域。验证tee.img的签名使用eFuse中的根公钥验证tee.img的签名确保其没有被篡改。配置TZC-400划分DDR为安全区域和非安全区域保护Kinibi的代码和数据。配置GIC将安全中断路由到EL3由preloader转发给Kinibi。准备Kinibi的上下文设置ELR_EL3为Kinibi的入口地址设置SPSR_EL3为S-EL1状态。执行ERET指令跳转到Kinibi的入口地址开始执行Kinibi TEE。2.2.2 Kinibi上下文的预置MT8766的preloader会为Kinibi预置大量的上下文信息以简化Kinibi的初始化过程栈指针preloader会为Kinibi分配一块安全内存作为栈并将SP_EL1设置为该栈的顶部。异常向量表preloader会将Kinibi的异常向量表地址写入VBAR_EL1寄存器。系统控制寄存器preloader会初始化SCTLR_EL1、CPACR_EL1等系统控制寄存器。硬件信息preloader会将芯片型号、内存大小、时钟频率等硬件信息传递给Kinibi。2.2.3 与标准实现的差异MT8766的EL3→SEL1切换与标准ATF有以下几个关键差异切换时机不同标准ATF在BL31阶段切换到SEL1而MT8766在preloader阶段切换到SEL1。上下文预置不同标准ATF只设置必要的寄存器而MT8766会预置大量的上下文信息。中断路由不同标准ATF将安全中断直接路由到SEL1而MT8766将安全中断路由到EL3由preloader转发给Kinibi。TEE加载方式不同标准ATF通过FIP包加载TEE而MT8766直接从eMMC的tee分区加载TEE。3.3 安全风险与漏洞分析EL3→SEL1切换流程中的漏洞可能导致攻击者篡改TEE操作系统的镜像或者在切换过程中注入恶意代码从而获取安全世界的控制权。3.3.1 常见漏洞类型签名验证绕过preloader没有正确验证TEE镜像的签名导致攻击者可以刷入恶意的TEE镜像。内存配置错误TZC-400配置错误导致非安全世界可以访问安全内存篡改TEE的代码和数据。上下文注入攻击者利用preloader中的漏洞在切换到SEL1之前篡改上下文信息控制TEE的执行流。中断注入攻击者在切换过程中注入中断破坏切换流程的原子性。3.3.2 安全加固建议为了防止EL3→SEL1切换流程中的漏洞建议采取以下安全加固措施强制签名验证确保所有TEE镜像都必须经过厂商的私钥签名才能运行。严格配置TZC-400正确划分安全内存区域禁止非安全世界访问任何安全内存。上下文完整性校验在切换到SEL1之前校验上下文信息的完整性防止被篡改。屏蔽中断在切换过程中屏蔽所有中断确保切换流程的原子性。代码混淆对preloader中的切换代码进行混淆增加攻击者分析和利用的难度。