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

Use ARM TrustZone to prevent access to memory region from Non-Secure world

上下文

我想在平凡的世界GNU/LinuxOS运行 Secure world 中集成了 Monitor 运行 的小型 OS。

要求

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

问题

我们需要 TrustZone 的哪些功能 use/activate 才能满足此要求?我只想使用必要的功能,以尽量减少所需的工作。

详情

我阅读了很多 ARM TrustZone 文档,我知道 TZPCTZASC ,具有安全扩展的 MMU,但我不知道如何避免以下威胁:

What would stop a hacker, once he gained access to the kernel space, to deactivate the MMU, and directly access the physical memory region of the Secure world?

或许这根本无法想象,也无法实现?但如果是这样的话,我猜 TZPC 是强制性的,以防止这种情况发生,对吗?或者,"simply" 使用两个 TrustZone 世界是否足够?

What would stop a hacker, once he gained access to the kernel space, to deactivate the MMU, and directly access the physical memory region of the Secure world?

MMU 完全不涉及 TrustZone。所以禁用 MMU 没有任何作用。可能的攻击是针对监视器代码、安全 OS API(对正常世界)、总线保护、引导代码或硬件。 带安全扩展的 MMU 允许安全世界代码按照正常世界访问内存并相应地出错。

类似于禁用 MMU 的流氓正常世界内核,DMA attack 也可以用于传统的 hypervisor。 TrustZone 的目的是避免这些攻击。

TZASC 是安全引导代码锁定硬件的一种方式。您可以将其视为 securenormal 之间的硬件分区,并具有 read/write 访问的可能性。

              | 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。从物理上讲,这些是总线上的信号。这些位是 Read/Write、secure/normal(NS 标记位)和 super/user。每个 BUS master 将被静态分配给一个 world,或者如果 master 是 TrustZone 感知的,它可能是动态的。一个动态主示例是 CPU。对于从站,它们要么是内存(类似 I/O 的大数组),要么是小型控制器寄存器组。对于内存,TZASC 允许对内存进行分区。对于较小的寄存器从机,通常实现更简单的全有或全无总线访问(例如 TZPC)。 TrustZone 对于系统程序员来说非常模糊,因为它可以灵活地允许不同的 SOC 设计。

Maybe this is not even imaginable or feasible? But if it's the case, my guess it that a TZPC is mandatory to prevent this, am I right? Or, does "simply" using the two TrustZone worlds is enough?

TZPC 是一个简单的从 secure/normal 分区的例子。对于基于 AMBA APB(高级外设总线)的寄存器 I/O。


[本节旨在作为 TrustZone 架构灵活性的具体示例,让 SOC 实施者创建可能对某些特定应用有用的新设备。]

考虑一个系统,我们有一个 NAND 芯片 (NFC),但希望在正常世界无法访问安全数据的情况下允许安全和正常访问。如果我们创建一个 TrustZone 感知 NFC 控制器,我们可以有两组 I/O 寄存器和 DMA 数据到用户指定的缓冲区。一个寄存器组是安全的,另一个是正常的。 NFC 控制器将是一个安全主机,而 NFC 芯片将是一个安全从机。当有人访问 NFC 控制器正常寄存器组时,假设的芯片必须检查访问是否被允许(在上面的攻击中是 hardware)和动态主机的另一个例子。当它代表普通世界读取时,它会设置 NS DMA,以便应用普通世界访问权限。

不受信任的代码 运行 处于非安全状态,因此 CPU 生成的任何总线事务都将被标记为不安全的,因此互连的固有功能保持东西分开。安全内存映射和非安全内存映射实际上是完全不同的东西,只是在大多数系统中它们被连接起来或多或少是相同的。

现在,"secure world memory" 要么是一些专用块(通常是片上 SRAM),它被硬连线到安全内存映射,要么是一块通用 DRAM 被分割出来并变得安全- 仅通过 TZPC/TZASC。无论哪种方式,它只是不存在于非安全内存映射中,因此非安全软件无法访问它。