深入了解三星的 TrustZone (第 1 部分)

ARM TrustZone® 技术是系统范围的安全方法,针对高性能计算平台上的大量应用,包括安全支付、数字版权管理 (DRM)、企业服务和基于 Web 的服务。

本系列将分为以下三个部分:

第 1 部分:三星 TrustZone 组件的详细概述;

第 2 部分:用于逆向工程和漏洞研究的工具开发;

第 3 部分:在三星设备的 EL3 中实现代码执行的漏洞利用;

随着移动设备和嵌入式系统的广泛使用,安全问题已成为供应商需要解决的优先事项。仅运行操作系统的设备的传统体系结构是不够的。在这种模式中,内核中的单个漏洞可能导致整个系统受到损害。针对这些问题,供应商构思了新技术和手段来增强其设备的安全性,这些技术就是可信执行环境 (Trusted Execution Environments,简称 TEE)。

可信执行环境是 CPU 中的安全区域,它在隔离的环境中与主操作系统并发执行。它保证在 TEE 内部执行的数据和代码保持其完整性和机密性。通过使用硬件和程序组件来保护代码和数据,这种并行受信任系统比 REE 更安全。

本系列文章重点介绍三星公司使用 ARM TrustZone 实现的 TEE,尤其是在较旧的 Galaxy 设备(S6 至 S9)中。

深入了解三星的 TrustZone (第 1 部分)ARM TrustZone 技术

嵌入式安全性的当前状态

多年来,将操作系统分为用户区和内核空间的传统体系结构在安全性方面已有许多改进,但是,这似乎还不够。开发人员已尝试使内核上的攻击面尽可能少,从而加强了对所有用户控制的数据的验证,但是仍然可以发现漏洞,并利用它们危害整个系统。基于这些观察,研究人员和开发人员想知道,即使内核在启动时或运行时损坏,如何更好地保护系统。

为了解决启动时内核损坏的问题,可能的解决方案是安全启动机制,该机制可防止在启动加载进程(例如,引导加载程序阶段,操作系统等)期间执行未经授权的代码。安全启动使用不同的阶段来引导系统,每个阶段都负责加载,执行和验证下一个的加密签名。但是,使用此进程要求第一阶段被隐式信任。通常,供应商将第一组指令直接写到片上系统(SoC)的芯片中,几乎无法对其进行修改。这第一个不可变且隐式受信任的阶段称为 Bootrom。

可以使用能够监视同时运行的多个操作系统的管理程序来减轻运行时损坏,如下图所示。系统管理程序可以检测到危害,并确保在其监视下运行的系统得到保护。

深入了解三星的 TrustZone (第 1 部分)

但是,系统管理程序和来宾操作系统都共享相同的物理内存,这些环境之间的隔离仅通过程序机制实现。在这种模式下,无法防止诸如虚拟机转义,虚拟机管理程序损坏等安全问题。考虑到这些限制,系统的可能增强将是在硬件级别隔离所有组件,从而创建了受信任的执行环境或 TEE。这些安全且受信任的环境使用系统范围的硬件隔离机制来分离 CPU 和其他外围设备的资源。以下各节将详细说明由 ARM 实现的 TEE TrustZone。同时,下图提供了系统范围保护的发展概述。

深入了解三星的 TrustZone (第 1 部分)

现有 TEE

市场上可以找到几种 TEE,但可以将它们分为以下两类。

    台式机平台(如英特尔 SGX)上使用的 TEE,由于台式机不是本文的主题,因此将不详细介绍这些实现。

    在移动平台(例如 TrustZone,SEP,Titan M 等)上使用的 TEE。

最后一个类别可以细分为几种实现选项:

深入了解三星的 TrustZone (第 1 部分)

虚拟处理器实现,例如 ARM TrustZone,其中 CPU 和硬件资源在安全状态和非安全状态之间共享。

深入了解三星的 TrustZone (第 1 部分)

On-Soc 处理器实现,例如 Apple SEP,其中两个 CPU (一个安全和一个非安全)共享硬件资源。

深入了解三星的 TrustZone (第 1 部分)

外部协处理器实现,例如位于 SoC 外部的 Google Titan M,无法访问 SoC 中的硬件资源。

不过,该系列文章将仅关注 ARM TrustZone 技术。

深入了解三星的 TrustZone (第 1 部分)ARM TrustZone 程序架构

本节介绍 ARM TrustZone 技术,并详细介绍其不同的组件和可能的实现。本文无意提供有关 ARM TrustZone 的详尽介绍。

TrustZone 是通过将 CPU 分为正常范围和安全范围来实现的系统范围的硬件隔离。普通范围包含并执行主要操作系统,也称为 Rich OS (例如 Android,GNU / Linux 等),用户主要与之交互并执行所有非敏感任务。此操作系统在设计上是不受信任的,因此,在使用之前,应彻底检查从“正常范围”传送来的所有数据。并行存在安全范围,它运行受信任的代码并存储 / 处理敏感数据。

