TEE/Trustzone学习

TEE/Trustzone学习

TEE

可信执行环境 Trusted Execution Environment(TEE) 是一种安全环境,该隔离的安全环境运行在隔离的硬件之上,用来专门处理敏感数据以保证信心安全,其中执行的代码和访问的数据在机密性(没有人可以访问数据)和不可篡改性(没有人可以更改代码及其行为)方面被隔离和保护。

Intel SGX(Intel Software Guard Extensions) 是Intel提供的TEE实现,由于过去十年Intel在市场上的主流位置,Intel SGX也自然而然地成为了最常用的TEE方案之一。在SGX中,用于执行代码的TEE环境被称为Enclave(飞地),在Enclave中的数据可以确保其机密性和完整性;而Intel也提供了一个用于验证某个结果是否由SGX所执行出来,以此确保恶意者伪装成SGX来窃取信息;最后SGX方案提供了更广阔的安全边界,内存数据,包括Bios都无法获取到SGX中的加密数据。

除了Intel SGX外,几乎所有主流的芯片企业都提供了TEE解决方案。在ARM中是TrustZone方案,而在AMD中则是 PSP方案。其它手机端芯片例如联发科,高通等也广泛采取了TEE技术。

Arm的TrustZone技术提供了一种高效的、系统范围的安全方法,它将硬件强制隔离内置于CPU中。
多区域安全是Hex-Five安全创建的第一个RISC-V可信执行环境。
AMD平台安全处理器(PSP)的正式名称是AMD安全技术,是一个集成在AMD微处理器中的可信执行环境子系统。
苹果使用了一种专用处理器SEP(Secure Enclave processor)来实现数据保护、触摸ID和人脸识别等功能。SEP负责处理密钥和其他信息,如生物特征识别,这些信息非常敏感,不会被应用处理器处理。
谷歌也有一个类似的解决方案称为Titan M,这是一些Android Pixel设备上可用的外部芯片,可以实现TEE和处理安全引导、锁屏保护、磁盘加密等功能。

TEE/Trustzone学习_第1张图片

TEE将整个系统环境分为安全环境与 非安全或不受信任的富执行环境(REE,Rich Execution Environment)

TEE操作系统通常由具有较高特权的内核和具有较低特权的多个应用程序(称为可信应用程序,TA,Trusted Applications)组成。TA之间彼此隔离,且与TEE内核隔离。这样一来,如果有应用程序被攻陷,它就无法危害到其他应用程序或TEE内核。
简而言之,一个强大的TEE机制可以实现下述三类隔离:

1、TEE与REE之间的隔离;
2、TA和TEE内核之间的隔离;
3、TA之间的隔离。

为了达到这些安全需求,TEE需要硬件原语的支持,以强制进行隔离。硬件和软件之间的配合是至关重要的,并且需要持续配合。

TEE只接受经过适当授权并由其他授权代码检查的代码来执行。因此,在TEE中,我们需要一个安全引导特性来检查所有操作系统组件(引导加载程序、内核、文件系统、可信应用程序等)的完整性和真实性。这样可以确保在设备关机时没有人篡改操作系统的代码。

TEE/Trustzone学习_第2张图片

TrustZone

在现代计算机中,CPU 通过内存映射手段给每个进程营造一个单独的地址空间来隔离多个进程的代码和数据,通过内核空间和用户空间不同的特权级来隔离操作系统和用户进程的代码和数据。但由于内存中的代码和数据都是明文,容易被同处于内存中的其它应用偷窥,因此出现了扩展的安全模块,应用将加密数据送往安全模块,由安全模块处理完后再返回结果给相应的应用。

TrustZone 是 ARM 针对消费电子设备设计的一种硬件架构,其目的是为消费电子产品构建一个安全框架来抵御各种可能的攻击。

TrustZone 在概念上将 SoC 的硬件和软件资源划分为安全(Secure World)非安全(Normal World) 两个世界。

所有需要保密的操作在安全世界执行(如指纹识别、密码处理、数据加解密、安全认证等),其余操作在非安全世界执行(如用户操作系统、各种应用程序等),安全世界和非安全世界通过一个名为 Monitor Mode的模式进行转换,如图:

