概述
提供一定安全级别的系统,即可信系统,可以保护资产(例如密码和加密密钥或信用卡详细信息)免受一系列看似合理的攻击,以防止它们被复制、损坏或不可用。
安全性通常由机密性、完整性和可用性原则定义。机密性是密码和加密密钥等资产的关键安全问题。对用于安全的安全软件和芯片机密进行修改和真实性证明是至关重要的。可信系统的示例可能包括为移动支付输入密码、数字版权管理和电子客票。在开放系统的世界中,安全性更难实现,在开放系统中,您可以将各种软件下载到平台上,无意中还会下载恶意或不受信任的代码,这些代码可能会篡改您的系统。
移动设备可用于观看视频、听音乐、玩游戏,或用于浏览网页和访问金融服务。这要求用户和银行或服务提供商都信任该设备。该设备运行一个具有高连接级别的复杂操作系统,可能容易受到恶意软件的攻击。可以通过软件系统设计实现某种程度的安全性,但可以通过CPU和系统级内存分区获得更高级别的保护。
ARM处理器包括特定的硬件扩展,以支持构建可信系统。编写可信操作系统或可信执行环境(TEE)系统超出了本书的范围。但是,如果将安全分数字段设置为实现ARMv7安全扩展,请注意,这会对操作系统和非特权代码(换句话说,即不属于受信任系统的代码)施加一些限制。
软件和硬件攻击可分为以下几类:
- 软件攻击:恶意软件的攻击通常不需要对设备进行物理访问,并且可以利用操作系统或应用程序中的漏洞进行攻击。
- 简单硬件攻击:这些攻击通常是被动的,大多是非破坏性的,需要访问设备和接触电子设备,并使用常见的工具,如逻辑探针和JTAG运行控制单元。
- 实验室硬件攻击:这种攻击需要复杂而昂贵的工具,如聚焦离子束(FIB)技术或功率分析技术,并且更常用于对付智能卡设备。
TrustZone技术旨在防止软件和简单硬件攻击。
1、TrustZone硬件体系结构
TrustZone体系结构为系统设计者提供了一种方法,使用TrustZone安全扩展和安全外围设备来帮助保护系统。底层程序员必须理解TrustZone体系结构对系统的限制,即使他们不使用安全特性。
ARM安全模型划分了设备硬件和软件资源,以便它们存在于安全子系统的安全世界中,或者存在于其他所有事物的正常世界中。系统硬件确保无法从正常世界访问任何安全世界资源。安全设计将所有敏感资源放置在安全的世界中,并且理想情况下具有健壮的软件运行,可以保护资产免受各种可能的软件攻击。
ARM架构参考手册使用术语“安全”和“非安全”来表示系统安全状态。非安全状态并不自动意味着安全漏洞,而是正常操作,因此与正常世界相同。通常,非安全世界和安全世界之间存在主从关系,因此只有当正常世界执行安全监视器调用(SMC)时,才会执行安全世界(请参阅ARMv8-a架构参考手册中的SMC说明)。
world一词的用法不仅用于描述执行状态,还用于描述仅在该状态下可访问的所有内存和外围设备。体系结构的增加意味着单个物理核心可以以时间切片的方式执行来自正常世界和安全世界的代码,尽管这取决于中断生成外围设备的可用性,这些外围设备可以配置为仅由安全世界访问。例如,可以使用安全计时器中断来保证安全世界的一些执行时间,其方式类似于抢占式多任务处理。这些外围设备可能可用,也可能不可用,这取决于平台设计者打算支持的安全级别和用例。
或者,可以使用更接近协作多任务的执行模型。在这种情况下,尽管安全世界在每个世界可以访问的资源方面独立于正常世界,但执行时间的调度通常是两个世界之间相互依赖的。与固件或任何其他系统软件一样,安全世界中的软件必须小心地将其对系统其他部分的影响降至最低。例如,除非执行正常世界要求的某些操作,否则通常应避免消耗大量执行时间,并且应尽快向正常世界发出非安全中断信号。这有助于确保正常软件的良好性能和响应能力,而无需大量移植。
内存系统通过外围设备和内存地址附带的附加位进行划分。该位称为NS位,指示访问是安全的还是不安全的。此位添加到所有内存系统事务中,包括缓存标记和对系统内存和外围设备的访问。这个额外的地址位为安全世界提供了一个物理地址空间,为正常世界提供了一个完全独立的物理地址空间。
在正常世界中运行的软件只能对内存进行非安全访问,因为在正常世界生成的任何内存事务中,内核总是将NS位设置为1。在安全世界中运行的软件通常只进行安全内存访问,但也可以使用其页表条目中的NS和NSTable标志对特定内存映射进行非安全访问。尝试对标记为安全的缓存数据执行非安全访问会导致缓存未命中。尝试对标记为安全的外部内存执行非安全访问会导致内存系统不允许该请求,并且从设备返回错误响应。未向非安全系统表明错误是由尝试访问安全内存引起的。
在AArch64中,EL3有自己的转换表,由寄存器TTBR0_EL3和TCR_EL3管理。安全世界中只允许第一阶段的翻译,并且没有TTBR1_EL3。AArch64 EL1转换表寄存器不在安全状态之间存储,因此必须为每个世界保存和还原TTBR0_EL1、TTBR1_EL1和TCR_EL1的值,作为安全监视器上下文切换操作的一部分。这使得每个世界都有一组本地转换表,其中隐藏了安全世界映射,并保护其不受正常世界的影响。安全世界转换表中的条目包含NS和NSTable属性位,用于确定特定访问是否可以访问安全或非安全物理地址空间。安全和非安全条目可以在缓存和转换后备缓冲区(TLB)中共存。在世界之间切换时,无需使缓存数据无效。正常世界只能生成非安全访问,因此只能命中标记为非安全的缓存线,而安全世界可以生成安全和非安全访问。TLB记录中哪个世界生成特定的条目,尽管非安全状态永远无法对安全数据进行操作,但安全世界可能会导致将NS行分配到缓存中。此外,针对每个异常级别分别启用和禁用缓存。缓存控制对于这两个世界是独立的,但对于所有异常级别都不是独立的,因此EL0永远不能直接启用或禁用缓存,而EL2可以覆盖非安全EL1的行为。
2、通过中断切换安全世界
当内核执行来自两个世界的代码时,通过执行安全监视器(SMC)指令或通过硬件异常机制(如中断)在它们之间进行上下文切换。ARM处理器有两种中断类型,FIQ和IRQ。
以控件的形式明确支持安全中断,将异常和中断重定向到EL3,与当前DAIF无关。然而,这些控件仅区分主要中断类型:IRQ、FIQ和异步中止。细粒度控制要求将中断过滤为安全组和非安全组。有效地做到这一点需要GIC的支持,GIC对此有明确的设施。
一个典型的用例是,通过将安全中断源映射为中断控制器内的FIQ,将FIQ用作安全中断。相关外围设备和中断控制器寄存器必须标记为仅安全访问,以防止正常世界重新配置这些中断。
这些安全FIQ中断必须路由到处于安全执行状态的处理程序。使用安全扩展的实现通常有一个轻量级的可信内核,在安全的世界中托管安全服务,如加密。完整的操作系统在正常情况下运行,并且能够使用SMC指令访问安全服务。通过这种方式,正常世界可以访问服务功能,而不会将安全资产(如关键材料或其他受保护的数据)暴露给正常世界中执行的任意代码。
3、多核系统中的安全
多核系统中的每个核都具有与本章所述相同的安全特性。集群中的任意数量的核心可以在任何时间点在安全世界中执行,并且核心能够在彼此独立的世界之间进行转换。附加寄存器控制正常世界代码是否可以修改Snoop控制单元(SCU)设置。类似地,在多核集群中分配优先中断的GIC必须配置为了解安全问题。
3.1 正常和安全世界的互动
如果您正在包含一些安全服务的系统中编写代码,那么了解这些服务的使用方式可能会很有用。典型的系统具有轻量级内核或TEE托管服务,例如,安全世界中的加密。这与正常情况下的完整操作系统进行交互,该操作系统可以使用SMC调用访问安全服务。通过这种方式,正常的世界可以访问服务功能,而不会将密钥暴露在风险中。通常,应用程序开发人员不会直接与安全扩展、TEE或可信服务交互。相反,它们使用普通世界库提供的高级API,例如authenticate()。该库由与受信任服务相同的供应商提供,例如,一家信用卡公司,并处理低级交互。图17-3以流的形式显示了这种交互,用户应用程序调用API进行适当的操作系统调用,然后传递到驱动程序代码,然后通过安全监视器将执行传递到TEE。
在安全世界和正常世界之间传递数据是很常见的。例如,在安全世界中,您可能有一个签名检查器。正常世界可以使用SMC调用请求安全世界验证下载更新的签名。安全世界需要访问正常世界使用的内存。安全世界可以在其转换表描述符中使用NS位,以确保它使用非安全访问来读取数据。这一点很重要,因为与包相关的数据可能已经在缓存中,因为正常世界执行的访问地址标记为不安全。安全属性可以看作是一个额外的地址位。如果内核使用安全内存访问尝试读取数据包,则不会命中已经在缓存中非安全世界数据包。
如果您是一个普通的程序员,一般来说,您可以忽略安全世界中发生的事情,因为它的操作对您是隐藏的。一个副作用是,如果在安全环境中发生中断,中断延迟可能会略有增加,但与典型操作系统上的总延迟相比,这种增加很小。请注意,这种类型的服务质量问题取决于安全世界操作系统的良好设计和实现。
3.2 安全世界调试
安全系统还控制调试提供的可用性。您可以通过完整的JTAG调试和跟踪控制为正常和安全的软件世界配置单独的硬件,这样就不会泄漏有关受信任系统的信息。您可以通过安全外围设备控制硬件配置选项,也可以通过以下信号对其进行硬连接和控制:
- 安全特权入侵调试启用(SPIDEN):JTAG调试。
- 安全特权非侵入性调试启用(SPNIDEN):跟踪和性能监视器
4、在安全和非安全状态之间切换
对于ARMv7安全扩展,软件使用监控模式在安全和非安全状态之间切换。此模式是安全状态中其他特权模式的对等模式。
对于ARMv8体系结构,当EL3使用AArch32时,系统的行为与ARMv7相同,以确保完全兼容,从而将安全状态中的所有特权模式视为处于EL3。
AArch32的安全模型如图17-4所示。在此场景中,AArch32使用EL3提供安全的操作系统和监视器。
为了与ARMv7体系结构保持一致,安全状态EL1和EL0与非安全状态EL1和EL0具有不同的虚拟地址空间。这允许来自ARMv7 32位体系结构的安全端代码能在非安全端64位操作系统或虚拟机监控程序的系统中运行。
图17-5显示了AArch64使用EL3提供安全监视器时的安全模型。EL3状态对AArch32不可用,但EL1可用于安全操作系统。当EL3使用AArch64时,EL3级别用于执行负责在非安全状态和安全状态之间切换的代码。