baron · 6月27日

Armv8/Armv9的Trustzone技术

快速连接

👉👉👉【精选】ARMv8/ARMv9架构入门到精通-目录 👈👈👈

1、背景

随着时代的发展、科技的进步,安全需求的趋势也越来越明显,ARM也一直在调整和更新其新架构,很多都是和安全相关的。如下列出了一些和安全相关的架构

image.png

Trustzone做为ARM安全架构的一部分,从 2008 年 12月 ARM 公司第一次 release Trustzone 技术白皮书。2013 年 Apple 推出了第一款搭载指纹解锁的 iPhone:iPhone 5s,用以保证指纹信息安全的 Secure Enclave 技术据分析深度定制了 ARM trustzone 架构,印象中这大概是 Trustzone 技术第一次走进大众视线。到如今 Trustzone 技术已经成为移动安全领域的重要基础技术,你也许不了解它的技术原理,但它一直默默为你守护你的指纹信息,账户密码等各种敏感数据。如下也列出了一张在Trustzone架构下的一张指纹的框图,这也是这些年(2015-至今)比较流行的一张软件框图。

image.png

2、TrustZone是什么?

那么TrustZone到底是什么呢? ARM Trustzone不具体指一个硬件,也不是一个软件,而是一个技术架构. 最初TrustZone只是 Arm A-profile 架构中安全架构的名称。TrustZone 首先在 Armv6K 中引入,Armv7-A 和 Armv8-A 也支持 TrustZone。TrustZone 提供了两个执行环境,它们之间具有系统范围的硬件强制隔离,如下图所示:

image.png

普通世界运行着丰富的软件。该软件堆通常包括一个大型应用程序集、一个复杂的操作系统(如 Linux),可能还有一个hypervisor程序。此类软件庞大且复杂。虽然可以努力保护它们,但攻击面的大小意味着它们更容易受到攻击。可信世界运行一个更小、更简单的软件,称为可信执行环境 (TEE)。通常,一个 TEE 包括多个由轻量级内核托管的可信服务。可信服务提供诸如密钥管理之类的功能。该软件的攻击面要小得多,这有助于减少攻击的脆弱性。

你有时可能会看到术语富执行环境 (REE) 用于描述在正常世界中运行的软件。

TrustZone 旨在做一个平衡。作为用户和开发人员,我们希望拥有 Normal 世界的丰富功能集和灵活性。同时,我们希望在 Trusted 世界中使用更小、更受限制的软件可以实现更高程度的信任。TrustZone 为我们提供了两者,为两个环境提供了它们之间的硬件强制隔离。

TrustZone for Armv8-MTrustZone 还用于指代 Armv8-M 架构中的安全扩展。虽然 A 配置文件架构和 M 配置文件架构中的 TrustZone 之间存在相似之处,但也存在重要差异。本文主要介绍 A 系列。

3、processor中的Trustzone技术

接下来我们将讨论处理器内对 TrustZone 的支持。

3.1. 两个安全状态: secure、non-secure

在 Arm 架构中,有两种安全状态:安全和非安全。

在 EL0、EL1 和 EL2级别,处理器可以处于安全状态或非安全状态,这由 SCR_EL3.NS 位控制。所以你经常看到这样写:

  • NS.EL1: Non-secure state, Exception level 1
  • S.EL1: Secure state, Exception level 1

注意:无论 SCR_EL3.NS 位的值如何,EL3 始终处于安全状态。 安全状态和异常级别的排列如下所示:

image.png

3.2. 安全状态的切换

如果处理器在 NS.EL1 并且软件想要移动到 S.EL1,它是如何做到的?要更改安全状态,在任一方向上,执行都必须通过 EL3,如下图所示:

image.png

上图显示了在安全状态之间移动所涉及的步骤的示例序列。一次采取这些步骤:

  • 进入更高的异常级别需要异常。通常,此异常是 FIQ 或 SMC(安全监控调用)异常。稍后我们将更详细地了解中断处理和 SMC。
  • 在 EL3 中运行的软件会切换 SCR_EL3.NS 位。
  • 异常返回,处理器从 EL3返回到S.EL1。

更改安全状态不仅仅是在异常级别之间移动和更改 SCR_EL3.NS 位。我们还必须考虑处理器状态。