TEE/Trustzone学习_第3张图片

在monitor模式下运行时,CPU处于安全状态,可以访问设备的所有外围设备和内存。不在这种模式下运行时,CPU处于非安全状态,只能访问外设的子集和特定范围的物理内存。

处理器架构上,TrustZone 将每个物理核虚拟为两个核,一个非安全核 (Non-secure Core, NS Core),运行非安全世界的代码;和另一个安全核 (Secure Core),运行安全世界的代码。

两个虚拟的核以基于时间片的方式运行,根据需要实时占用物理核,并通过 Monitor Mode 在安全世界和非安全世界之间切换,类似同一CPU下的多应用程序环境,不同的是多应用程序环境下操作系统实现的是进程间切换,而 Trustzone 下的 Monitor Mode 实现了同一 CPU 上两个操作系统间的切换。

组件

要实现这样一套硬件架构,首先需要SoC中的各个硬件模块都实现对 Trustzone 的支持,才能称之为完整的 security system。

其中主要的组件有:

必选组件

AMBA3 AXI总线,安全机制的基础设施
AMBA3 AXI(AMBA3 Advanced eXtensible Interface)系统总线作为 TrustZone 的基础架构设施,提供了安全世界和非安全世界的隔离机制,确保非安全核只能访问非安全世界的系统资源,而安全核能访问所有资源,因此安全世界的资源不会被非安全世界(或普通世界)所访问。

虚拟化的ARM Core,虚拟安全和非安全核

TZPC (TrustZone Protection Controller),根据需要控制外设的安全特性

TZASC (TrustZone Address Space Controller),对内存进行安全和非安全区域划分和保护

可选组件

TZMA (TrustZone Memory Adapter),片上ROM或RAM安全区域和非安全区域的划分和保护

AXI-to-APB bridge,桥接 APB 总线,配合 TZPC 使 APB 总线外设支持 TrustZone 安全特性

设计上,TrustZone 并不是采用一刀切的方式让每个芯片厂家都使用同样的实现。总体上以 AMBA3 AXI 总线为基础,针对不同的应用场景设计了各种安全组件,芯片厂商根据具体的安全需求,选择不同的安全组件来构建他们的 TrustZone 实现。

常见大致上需要以下几个模块:

1. Bus

这里涉及的总线分为两种,一种是 AMBA3 AXI system bus(系统总线),一种是 AMBA3 APB peripheral bus(外围总线)

前面说到 trustzone 技术会将系统划分为两种模式:secure 和 Non-secure。而划分的基础就是 AXI 系统总线一条控制线的电平高低。简单来说,就是 ARM 为 AXI 总线每个信道的读写操作都新增了一个标记位:NS bit

主设备为Non-secure 状态时,发起读写请求,NS bit 必须置为高电平;主设备为 Secure 状态时,发起读写请求,NS bit 必须置为低电平。

APB 外围总线通过 AXI-to-APB bridge 连接到系统总线,可以实现对外设的安全访问管控,这里的外设可以包括 interrupt controller,timer 等。

2. Processor

ARMv6 之前的 Processor 有 6 种 privilege mode:FIQ,IRQ,Supervisor(SVC),Abort(ABT),Undefined(UND),System(SYS),以及一种 non-privilege mode:User(USR)。
引入 Trustzone 之后,CPU core 被虚拟出 secure statenon-secure state,那么很自然就需要一个能够切换两种 state 的开关,由此在 7 种 CPU mode 之外,新增了 monitor(MON)mode

在 ARM core 的 technical reference manual 中,对 Trustzone 技术的支持一般被描述为 security extension

目前主流使用的 ARM core architecture 主要是 ARMv7 和 ARMv8。两种架构下的 CPU security extension 差异巨大,但总的来说,都是将 CPU 的每个 core 都虚拟出 secure 和 Non-secure 两种模式,当 core 为 Non-secure 时,Secure Configuration Register 的 NS bit 置为 1,为 secure 模式时,NS bit 置为 0。NS bit 默认为 0,也就是说,CPU 上电后每个 core 都默认为 secure mode。

TEE/Trustzone学习_第4张图片

