使用ARM TrustZone防止非安全世界访问内存区域

4

上下文

我希望在普通世界(Normal world)运行一个功能丰富的GNU/Linux操作系统,并在安全世界(Secure world)运行一个集成了监视器(Monitor)的小型操作系统。

要求

我们必须绝对避免普通世界访问安全世界内存区域。

问题

为了满足这个要求,我们需要使用/激活TrustZone的哪些特性?我只想使用必要的功能来最小化所需的工作。

详情

我已经阅读了大量的ARM TrustZone文档,我知道TZPCTZASC、带有安全扩展的MMU,但我无法弄清楚如何避免以下威胁:

一旦黑客进入内核空间,有什么可以阻止他禁用MMU,直接访问安全世界物理内存区域?

也许这甚至不可想象或不可行?但如果是这种情况,我猜TZPC是必需的,以防止这种情况发生,对吗?或者,“简单地”使用两个TrustZone世界就足够了吗?

2个回答

2
如果黑客获取了内核空间的访问权限,有什么能够阻止他禁用MMU并直接访问安全世界的物理内存区域吗?
MMU与TrustZone无关。因此,禁用MMU没有任何作用。可能的攻击对象是监视器代码、安全OS API(面向正常世界)、总线保护、引导代码或硬件。带有安全扩展的MMU允许安全世界的代码像正常世界一样访问内存并相应地出错。
类似于一个恶意的正常世界内核禁用MMU,DMA攻击也可以用于传统的虚拟化监控程序。TrustZone的目的是为了避免这些攻击。
TZASC是安全引导代码锁定硬件的一种方式。您可以将其视为在安全正常之间分割硬件,并具有读/写访问权限。
              | read  | write
 -------------+------------------
 normal super | Y/N   | Y/N
 normal user  | Y/N   | Y/N
 -------------+------------------
 secure super | Y/N   | Y/N
 secure user  | Y/N   | Y/N

首两行适用于所有ARM系统。后两行是特定于TrustZone的。在物理上,这些是总线上的信号。位可读/写,安全/正常(NS标记位)和超级/用户。每个总线主控将静态地分配到一个世界,如果主控具有TrustZone意识,则可以是动态的。一个动态的主控示例是CPU。对于从设备,它们是内存(大量相似I / O)或小控制器寄存器组。对于内存,TZASC允许内存分区。对于更小的寄存器从设备,通常实现简单的全有或全无总线访问(例如TZPC)。对于系统程序员来说,TrustZone非常模糊,因为它灵活地允许不同的SOC设计。
“也许这甚至不可想象或不可行?但如果是这种情况,我的猜测是需要TZPC来防止这种情况,我是对的吗?或者只是简单地使用两个TrustZone世界就足够了?”TZPC是一种简单的从设备安全/正常分区的例子,适用于基于寄存器的AMBA APB(高级外围总线)I/O。
这一部分旨在作为TrustZone架构灵活性的具体例子,让SOC实现者创建可能对某些特定应用有用的新型设备。
考虑一个系统,我们只有一个NAND芯片(NFC),但想要允许安全和正常访问,使正常世界无法访问安全数据。如果我们创建一个支持TrustZone的NFC控制器,我们可以拥有两个I/O寄存器和DMA数据到用户指定缓冲区。一个寄存器银行是安全的,另一个是普通的。 NFC控制器将是安全主,NFC芯片将是安全从。当有人访问NFC控制器正常寄存器银行时,假设芯片必须检查访问是否被允许(这是上述攻击中的硬件),这是动态主的另一个示例。当它代表正常世界读取时,它会使用NS设置进行DMA,以便应用正常世界访问权限。

我可能理解不好,但这怎么回答我的问题了呢?那么,使用TZASC/TZPC强制保护安全世界的物理内存区域是必需的吗? - cid
TZASC和TZPC是单向的(就像有不同的以太网控制器,但它们都执行“以太网”协议)。从语义上讲,这些元素控制总线访问;它们在CPU之外。您没有提到Exynox 4210。手册的第2.2节有提示(带有“破折号”的内容可能受到NDA /安全披露的限制)。 TZPC 0-6也在其中。它们可能控制内存,但这有点奇怪。您需要将供应商(三星)文档与ARM文档结合起来。 - artless noise
没有任何东西是强制性的。安全解决方案并不是一站式问题。每个不同的产品都存在不同的资产/情况。TrustZone提供了一些工具来帮助解决这些问题。你在设计中做什么,由你(和你的SOC供应商三星)决定。每个ARM Cortex-A CPU都支持TZ。如果供应商不保护总线,则对大多数情况无用。你需要与供应商或其代理商(VAR等)进行密切讨论。你还需要使用防篡改措施等方法来减轻直接操纵内存的硬件黑客攻击。 - artless noise
这个ARM总线问题可能会有所帮助。SOC供应商实现TrustZone总线时需要完整性(对于大多数情况),供应商必须提供一些安全/正常访问权限。访问权限可以是静态的(硬编码),也可以是动态配置的全盘或全无(如TZPC),或者是可分区的动态配置(如TZASC)。 - artless noise

1
不受信任的代码在非安全状态下运行,因此由CPU生成的任何总线事务都将标记为非安全状态,因此互连的固有功能使事物保持分离。安全内存映射和非安全内存映射实际上是完全独立的,只是在大多数系统中它们被连接起来变得更加相似。现在,“安全世界内存”要么是一些专用块(通常是片上SRAM),硬连接到安全内存映射上,要么是通过TZPC / TZASC刻出的一块通用DRAM,并仅限于安全使用。无论哪种方式,它都“不存在于非安全内存映射中”,因此非安全软件无法访问它。

但是如果实际的SoC没有实现TZASC/TZPC呢? - cid
那么,你要么有硬连线的安全、非安全和共享内存,要么这个东西根本没有设计支持安全软件,所以你只能放弃并回家。 - Notlikethat
好的,但是如果没有TZPC或TZASC支持,那么支持TZ的目的是什么?我正在使用Exynos 4210。虽然支持TZ,但手册中只提到了内存映射中的TZPC。没有更多的信息,所以我不知道是否应该“回家”。 - cid
1
如果您有TZPC,那么它后面会有一些内存,您可以将其分区为一个安全块。我不熟悉Exynos 4,但我曾经玩过Exynos 5410,我知道那里的安全固件设置了芯片上的SRAM(称为iRAM),在安全固件和非安全引导程序入口之间进行划分。此外,三星公开可用的TRM几乎没有任何有用的信息。顺便说一句,引导加载该固件的ROM代码是硬连到安全世界的好例子。 - Notlikethat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接