向量寄存器、通用寄存器和大多数系统寄存器只有一份副本。当在安全状态之间移动时,保存和恢复寄存器状态是软件而非硬件的责任。按照惯例,执行此操作的软件称为安全监视器。这使我们之前的示例看起来更像您在下图中看到的内容:

image.png

Trusted Firmware 是 Arm 的一个开源项目,提供了Secure Monitor的参考实现。我们将在本文后面讨论可信固件。

少数寄存器根据安全状态banked。这意味着该寄存器有两个副本,core会自动使用属于当前安全状态的副本。当系统寄存器是banked时,我们使用 (S) 和 (NS) 来标识我们正在引用的副本。例如, ICCBPR1EL1(S) 和 ICCBPR1EL1(NS)。注意:在 Armv6 和 Armv7-A 中,大多数系统寄存器都是根据安全状态banked。现在通用寄存器和向量寄存器仍然都是banked。

3.3. 虚拟地址空间

我们知道ARM有虚拟地址概念,也有MMU页表转换机制的概念。例如,EL0/1 有一个translation regime,EL2 有一个单独的translation regime,如下所示:

image.png

安全和非安全状态也有单独的translation regime。例如,有Secure EL0/1 translation regime和Non-secure EL0/1 translation regime,如下所示:

image.png

写入地址时,约定使用前缀来标识所引用的翻译机制:

  • NS.EL1:0x8000 - 非安全 EL0/1 转换机制中的虚拟地址 0x8000
  • S.EL1:0x8000 - 安全 EL0/1 转换机制中的虚拟地址 0x8000

需要注意的是,S.EL1:0x8000 和 NS.EL1:0x8000 是两个不同且独立的虚拟地址。处理器不会在安全状态下使用 NS.EL1 转换,也不会在非安全状态下使用 S.EL1 转换。

3.4. 物理地址空间

除了两个安全状态外,Trustzone架构还提供了两个物理地址空间:安全和非安全。

  • 在非安全状态下,虚拟地址始终转换为非安全物理地址。这意味着处于 Non-secure 状态的软件只能看到 Non-secure 资源,而永远看不到 Secure 资源。这在此处说明:

image.png

思考:在非安全状态下,我强制将entry中的NS修改成0,那么MMU是怎么转换的?会转换到secure的物理地址,还是访问的时候报错?
  • 在安全状态下,软件可以访问安全和非安全物理地址空间。转换表条目中的 NS 位控制虚拟内存块或页面转换到的物理地址空间,如下图所示:
     
    image.png

注意:在 Secure 状态下,当 Stage 1 MMU 被禁用时,所有地址都被视为 Secure。

与虚拟地址一样,通常使用前缀来标识所引用的地址空间。对于物理地址,这些前缀是 NP: 和 SP:。例如:

  • NP:0x8000 – 非安全物理地址空间中的地址 0x8000
  • SP:0x8000 – 安全物理地址空间中的地址 0x8000

需要注意的是,安全和非安全是不同的地址空间,而不仅仅是可读或可写等属性。这意味着前面示例中的 NP:0x8000 和 SP:0x8000 是不同的内存位置,被处理器视为不同的内存位置。

注意:将地址空间看作为为总线上有额外地址位会更有帮助。

3.5. cache

在 Arm 架构中,数据缓存是物理标记的(即physical TAG)。物理地址包括该行来自哪个地址空间,如下所示:

image.png

NP:0x800000 上的缓存查找永远不会命中标有 SP:0x800000 的缓存行。这是因为 NP:0x800000 和 SP:0x800000 是不同的地址。

这也会影响缓存维护操作。考虑上图中的示例数据缓存。如果虚拟地址 va1 映射到物理地址 0x800000,那么当软件从 Non-secure 状态发出 DC IVAC、va1(数据或统一缓存线因虚拟地址无效)时会发生什么?

答案是在非安全状态下,所有虚拟地址都转换为非安全物理地址。因此,va1 映射到 NP:0x800000。缓存仅在包含指定地址的行上运行,在本例中为 NP:0x800000。包含 SP:0x800000 的行不受影响。

对于 set/way 操作,例如 DC ISW或Xt,在非安全状态下发出的操作只会影响包含非安全地址的行。从安全状态set/way 操作影响包含安全和非安全地址的行。

这意味着软件只能在安全状态下完全无效或清除整个缓存。从非安全状态,软件只能清除或使非安全数据无效

3.6. TLB : Translation Lookaside Buffer