secure world 和 normal world 的切换需要CPU 先进入 monitor mode。与 userspace 通过 svc 指令可以从 USR mode 切换到 SVC mode 类似,ARM 也提供了一条可以进入 monitor mode 的软中断指令: smc。下图是通过 monitor mode 切换 secure 和 normal world 的示意图:
TEE/Trustzone学习_第5张图片

以 userspace application 进程需要访问某安全资源举例,简要说明一下切换流程:

1、App 通过 syscall svc 指令进入Kernel space OS(SVC mode);

2、Kernel space OS 通过 smc 指令进入 monitor mode;

3、运行在 Monitor mode 的代码首先保存 Non-secure 状态下的 CPU contexts,如 lr,sp,spsr等,然后将 CPU NS bit 置为 0,表示进入 secure state,通过 rfe 指令(return from exception)进入 secure OS;

4、 secure OS 叫起 secure application 处理完相应的安全资源访问请求之后,发送 smc 指令,再次回到 monitor mode;

5、运行在 Monitor mode 的代码同样首先保存 secure 状态下的 CPU contexts,如 lr,sp,spsr等,然后将 CPU NS bit 置为 1,表示进入 non-secure state,然后恢复 Non-secure state下的CPU contexts,通过 **rfe 指令(reture from exception)**重新回到 non-secure OS;

除了 smc 指令触发的software exception 会进入 monitor mode,也可以配置某些硬件中断触发进入 monitor mode,如 FIQ,IRQ,external data abort,external prefetch abort。都可以通过配置 system register 来决定哪些 hardware exception 可以触发 cpu 陷入 monitor mode。

除此之外,两种模式下 CPU core 对中断的处理,MMU / Cache访问,Timer,Debug 等等都做了相应的安全扩展。

3. Interrupt controller

常见支持 Trustzone 的 interrupt controller IP 有 PL390,GIC-400,GIC-500,简单说就是能够区分 secure interrupt 和 Non-secure interrupt,实现对中断处理的隔离。同样 GIC 的不同版本对 security extension 的设计也不尽相同,常见的 GICv2 和 GICv3 就有着较大差异。

4. Trustzone Address Space Controller

CPU core MMU 的 security extension 主要是针对 CPU 内存空间的安全访问控制,而 TZASC 主要是针对 DRAM。TZASC通常布置在 CPU 和 DRAM controller 之间,通过新增一条地址线表示 NS bit,可以将 DRAM 划分为 secure CPU core 可访问区域和 Non-secure CPU core 可访问区域,实现 DRAM 的隔离。常见的 TZASC IP 有 PL-380 和 TZC-400。针对 on-SoC 的静态内存(ROM 和 SRAM)的区域划分,则需要通过使用 Trustzone Memory Adapter (TZMA)来完成。

5. Trustzone Protection Controller

挂在 AXI-to-APB bridge 上,用以区分外设是 secure 还是 Non-secure。

TEE/Trustzone学习_第6张图片

上图中,支持 Trustzone 的 ARM core 通过 AXI 总线TZMA,SRAM,AXI-to-APB bridge 相连,其中 AXI-to-APB bridge 上挂了四个外设,TZPC 永远配置为 secure peripheral,timer 和 RTC 是 Non-secure peripheral,而 KMI (Keyboard and Mouse Interface)为 secure peripheral 还是 Non-secure peripheral 是 software programmable。KMI secure 和 Non-secure 的切换,由软件配置 TZPC 来完成,而由于 TZPC always 是 secure 外设,所以 TZPC 的配置只能在 CPU 是 secure mode 下才能实现。

从软件层面来看,就是只有 Trusted OS 才能配置 TZPC。那么将 Keyboard 设置为 secure 的一个作用就是可以在安全环境下让用户输入密码。
同样,当有外设需要访问 DRAM 或者 SRAM 的 secure region 时,也需要通过 TZPC 实现对外设的控制。

参考:
PRD29-GENC-009492C_trustzone_security_whitepaper.pdf
https://www.jianshu.com/p/3f952f2c8bf4
https://zhuanlan.zhihu.com/p/504531528
https://zuopeng.blog.csdn.net/article/details/115608087
https://blog.csdn.net/Thanksgining/article/details/111248666

你可能感兴趣的:(安全方案,android,arm)