SEL1 → EL3 切换流程详解当安全世界的TEE操作系统需要请求EL3的服务或者需要返回非安全世界时就会执行SEL1→EL3的切换。这个流程是安全世界与EL3之间通信的核心机制。1.1 标准ARMv8实现1.1.1 触发条件SEL1→EL3的切换有两个触发条件执行SMC指令TEE操作系统或可信应用执行SMC指令请求EL3的服务。发生安全中断当安全外设触发中断时如果CPU当前运行在安全世界中断会直接路由到SEL1如果CPU当前运行在非安全世界中断会路由到EL3由EL3切换到安全世界处理。1.1.2 SMC指令触发的切换流程当SEL1的代码执行SMC指令时切换流程与NSEL1→EL3的切换流程非常相似1.硬件自动完成的操作保存当前PC的值到ELR_EL3寄存器。保存当前PSTATE的值到SPSR_EL3寄存器。切换异常等级从EL1提升到EL3。保持安全状态不变NS0。屏蔽所有异常。跳转到EL3的异常向量表。2.EL3的处理流程保存SEL1的上下文。解析SMC功能号调用对应的处理函数。恢复SEL1的上下文。执行ERET指令返回到SEL1。1.1.3 安全中断触发的切换流程当安全中断发生时切换流程取决于CPU当前运行的安全状态1.CPU当前运行在安全世界SEL1中断直接路由到SEL1由TEE操作系统的中断处理函数处理。不需要切换到EL3。2.CPU当前运行在非安全世界NSEL1中断路由到EL3触发EL3异常。EL3保存非安全世界的上下文。EL3切换到安全世界跳转到SEL1的中断处理函数。中断处理完成后EL3恢复非安全世界的上下文返回到非安全世界。标准ATF的中断路由模型安全中断当CPU在安全世界时路由到SEL1当CPU在非安全世界时路由到EL3。非安全中断总是路由到NSEL1无论CPU当前运行在哪个世界。这种路由模型确保了安全中断总是能够被及时处理同时不会干扰非安全世界的正常运行。2.2 MT8766定制实现MT8766的SEL1→EL3切换流程与标准ATF基本一致但在中断路由方面做了一些定制化修改。2.2.1 Kinibi调用SMC的流程Kinibi TEE通过执行SMC指令请求EL3的服务其流程与标准ATF完全相同。MT8766的preloader提供了大量的SIP SMC命令供Kinibi调用用于控制硬件资源。例如Kinibi通过SMC命令访问硬件加密引擎/* Kinibi中调用SMC访问硬件加密引擎 */ uint32_t result; uint32_t args[4] {0x1234, 0x5678, 0x9abc, 0xdef0}; __asm__ __volatile__( mov x0, %1\n mov x1, %2\n smc #0\n mov %0, x0\n : r (result) : r (MTK_SIP_CRYPTO_CONTROL), r (args) : x0, x1, x2, x3 );2.2.2 安全中断的处理流程MT8766对安全中断的路由做了修改所有安全中断都首先路由到EL3的preloader然后由preloader转发给Kinibi TEE。具体流程如下安全外设触发中断。GIC将中断路由到EL3。EL3的preloader保存当前上下文无论是安全世界还是非安全世界。preloader切换到安全世界跳转到Kinibi的中断处理函数。Kinibi处理中断。处理完成后preloader恢复之前的上下文返回到被中断的世界。这种设计的优点是preloader可以统一管理所有中断提高系统的安全性和稳定性缺点是增加了中断处理的延迟。2.2.3 与标准实现的差异MT8766的SEL1→EL3切换与标准ATF有以下几个关键差异中断路由不同标准ATF将安全中断直接路由到SEL1而MT8766将所有安全中断都路由到EL3。上下文保存不同MT8766的preloader会保存更多的上下文信息以确保中断处理的正确性。SMC命令不同MT8766提供了大量自己的SIP SMC命令供Kinibi调用。3.3 安全风险与漏洞分析SEL1→EL3切换流程中的漏洞可能导致攻击者从安全世界发起攻击获取EL3的完全控制权或者从非安全世界注入恶意代码到安全世界。3.3.1 常见漏洞类型SMC处理函数漏洞EL3的SMC处理函数存在输入验证不足、缓冲区溢出等漏洞允许攻击者从安全世界提权到EL3。中断注入攻击攻击者在切换过程中注入中断破坏上下文的完整性。上下文泄露EL3的代码没有正确清除上下文信息导致敏感信息泄露到安全世界或非安全世界。权限提升EL3的代码没有正确检查调用者的权限允许安全世界的代码执行高权限操作。3.3.2 安全加固建议为了防止SEL1→EL3切换流程中的漏洞建议采取以下安全加固措施严格验证SMC输入对来自安全世界的SMC调用进行严格的输入验证防止缓冲区溢出和指针越界。中断屏蔽在切换过程中屏蔽所有中断确保切换流程的原子性。上下文隔离将安全世界和非安全世界的上下文存储在不同的内存区域防止相互干扰。敏感信息清零处理完成后清除所有包含敏感信息的寄存器和内存缓冲区。最小权限原则每个SMC命令只授予完成其功能所需的最小权限。
ARMv8安全世界切换深度解析(SEL1 → EL3 切换流程)
SEL1 → EL3 切换流程详解当安全世界的TEE操作系统需要请求EL3的服务或者需要返回非安全世界时就会执行SEL1→EL3的切换。这个流程是安全世界与EL3之间通信的核心机制。1.1 标准ARMv8实现1.1.1 触发条件SEL1→EL3的切换有两个触发条件执行SMC指令TEE操作系统或可信应用执行SMC指令请求EL3的服务。发生安全中断当安全外设触发中断时如果CPU当前运行在安全世界中断会直接路由到SEL1如果CPU当前运行在非安全世界中断会路由到EL3由EL3切换到安全世界处理。1.1.2 SMC指令触发的切换流程当SEL1的代码执行SMC指令时切换流程与NSEL1→EL3的切换流程非常相似1.硬件自动完成的操作保存当前PC的值到ELR_EL3寄存器。保存当前PSTATE的值到SPSR_EL3寄存器。切换异常等级从EL1提升到EL3。保持安全状态不变NS0。屏蔽所有异常。跳转到EL3的异常向量表。2.EL3的处理流程保存SEL1的上下文。解析SMC功能号调用对应的处理函数。恢复SEL1的上下文。执行ERET指令返回到SEL1。1.1.3 安全中断触发的切换流程当安全中断发生时切换流程取决于CPU当前运行的安全状态1.CPU当前运行在安全世界SEL1中断直接路由到SEL1由TEE操作系统的中断处理函数处理。不需要切换到EL3。2.CPU当前运行在非安全世界NSEL1中断路由到EL3触发EL3异常。EL3保存非安全世界的上下文。EL3切换到安全世界跳转到SEL1的中断处理函数。中断处理完成后EL3恢复非安全世界的上下文返回到非安全世界。标准ATF的中断路由模型安全中断当CPU在安全世界时路由到SEL1当CPU在非安全世界时路由到EL3。非安全中断总是路由到NSEL1无论CPU当前运行在哪个世界。这种路由模型确保了安全中断总是能够被及时处理同时不会干扰非安全世界的正常运行。2.2 MT8766定制实现MT8766的SEL1→EL3切换流程与标准ATF基本一致但在中断路由方面做了一些定制化修改。2.2.1 Kinibi调用SMC的流程Kinibi TEE通过执行SMC指令请求EL3的服务其流程与标准ATF完全相同。MT8766的preloader提供了大量的SIP SMC命令供Kinibi调用用于控制硬件资源。例如Kinibi通过SMC命令访问硬件加密引擎/* Kinibi中调用SMC访问硬件加密引擎 */ uint32_t result; uint32_t args[4] {0x1234, 0x5678, 0x9abc, 0xdef0}; __asm__ __volatile__( mov x0, %1\n mov x1, %2\n smc #0\n mov %0, x0\n : r (result) : r (MTK_SIP_CRYPTO_CONTROL), r (args) : x0, x1, x2, x3 );2.2.2 安全中断的处理流程MT8766对安全中断的路由做了修改所有安全中断都首先路由到EL3的preloader然后由preloader转发给Kinibi TEE。具体流程如下安全外设触发中断。GIC将中断路由到EL3。EL3的preloader保存当前上下文无论是安全世界还是非安全世界。preloader切换到安全世界跳转到Kinibi的中断处理函数。Kinibi处理中断。处理完成后preloader恢复之前的上下文返回到被中断的世界。这种设计的优点是preloader可以统一管理所有中断提高系统的安全性和稳定性缺点是增加了中断处理的延迟。2.2.3 与标准实现的差异MT8766的SEL1→EL3切换与标准ATF有以下几个关键差异中断路由不同标准ATF将安全中断直接路由到SEL1而MT8766将所有安全中断都路由到EL3。上下文保存不同MT8766的preloader会保存更多的上下文信息以确保中断处理的正确性。SMC命令不同MT8766提供了大量自己的SIP SMC命令供Kinibi调用。3.3 安全风险与漏洞分析SEL1→EL3切换流程中的漏洞可能导致攻击者从安全世界发起攻击获取EL3的完全控制权或者从非安全世界注入恶意代码到安全世界。3.3.1 常见漏洞类型SMC处理函数漏洞EL3的SMC处理函数存在输入验证不足、缓冲区溢出等漏洞允许攻击者从安全世界提权到EL3。中断注入攻击攻击者在切换过程中注入中断破坏上下文的完整性。上下文泄露EL3的代码没有正确清除上下文信息导致敏感信息泄露到安全世界或非安全世界。权限提升EL3的代码没有正确检查调用者的权限允许安全世界的代码执行高权限操作。3.3.2 安全加固建议为了防止SEL1→EL3切换流程中的漏洞建议采取以下安全加固措施严格验证SMC输入对来自安全世界的SMC调用进行严格的输入验证防止缓冲区溢出和指针越界。中断屏蔽在切换过程中屏蔽所有中断确保切换流程的原子性。上下文隔离将安全世界和非安全世界的上下文存储在不同的内存区域防止相互干扰。敏感信息清零处理完成后清除所有包含敏感信息的寄存器和内存缓冲区。最小权限原则每个SMC命令只授予完成其功能所需的最小权限。