Translation Lookaside Buffer (TLB) 缓存最近使用的翻译。处理器具有多个独立的翻译机制: 。TLB 的entry通过安全状态和Exception Level可知这是哪个translation regime的翻译。TLB 的结构是实现定义的,下图显示了一个示例:

image.png

当软件在 EL1 或 EL2 处发出 TLB 无效操作(TLBI 指令)时,软件以当前安全状态为目标。因此,来自安全状态的 TLBI ALL E1只能使 S.EL0/1 转换机制的所有缓存条目无效。

EL3 是一个特例。正如前面安全状态中所述,当处于 EL0/1/2 时,SCREL3.NS 位控制处理器处于哪个安全状态。然而,EL3 始终处于安全状态,而不管 SCREL3.NS 位如何。在 EL3 中时,SCR_EL3.NS 允许软件控制操作哪些安全状态 TLBI。

例如,在 EL3 处执行 TBLI ALL E1

  • SCR_EL3.NS==0:影响安全 EL0/1 转换机制
  • SCR_EL3.NS==1:影响非安全 EL0/1 转换机制

3.7. SMC exceptions

作为对两种安全状态支持的一部分,该架构包括安全监控调用 (SMC) 指令。执行 SMC 会导致target到 EL3 的 Secure Monitor Call 异常。

SMC 通常用于允许在 EL3 中的固件或在可信执行环境托管的请求服务。SMC指令调用后,PE target到EL3,然后由SMC dispatcher 决定由哪个实体处理。如下图所示:

image.png

为了标准化接口,Arm 提供了 SMCCallingConvention(DEN0028)PowerStateCoordinationInterfacespecification(DEN0022)。这些规范阐述了如何使用 SMC 来请求服务。

在 EL1 执行 SMC 可能会被 EL2捕获。这对hypervisor很有用,因为hypervisor可能想要模拟虚拟机看到的固件接口。

注意:SMC 指令在两种安全状态下的 EL0 处均不可用。

3.8. 安全虚拟化

在 Armv7-A 中首次引入虚拟化时,它仅在非安全状态下添加。在 Armv8.3 之前,Armv8 也是如此,如下图所示:

image.png

如之前在安全状态之间切换中所述,EL3 用于托管固件和安全监视器。Secure EL0/1 托管可信执行环境 (TEE),它由可信服务和内核组成。不需要多个处于安全状态的虚拟机。这意味着不需要对虚拟化的支持。随着 TrustZone 采用的增加,几个要求变得明显:

  • 一些受信任的服务与特定的受信任内核相关联。对于支持多种服务的设备,它可能需要运行多个 Trusted 内核。
  • 遵循以最小权限运行的原则,需要将某些固件功能移出 EL3。
为啥要引入S-EL2,上面两条就是背景或历史或需求!!!!

解决方案是在安全状态下引入对 EL2 的支持,它随 Armv8.4-A 一起提供,如下图所示:

image.png

S.EL2 通常托管Secure Partition Manager (SPM),而不是完整的hypervisor。SPM 允许创建隔离分区,这些分区无法查看其他分区的资源。一个系统可以有多个包含受信任内核及其受信任服务的分区。

还可以创建一个分区来容纳平台固件,从而无需在 EL3 上运行该代码。

启用安全 EL2当支持 S.EL2 时,可以启用或禁用它。S.EL2 是否使能由 SCR_EL3.EEL2 位控制:

  • 0:禁用 S.EL2,行为与不支持 S.EL2 的处理器相同
  • 1:启用 S.EL2

Stage 2 translation in Secure state

image.png

与阶段 1 表不同,阶段 2 表条目中没有 NS 位。对于给定的 IPA 空间,所有转换都会产生安全或非安全物理地址,这由寄存器位控制。通常,非安全 IPA 转换为非安全 PA,而安全 IPA 转换为安全 PA。

4、系统架构中的Trustzone技术

到目前为止,在本文中,我们主要关注处理器,但 TrustZone 不仅仅是一组处理器功能。为了利用 TrustZone 功能,我们还需要系统其余部分的支持。

这里有一个启用 TrustZone 的系统的示例:

image.png

本节将继续讨论相关组件及其在Trustzone中的作用。

4.1. 外设和内存

在前面的物理地址空间部分,我们介绍了两个物理地址空间的概念,安全和非安全。处理器将正在访问的地址空间导出到内存系统。内存系统使用此信息来强制隔离。

