深入了解三星的TrustZone(第1部分) - 嘶吼 RoarTalk – 网络安全行业综合服务平台,4hou.com

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

gejigeji 移动安全 2020-02-07 09:23:46
624317
收藏

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

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

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

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

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

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

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

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

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

ARM TrustZone技术

嵌入式安全性的当前状态

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

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

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

1.png

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

arch_evolution.png

现有TEE

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

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

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

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

3.png

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

3.2.png

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

3.3.png

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

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

ARM TrustZone程序架构

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

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

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

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

4.png

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

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

5.png

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

6.png

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

7.1.png

7.2.png

7.3.png

逆向三星的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。

受信任的应用程序

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

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

MCLF格式

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

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

1.它的类型;

2.它的UUID;

3.它的入口点;

4.细分的地址和大小;

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

1.包含trustlet代码的文本段;

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

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

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

8.png

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

与Trustlet进行通信

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

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

Trustlet生命周期

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

10.png

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

安全驱动程序

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

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

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

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

2.DCI线程处理NWd消息;

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

4.ISR线程处理中断;

11.png

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

本文翻译自:https://blog.quarkslab.com/a-deep-dive-into-samsungs-trustzone-part-1.html如若转载,请注明原文地址
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论

 
本站4hou.com,所使用的字体和图片文字等素材部分来源于原作者或互联网共享平台。如使用任何字体和图片文字有侵犯其版权所有方的,嘶吼将配合联系原作者核实,并做出删除处理。
©2022 北京嘶吼文化传媒有限公司 京ICP备16063439号-1 本站由 提供云计算服务