TrustZone
是 Arm A-profile 架构中安全架构的名称。 在 Armv6K 中首次引入 TrustZone
,在 Armv7-A 和 Armv8-A 中也得到支持。
Arm TrustZone
是一种针对基于 ARM Cortex 处理器系统的嵌入式安全选项的系统范围方法。
ArmTrustZone
也可以说是一种嵌入式安全技术,它从硬件级别开始,通过创建两个可以同时运行在单个核心上的环境:一个安全世界和一个正常世界。
Normal 世界(正常世界)运行丰富的软件,这些软件通常包括庞大的应用程序或者复杂的操作系统(例如Linux),可能还有一个管理程序。虽然可以努力保护它们,但攻击表面太大意味着它们更容易受到攻击。
Trusted 世界(安全世界)运行比正常世界更小且简单的软件(例如TEE)。通常,TEE包括几个由轻量级内核托管的可信服务。受信任的服务提供了诸如密钥管理等功能。这些软件有一个相当小的攻击表面,这有助于减少对攻击的脆弱性。
TrustZone
旨在形成一个圆形。 作为用户和开发人员,我们想要 Normal 世界的丰富功能集和灵活性。 同时,我们希望在受信任的世界中使用更小、更受限制的软件堆栈来实现更高程度的信任。 TrustZone 为我们提供了两者,提供了两个环境,它们之间具有硬件强制隔离。
TrustZone
为系统设计人员提供了一种帮助提升系统安全性的方法,即使用TrustZone
安全拓展和安全外设。低级程序员应该理解TrustZone体系结构对系统提出的设计要求,即使他们不使用安全特性。
ARM Security Extensions
模型允许系统开发人员划分设备的硬件和软件资源,这些资源要么存在于安全世界,要么存在于非安全世界。
正确的系统设计可以确保不能从正常世界访问安全世界资产。
安全设计将所有敏感资源置于安全世界中,理想情况下,运行强大的软件可以保护资产免受各种可能的软件攻击。
《The ARM Architecture Reference Manual》使用术语安全和不安全来指代系统安全状态。
非安全状态并不自动意味着安全漏洞,而是正常操作,因此与正常世界相同。
通常,正常世界和安全世界之间存在主和从关系。
只有当操作系统允许通过由安全监控调用(SMC)指令启动的机制执行安全世界时,才会执行安全世界中的代码。
Secure monitor
的作用是提供一个"看门人",管理安全世界和正常世界的切换。在大多数设计中,它的功能和传统的操作系统上下文切换类似,首先要确保核心正在离开的世界状态得到安全保存,其次处理器切换到的世界状态被正确恢复。
Secure monitor
架构的增加意味着单个物理内核可以执行来自正常世界和安全世界的代码,每个世界都可以让步或调用另一个世界,尽管这取决于可以配置为只能由安全世界访问的产生中断的外围设备的可用性。例如,可以使用安全定时器中断来保证安全世界的一些执行时间。此类外围设备是否可用具体取决于平台设计人员打算支持的安全级别和用例。
Secure monitor
是一个安全关键组件,因为它提供了两个世界之间的接口。出于稳健性原因,Secure monitor
代码应在禁用中断的情况下执行。 编写一个可重入的monitor
会增加复杂性,并且并没有比简单的设计带来更多好处。
或者,可以使用更接近协作多任务的执行模型,尽管就每个世界可以访问的资源而言,安全世界独立于普通世界,但每个世界都可以让位于另一个世界以启用代码执行。
像固件或任何其他系统软件一样,安全世界中的软件必须尽量减少对系统其他部分的影响。例如,通常应避免消耗大量执行时间,除非执行普通世界请求和预期的某些操作。非安全中断应尽快传递到Normal world 。这有助于确保Normal world 世界软件的良好性能和响应能力,而无需大量移植。
内存系统被一个额外的位划分,该位伴随着外围设备和内存的物理地址。该位称为 NS 位,指示访问是安全的还是非安全的。该位被添加到所有内存系统事务中,包括缓存标签以及对系统内存和外围设备的访问。NS 位可以为 Secure 和 Normal 世界提供不同的物理地址空间。
在正常世界中运行的软件只能对内存进行非安全访问,因为无论在正常世界转换表中设置了什么,内核总是在正常世界生成的任何内存事务中将 NS 位设置为 1。(PS:内核怎么知道是安全世界还是正常世界?)在安全世界中运行的软件通常只进行安全内存访问,但也可以使用其转换表条目中的 NS 和 NSTable 标志对特定内存映射进行非安全访问。
EL3 有自己的转换表,由转换表基址寄存器 TTBR0_EL3
和转换控制寄存器 TCR_EL3
管理。 在安全世界中只允许第一阶段的翻译,并且没有TTBR1_EL3
。EL1 转换表寄存器不在安全状态之间存储,因此作为Secure monitor
上下文切换操作的一部分,必须为每个世界保存和恢复 TTBR0_EL1
、TTBR1_EL1
和 TCR_EL1
的值。
这使每个世界都可以拥有一组本地转换表,其中安全世界映射对普通世界隐藏并受到保护。安全世界转换表中的条目包含 NS 和 NSTable 属性位,它们决定特定的访问是否可以访问安全或非安全物理地址空间。
安全和非安全条目可以在缓存和 TLB 中共存。在世界之间切换时无需使缓存数据无效。普通世界只能生成非安全访问,因此只能命中标记为非安全的缓存行,而安全世界可以生成安全和非安全访问。如果安全状态在访问之间发生变化,这可能需要一些缓存管理。
TLB 中的条目记录了哪个世界生成了特定条目,虽然非安全状态永远不能对安全数据进行操作,但安全世界可以将 NS 行分配到缓存中。此外,针对每个异常级别分别启用和禁用缓存。缓存控制对于两个世界是独立的,但不是独立于所有异常级别,因此 EL0 永远不能直接启用或禁用缓存,并且 EL2 可以覆盖非安全 EL1 的行为。
典型的系统具有轻量级内核或可信执行环境 (TEE),托管服务,例如安全世界中的加密服务。这与Normal 世界中的丰富操作系统交互,该操作系统可以使用 SMC 调用访问安全服务。通过这种方式,Normal world可以访问服务功能,而没有暴露密钥的风险。
通常,应用程序开发人员不直接与安全扩展、TEE 或可信服务交互。相反,它们使用由 Normal world 库提供的高级 API,例如 authenticate() 。该库由与受信任服务相同的供应商(例如信用卡公司)提供,并处理低级交互。
下图以流的形式显示了这种交互,用户应用程序调用 API 进行适当的操作系统调用,该调用传递到驱动程序代码,然后通过安全监视器将执行传递到 TEE。
例如,在安全世界中,您可能有一个签名检查器。普通世界可以使用 SMC 调用请求安全世界验证下载更新的签名。
安全世界需要访问普通世界使用的内存。安全世界可以使用其转换表描述符中的 NS 位来确保它使用非安全访问来读取数据。
这很重要,因为与包相关的数据可能已经在缓存中,因为普通世界执行的访问地址标记为非安全。安全属性可以被认为是一个额外的地址位。如果内核使用安全内存访问来尝试读取包,它不会命中缓存中已经存在的非安全数据。
如果你是普通世界的程序员,一般来说,你可以忽略安全世界中发生的事情,因为它的操作对你是隐藏的。一个副作用是中断延迟会略微增加。安全世界可以完全阻塞,因此如果发生请求安全内核执行的中断,这可能会阻塞普通世界的中断,但与典型操作系统的整体延迟相比,这种增加很小。这种类型的服务质量问题取决于安全世界操作系统的良好设计和实施。
借助 ARMv7 安全扩展,软件使用监控模式在安全和非安全状态之间切换。此模式是安全状态中其他特权模式的对等模式。 在 ARMv8-A 处理器中,AArch32 相当于 ARMv7-A。
对于 ARMv8 架构,当 EL3 使用 AArch32 时,系统的行为与 ARMv7 相同,以确保完全兼容,因此安全状态下的所有特权模式都被视为处于 EL3。
AArch32 的安全模型如下图所示。 在这个场景中,EL3 是 AArch32 来提供一个安全的操作系统和监视器。
下图是EL3执行AArch64提供Secure Monitor时的安全模型。EL1 用于安全操作系统。EL3 使用 AArch64 时,EL3 级别用于执行负责在 Non-secure 状态和 Secure 状态之间切换的代码。
根据 AArch32,安全状态 EL1 和 EL0 与非安全状态 EL1 和 EL0 具有不同的虚拟地址空间。这允许将来自 AArch32 32 位架构的安全端代码用于具有 64 位操作系统或在非安全端运行的管理程序的系统中。
随着正常世界执行停止和安全世界执行开始,它们之间的上下文切换通过执行安全监视器 (SMC) 指令或硬件异常机制(例如中断或异步中止)发生。ARM 处理器有两种中断类型,FIQ 和 IRQ。
以将异常和中断重定向到 EL3 的控制形式明确支持安全中断,与当前的 DAIF 字段无关。但是,这些控件仅区分主要中断类型:IRQ、FIQ 和异步中止。更详细的控制需要将中断过滤到安全和非安全组中。 有效地做到这一点需要 GIC 的支持,它为此目的提供了明确的设施。
一个典型的用例是将 FIQ 用作安全中断,方法是将安全中断源映射为中断控制器中的 FIQ。相关的外设和中断控制器寄存器必须标记为仅安全访问,以防止正常世界重新配置这些中断。这些安全 FIQ 中断必须路由到处于安全执行状态的处理程序。
使用安全扩展的实现通常有一个轻量级的可信内核,在安全世界中托管安全服务,例如加密。完整的操作系统在正常世界中运行,并且能够使用 SMC 指令访问安全服务。
通过这种方式,普通世界可以访问服务功能,而不会冒将密钥材料或其他受保护数据等安全资产暴露于普通世界中执行的任意代码的风险。
集群系统中的每个核心都具有相同的安全特性。集群中任意数量的核都可以在任何时间点在安全世界中执行,并且核能够相互独立地在世界之间转换。
寄存器控制正常世界代码是否可以修改Snoop控制单元(SCU)设置。类似地,在集群中分发优先级中断的GIC必须配置为了解安全问题。
安全系统还控制调试供应的可用性。 您可以通过完整的 JTAG 调试和跟踪控制为正常和安全软件世界配置单独的硬件,这样就不会泄露有关受信任系统的信息。 您可以通过安全外围设备控制硬件配置选项,也可以硬连线并使用以下信号控制它们:
1.Security in an ARMv8 System
2. ARM文档搜索
3. Arm TrustZone explained
4. Trusted Firmware
5. ARM的安全启动—ATF/TF-A以及它与UEFI的互动