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

时间:2015-09-08 13:03:37

标签: security linux-kernel arm mmu trust-zone

上下文

我希望在 Normal world 中运行一个丰富的 GNU / Linux 操作系统,并在一个小型操作系统中运行一个集成的 Monitor 安全世界

要求

我们必须完全避免 普通世界才能访问安全世界内存区域。

问题

我们需要使用/激活 TrustZone 的哪些功能来满足此要求?我只想使用必要的功能来尽量减少所需的工作。

详细

我已经阅读了很多 ARM TrustZone 文档,我知道 TZPC TZASC ,MMU有安全扩展,但我无法弄清楚如何避免以下威胁:

  

什么会阻止黑客获得内核空间访问权限,停用MMU,并直接访问安全世界物理内存区域?

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

2 个答案:

答案 0 :(得分:2)

  

什么会阻止黑客获得内核空间访问权限,停用MMU,并直接访问安全世界的物理内存区域?

MMU根本不涉及TrustZone。所以禁用MMU什么也没做。可能的攻击是针对监控代码,安全OS API(正常世界),总线保护,启动代码或硬件。具有安全扩展 MMU是允许安全世界代码按照正常世界访问内存并相应地进行故障。

与禁用MMU的流氓普通世界内核类似,DMA attack也可用于传统的虚拟机管理程序。 TrustZone的目的是避免这些攻击。

TZASC 是安全启动代码锁定硬件的一种方法。您可以将其视为在 secure normal 之间对硬件进行分区,并具有读/写访问权限。

              | 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 标记位)和超级/用户。每个BUS主站将静态分配给一个世界,或者如果主站是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,以便正常的世界访问权限适用。

答案 1 :(得分:1)

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

现在,“安全世界存储器”要么是一些硬连接到安全存储器映射的专用块(通常是片上SRAM),要么是一大块普通的DRAM,并且仅限安全存储通过TZPC / TZASC。无论哪种方式,它只是不存在于非安全存储器映射中,因此没有任何非安全软件可以访问它。