在以下各节中,“正常范围”和“安全范围”将分别缩写为 NWd (Normal World)和 SWd (Secure World)。

为了让 CPU 知道它是在安全状态还是在非安全状态下运行,ARM 体系结构使用安全配置寄存器或 SCR 的最低有效位,如下图所示。

深入了解三星的 TrustZone (第 1 部分)

分离是有效的,该系统现在需要两个范围之间安全的通信方式。为了满足此要求,ARM 引入了监视模式,该模式负责在 SWd 和 NWd 之间切换,它以最高 ARM 执行级别在安全状态下运行。

进入监视模式有多种方法,在 NWd 中,可以通过中断或引发外部异常中止 (如下图所示),使用安全监视器调用或 SMC 指令输入。除了直接写入当前程序状态寄存器 (CPSR) 之外,还可以从 SWd 中使用相同的机制,而 CPSR 只能由 SWd 中的特权进程执行。

深入了解三星的 TrustZone (第 1 部分)

为了在权限管理中获得更好的粒度,ARM 使用了从 EL0 到 EL3 的不同异常级别(EL0 的特权最少,EL3 的特权最多),下图概述了这些异常级别的用法。

深入了解三星的 TrustZone (第 1 部分)

ARM 为供应商提供了所有必要的工具,以供他们构建自己的 TrustZone 实现。几乎没有限制,而且 SWd 的实现范围很广,从像 Nintendo Switch 中那样充当 API 的简单库到成熟的操作系统(例如由 Samsung 和 Qualcomm 实现的操作系统)。

深入了解三星的 TrustZone (第 1 部分)

深入了解三星的 TrustZone (第 1 部分)

深入了解三星的 TrustZone (第 1 部分)

深入了解三星的 TrustZone (第 1 部分)逆向三星的 TrustZone

三星是主要的 OEM 厂商之一,因此,它努力保持最新技术,并为客户提供尽可能多的功能。从 Galaxy S3 开始,他们已经在设备中使用 TrustZone 几年了。在基于 Exynos 的 Galaxy 设备上,它们首先使用高通提供的实施方式,然后再切换到自己的设备(从 Galaxy 型号的 S6 开始)。

通常,TrustZone 用于访问硬件支持的功能并以监督方式执行敏感操作(例如,加密引擎,凭据存储等)。三星将 TrustZone 大量用于 Samsung Knox,这是由 Samsung 开发的系统范围的安全工具箱。在构成 Knox 的不同组件中,安全存储 API 和基于 TrustZone 的完整性度量架构(简称 TIMA)是两个依靠 TrustZone 执行其操作的示例。Knox 也是提供不同服务的基础,如三星支付、三星通等。

当前的实现在 Trustonic 的 Trusted OS Kinibi 和 ARM Trusted 固件(ATF)和 Samsung 的 Monitor 部分中进行了详细讨论,它使用了 Arm Trusted Firmware 的修改版(用于 Secure Monitor)和一个名为 Kinibi 的可信操作系统,这是由 Trustonic 开发的。

三星使用 ATF 项目实施其 Secure Monitor (安全监视器),并对其一部分进行了修改以使其适合他们的需求。他们添加了自己的运行时服务,这些服务用于提供自定义 SMC 处理程序,而无需接触当前的处理程序。例如,添加的 SMC 处理程序之一负责为可信操作系统处理的 SMC 注册 Kinibi 的向量基地址。

如上所述,本系列文章重点介绍的 Kinibi 在较旧的设备上可用(例如,从 Galaxy 型号的 S6 到 S9)。但是,在诸如 Galaxy S10 之类的最新型号中,三星放弃了 Kinibi,而是使用了自己的受信任的操作系统 TEEGRIS。

深入了解三星的 TrustZone (第 1 部分)受信任的应用程序

受信任的应用程序或 trustlet 是 NWd 中常见的用户应用程序对应的 SWd,由于受信任的操作系统功能是有限的,特别是在微内核的情况下,可以使用受信任的应用程序来扩展它们,它还提供了降低进程执行给定任务所需的特权的方法。

Trustlet 由受信任的程序供应商开发,他们需要访问 TrustZone 功能,以增强其 NWd 应用程序的安全性。例如,流媒体应用程序可能需要使用 DRM 来保护数字内容,而这个 DRM 可以在受信任的应用程序中实现,就像 Widevine 所做的那样,从而防止解密密钥被 NWd 窃取。

深入了解三星的 TrustZone (第 1 部分)MCLF 格式

三星 Trustzone 中使用的 trustlet 是可执行文件,使用称为 Mobicore 可加载格式或 MCLF 的专有文件格式。这种格式非常简单,对于模拟信任协议很有用。

MCLF 标头包含有关 Trustlet 的多种信息,包括:

    它的类型;

    它的 UUID;

    它的入口点;

    细分的地址和大小;