在本文中,我们指的是总线安全和总线非安全。总线安全是指对安全物理地址空间的总线访问。总线非安全意味着总线访问非安全物理地址空间。但处于安全状态的软件可以访问两个物理地址空间。这意味着总线访问的安全状态不一定与PE所处于的安全状态相同。

注意:在 AMBA AXI 和 ACE 中,AxPROT[1] 信号用于指定正在访问的地址空间。与转换表中的 NS 位一样,0 表示安全,1 表示非安全。

理论上,一个系统可以有两个完全独立的内存系统,使用访问的物理地址空间 (AxPROT) 在它们之间进行选择。在实践中这是不可能的。相反,系统使用物理地址空间作为属性,控制对内存系统中不同设备的访问。

4.3 Enforcing isolation

TrustZone 有时被称为slave保护系统。主机发出访问的security信号,内存系统决定是否允许访问。基于内存系统的检查是如何完成的?

在大多数现代系统中,基于内存系统的检查是由互连完成的。例如,Arm NIC-400 允许系统设计人员为每个连接者进行规定:

  • Secure 仅允许安全访问。非安全访问将产生一个fault
  • Non-secure 仅允许非安全访问。安全访问将产生一个fault
  • Boot time configurable 在启动时,系统初始化软件可以将设备编程为安全或非安全。默认为安全
  • TrustZone aware 允许所有的访问

image.png

这种方法适用于 TrustZone 感知设备或那些完全位于一个地址空间内的设备。对于更大的内存,如片外 DDR,我们可能希望将内存划分为安全和非安全区域。TrustZone 地址空间控制器 (TZASC) 允许我们执行此操作,如下图所示:

image.png

TZASC 类似于内存保护单元 (MPU),允许将设备的地址空间拆分为多个区域。将每个区域指定为安全或非安全。控制 TZASC 的寄存器只能进行安全访问,仅允许安全软件对内存进行分区。

TZASC 的一个例子是 Arm TZC-400,它最多支持九个区域。注意哈 ,这里是9个,region0也算

注意:片外存储器不如片上存储器安全,因为攻击者更容易读取或修改其内容。片上存储器更安全,但更昂贵且尺寸有限。一如既往,我们必须平衡成本、可用性和安全性。在决定哪些资产需要在片外存储器中以及哪些资产需要保留在片上时要小心

4.4 Bus masters

接下来,我们将查看系统中的Bus masters,如下图所示:

image.png

系统中的 A-profile 处理器可识别 TrustZone,并在每次总线访问时发送正确的安全状态。然而,大多数现代 SoC 还包含非处理器总线主控,例如 GPU 和 DMA 控制器。

与从设备一样,我们可以将系统中的主设备大致分为几组:

  • TrustZone aware 一些Master是支持TrustZone,并且像处理器一样,为每个总线访问提供适当的Security比特位。这方面的示例包括根据 Arm SMMUv3 规范构建的系统 MMU (SMMU)
  • Non-TrustZone aware 一些传统 IP 不支持Trustzone。此类Master通常不提供其总线访问的Security BIT,或始终发送相同的值。
  • Design time tie-off 在Master只需要访问单个物理地址空间的情况下,系统设计人员可以通过绑定适当的信号来修复它可以访问的地址空间。这种解决方案很简单,但并不灵活。
  • Configurable logic 提供了将安全信息添加到Master总线访问的逻辑。如 Arm NIC-400,提供安全软件可以在启动时使用的寄存器来设置附加主访问的安全性。这会覆盖 master 自己提供的任何值。这种方法仍然只允许主设备访问单个物理地址空间,但比 tieoff 更灵活。
  • SMMU 更灵活的选择是 SMMU。对于受信任的主机,SMMU 的行为类似于处于安全状态的 MMU。这包括转换表条目中的 NS 位,控制访问哪个物理地址空间

4.5 M and R profile Arm processors

许多现代设计包括 A 型、R 型和 M 型处理器的混合。例如,移动设备可能有一个 A-profile 处理器来运行移动操作系统,一个 R-profile 处理器用于蜂窝调制解调器,以及一个 M-profile 处理器用于低级别系统控制。下图显示了一个示例移动设备和您可能会发现的不同处理器:

image.png

R 配置文件不像 A 配置文件那样支持两种安全状态。这意味着在这些处理器上运行的软件无法控制输出的物理地址空间。通过这种方式,它们的行为与其他不支持TrustZone的Master非常相似。对于未为 Armv8-M 实现 TrustZone 的 M 配置文件处理器也是如此。

