【问题标题】:Use ARM TrustZone to prevent access to memory region from Non-Secure world使用 ARM TrustZone 防止从非安全世界访问内存区域
【发布时间】:2015-12-04 04:27:43
【问题描述】:

上下文

我希望在普通世界中运行一个丰富的GNU/Linux操作系统,并在普通世界中运行一个带有集成监视器的小型操作系统安全的世界

要求

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

问题

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

详情

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

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

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

【问题讨论】:

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


    【解决方案1】:

    一旦黑客获得对内核空间的访问权,有什么办法可以阻止他停用 MMU,并直接访问安全世界的物理内存区域?

    MMU 根本不参与 TrustZone。所以禁用 MMU 没有任何效果。可能的攻击是针对监控代码、安全操作系统 API(对正常世界)、总线保护、引导代码或硬件。 具有安全扩展的 MMU 是为了允许安全世界代码按照正常世界访问内存并相应地进行故障。

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

    TZASC 是安全启动代码锁定硬件的一种方式。您可以将其视为在 securenormal 之间划分硬件,并提​​供读/写访问的可能性。

                  | 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,以便应用普通世界的访问权限。

    【讨论】:

    • 我可能不太了解,但这如何回答我的问题?那么是否必须使用 TZASC/TZPC 保护安全世界的物理内存区域?
    • TZASC 和 TZPC 是一种方式(就像有不同的以太网控制器,但它们都使用“以太网”协议)。从语义上讲,这些元素控制 BUS 访问;它们在 CPU 之外。你没有提到Exynox 4210。手册的第 2.2 节有提示(带有“破折号”的内容可能在 NDA/安全披露下)。 TZPC 0-6 也在那里。他们可能控制内存,但这有点奇怪。您需要将供应商(三星)文件与 ARM 放在一起。
    • 没有什么是强制。安全解决方案不是一站式的问题。 Different assets/situations are present in every different product。 TrustZone 提供了一些工具来帮助解决这个问题。您在设计中做什么取决于您(以及您的 SOC 供应商三星)。每个 ARM Cortex-A CPU 都支持 TZ。如果供应商不保护 BUS,那么在大多数情况下它是无用的。您需要与供应商或其代理人(VAR 等)密切讨论。您还需要篡改等来减轻直接操纵内存的硬件黑客攻击。
    • (...可能需要篡改)。这个ARM bus question 可能会有所帮助。 SOC 供应商实现了完整的 TrustZone BUS(对于大多数情况),供应商必须提供一些安全/正常访问。访问可以是静态的(硬编码)、动态配置全部或全部(如 TZPC)或可动态分区为 TZASC。
    【解决方案2】:

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

    现在,“安全世界内存”要么是硬连线到安全内存映射的某个专用块(通常是片上 SRAM),要么是一块普通 DRAM 被雕刻出来并仅用于安全通过 TZPC/TZASC。无论哪种方式,它只是不存在于非安全内存映射中,因此非安全软件无法访问它。

    【讨论】:

    • 但是如果实际的 SoC 没有实现 TZASC/TZPC 怎么办?
    • 那么你要么拥有硬连线的安全、非安全和共享内存,要么就是根本不支持安全软件,所以你放弃回家。
    • 好的,但是支持 TZ 但可能没有 TZPC 或 TZASC 的目的是什么?我正在使用 Exynos 4210。虽然支持 TZ,但该手册仅在内存映射中提及 TZPC。仅此而已,所以我真的不知道我是否应该“回家”。
    • 如果你有一个 TZPC,那么你将有一些内存在它后面,你可以分割出一个安全的块。我对 Exynos 4 不熟悉,但我曾经玩过 Exynos 5410,我知道那里的安全固件设置了一些东西,因此片上 SRAM(它称为 iRAM)在安全固件和非安全引导加载程序入口点。而且三星公开可用的 TRM 几乎不包含任何有用的信息。顺便说一句,引导加载该固件的 ROM 代码是硬连接到安全世界的一个很好的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2011-03-12
    • 2013-03-24
    相关资源
    最近更新 更多