每个 trustlet 均由三个部分组成:

    包含 trustlet 代码的文本段;

    包含其初始化数据的数据;

    包含其未初始化数据的 bss 段;

在 MCLF 标头和分段数据之后,二进制文件包含嵌入式公钥和签名 blob。当将 Trustlet 加载到 TEE 中时,将公钥的哈希与 TZOS 二进制文件中的嵌入式哈希进行比较,然后验证 Trustlet 的签名。此机制可防止未经授权的开发人员在 TrustZone 中运行其自己的代码,只有受信任的供应商才能让 OEM 对他们的 Trustlet 进行签名。

深入了解三星的 TrustZone (第 1 部分)

注意:为简化可信任应用程序的逆向进程,可以使用由 Gassan Idriss 编写的 MCLF 二进制文件的 IDA Pro 加载程序 [IDA_LOADER]。还为 GHIDRA 开发了一个加载器。

深入了解三星的 TrustZone (第 1 部分)与 Trustlet 进行通信

NWd 和 SWd 之间的通信是使用程序中断(SWI)和范围共享内存(WSM)缓冲区执行的,SWI 允许在两个范围之间传输执行,而 WSM 缓冲区允许数据传输。用 Trustonic 的术语来说,这些共享缓冲区在与 Trustlet 通信时称为 TCI,在与安全驱动程序通信时称为 DCI,安全驱动程序是安全驱动程序一节中详细介绍的具有较高特权的特殊类型的受信任应用程序。

深入了解三星的 TrustZone (第 1 部分)McLib 共享库

某些功能可以在 trustlet 之间共享,而不必由每个供应商重新开发。为此,Trustonic 提供了等效于 libc 的名为 McLib (肯定是 MobiCore 库)的库。信任小程序和安全驱动程序都使用它,但是会检查权限以防止信任小程序访问特权函数。它实现了诸如 tlApiMalloc,tlApiRandomGenerateData 等功能。这些函数通常被称为 tlApi 和 drApi。

Trustlet 不会动态加载此库,McLib 处理程序的地址在加载时写入其中,然后用作普通函数,如下面给出的代码片段所示。tlApi 编号将传递到 R0 中,并且根据参数的数量将参数传递给其余通用寄存器或堆栈中的参数。

; tlApiLibEntry is the address of the McLib handler

tlApiWaitNotification

MOV.W R1, #0x1000

LDR.W R2, [R1,#(tlApiLibEntry - 0x1000)]

MOV R1, R0

MOVS R0, #6

BX R2

深入了解三星的 TrustZone (第 1 部分)Trustlet 生命周期

受信任的应用程序具有其自己的地址空间,并且始终在虚拟地址 0x1000 处加载。一旦运行,它们通常遵循相同的执行进程。它们首先初始化不同的组件(例如堆栈),然后检查从 NWd 发送的 TCI 缓冲区的大小。之后,trustlet 使用 McLib 函数 tlApiWaitNotification 等待 TCI 缓冲区中的命令,并相应地处理这些命令,然后使用 tlApiNotify 将结果发送回 NWd。下图说明了该执行进程。

深入了解三星的 TrustZone (第 1 部分)

从攻击者的角度来看,整个 trustlet 的攻击面通常相当于一个命令处理程序。这些处理程序主要处理用户提供的数据,并且必须彻底检查从 NWd 传递的每个参数是否都符合预期的格式。如果攻击者要在 trustlet 中获得代码执行,则他们将无能为力。但是,它们将能够攻击特权更高的进程,例如 Kinibi 本身或安全驱动程序,这两种进程都将在下面的部分中讨论。

深入了解三星的 TrustZone (第 1 部分)安全驱动程序

安全驱动程序是在 Secure World 的用户域中执行的受信任应用程序的一种特殊形式,但相对于 trustlet 具有更高的特权。这些额外的特权归结为对其他 SVC (管理程序调用)的访问,例如,使用线程映射特定物理内存范围的能力,或能够制作 SMC 的能力,如下所述。

Trustlet 和安全驱动程序可以使用 IPC 并通过编组发送的参数进行通信,安全驱动程序充当 Trustlet 的接口,以受控方式访问外围设备。要访问外围设备,安全驱动程序需要能够映射其物理内存,这可以使用 drApiMapPhys,drApiUnmap,drApiVirt2Phys 等函数实现。

驱动程序是多线程应用程序,这是另一个独特的功能。遇到的常见线程是:

    主线程充当异常处理程序;

2.DCI 线程处理 NWd 消息;

3.IPC 线程处理系统 / trustlet 消息;

4.ISR 线程处理中断;

深入了解三星的 TrustZone (第 1 部分)

这其中涉及到了很多主线程以及组件,我们会在下一篇文章中介绍。

本文参考自:https://blog.quarkslab.com/a-deep-pe-into-samsungs-trustzone-part-1.html

深入了解三星的 TrustZone (第 1 部分)

深入了解三星的 TrustZone (第 1 部分)