通常这些处理器只需要访问单个物理地址空间。使用我们的移动设备示例,处理器通常包括用于低级系统控制的 M 配置文件处理器。这有时称为System Control Processor (SCP)。在许多系统中,SCP 将是仅安全设备。这意味着它只需要能够生成总线安全访问。

4.6 Interrupts

接下来,我们将查看系统中的中断,如下图所示:

image.png

通用中断控制器 (GIC),支持 TrustZone。每个中断源,在 GIC 规范中称为 INTID,被分配到三个组之一:

  • Group 0: Secure interrupt, signaled as FIQ
  • Secure Group 1: Secure interrupt, signaled as IRQ or FIQ
  • Non-secure Group 1: Non-secure interrupt, signaled as IRQ or FIQ

这是通过软件写入 GIC[D|R]_IGROUPR<n>GIC[D|R]_IGRPMODR<n> 寄存器来控制的,这只能在安全状态下完成。分配不是静态的。软件可以在运行时更新分配。

对于配置为安全的 INTID,只有总线安全访问才能修改状态和配置。对于非安全总线访问,对应于安全中断的寄存器字段被读取为 0。

对于配置为非安全的 INTID,安全和非安全总线访问都可以修改状态和配置。

为什么有两个secure group?一般而言,Group0用于EL3处理的中断, S-Group 1用于处理S.EL2/S.EL1/S.EL0的中断

4.7 Handling interrupts

处理器有两个中断异常,IRQ 和 FIQ。当中断变为挂起时,GIC 根据中断组和处理器的当前安全状态使用不同的中断信号:

image.png

下图也展示了一个中断rounting的例子:

image.png

4.8 Debug, trace, and profiling

接下来,我们将查看系统中的调试和跟踪组件,如下图所示:

image.png

现代 Arm 系统包括支持调试和分析的广泛功能。使用 TrustZone,我们必须确保这些功能不会被用来危害系统的安全性。

关于调试功能,请考虑开发新的 SoC。不同的开发人员可以调试系统的不同部分。芯片公司的工程师需要并被信任调试所有部分,包括安全状态代码。因此,应启用所有调试功能。

当芯片运送给 OEM 时,他们仍然需要调试非安全状态软件堆栈。但是,可能会阻止 OEM 调试安全状态代码。

在包含该芯片的出货产品中,我们可能需要为应用程序开发人员提供一些调试功能。但我们也想限制调试芯片供应商和 OEM 代码的能力。

启用不同调试、跟踪和分析功能的信号可帮助我们处理这种情况。这包括用于控制在安全状态和非安全状态下使用功能的单独信号。

继续看一个调试示例,信号包括:

  • DBGEN – 顶级调试启用,控制两种安全状态下的外部调试
  • SPIDEN – 安全调试使能,控制在安全状态下进行调试的外部能力

注意:这两个信号是示例。还有其他调试身份验证信号。有关完整列表,请参阅处理器的技术参考手册。

这里也有一个例子,怎么使用这两个调试信号:

  • 在早期的芯片设计和开发阶段,打开所有Debug选项:DGBEN==1,SPIDEN==1
  • 在OEM开发产品阶段,仅仅打开Non-secure侧Debug选项:DGBEN==1,SPIDEN==0
  • 产品出货后,关闭所有Debug选项: DGBEN==0 , SPIDEN==0

因为我们在不同的开发阶段需要不同的信号值,所以通常使用efuse值来反馈这个信号

image.png

4.9 Other devices

最后,我们将查看系统中的其他设备,如下图所示:

image.png

我们的启用 TrustZone 的系统示例包括几个我们尚未涵盖但我们需要构建实用系统的设备。• One-time programmable memory (OTP) or fuses • Non-volatile counter (This is a counter that can only increase and can never be reset) • Trusted RAM and Trusted ROM

关注"Arm精选"公众号,备注进ARM交流讨论区。
图片1.png

推荐阅读
关注数
9456
内容数
200
以易懂、渐进、有序的方式,深入探讨ARMv8/ARMv9架构的核心概念。我们将从基础知识开始,逐步深入,覆盖最新的架构,不再纠缠于过时技术。本系列内容包含但不限于ARM基础、SOC芯片基础、Trustzone、gic、异常和中断、AMBA、Cache、MMU等内容,并将持续更新。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息