首页
社区
课程
招聘
[翻译] 攻击TrustZone系列(Pt.1) -- 以用户权限在TrustZone内核中执行任意代码的流程简介
2017-9-17 10:16 6603

[翻译] 攻击TrustZone系列(Pt.1) -- 以用户权限在TrustZone内核中执行任意代码的流程简介

2017-9-17 10:16
6603
译者引言:
TrustZone是ARM架构的安全解决方案,问世已经很多年了,在比较新的ARM cortex-A 系列中基本都存在。现在的几乎所有的手机平板用的都是 Cortex-A 系列芯片。随着 IoT 的到来,2017年,新的ARM cortex-M 也加入了 TrustZone

至于攻击TrustZone后果有多严重,我们举个例子,苹果手机的指纹认证以及支付功能使用的都是TrustZone,现在的假设是,即使你的手机上有病毒,甚至于那个病毒可以在你手机的Linux内核里执行任意代码,如果TrustZone没有漏洞,TrustZone里的东西依然是安全的。如果我们能在TrustZone里执行任意代码,这手机的一切认证支付功能都将面临危险。你的所有信息对于攻击者来说都是一目了然。

这个系列翻译自2015年到2017年的一系列文章。希望给大家系统的介绍一下如何利用多个漏洞从用户权限到在Trustzone内核中执行任意代码。

正文:

我们的目标?


这将会是一系列关于如何运用我发现的多个漏洞来让我们能在Trustzone内核中使用最高权限运行任意代码的细节的文章。

由于我只有一个Nexus5(用的芯片是Snapdragon 800 SoC),我将会侧重于我的设备上的TrustZone平台 -- 高通TrustZone。

值得注意的是所有基于高通SoC的设备都包涵高通TrustZone平台,然而,高通也允许原型设备制造商对平台进行修改,这些在我之后的博客中会有提及。

并且,我相信攻击高通的TrustZone平台是一个很好的选择,毕竟Snapdragon SoC在很多设备中都有用到。(高通的市场份额还是很大的)

安卓与安全


在这些年里,许多的安全机制被引入到了安卓当中,现有的机制也得到了提升。

虽然底层的安全架构没有变化,防御机制却变得十分可靠。现在想要取得系统的最高权限变得复杂,很多时候会需要协同多个漏洞。

如果你想知道一些大概的机制,你可以看看 Google's "Android Security Overview",这里面介绍了现有的安全机制。

TrustZone 是什么?



(这是一张ARM的TrustZone架构图)

根据ARM所说,TrustZone是:
“一个用于保护一些列用户以及服务器计算平台的系统级方法,这些设备包括耳机,平板,可穿戴设备以及企业系统。基于这个技术的应用很广泛,其中包括有安全支付, 数字版权管理 ,个人电子设备,以及一系列安全的企业解决方案”

简单的来说,TrustZone是一个用来保证在设备上能够安全执行程序的系统。

为了能够安全的执行TrustZone的代码,需要一类特定的处理器。这类处理器可以执行两类代码,一类是安全代码(在安全世界中),一类是非安全代码( 在正常世界中 )。不是这类处理器的处理器,只能执行非安全代码。

(这里文章中的正常世界与安全世界如图,指的是在正常Linux内核上的世界,以及特意为安全世界服务的阉割版内核上的世界

TrustZone在安卓设备上有很多不同的用法,比如说:
——检查内核完整性(完整性基本就是靠哈希来验证,哈希很简单,就是从一堆特定代码以及数据中只能得到一个签名,所以以后你要验证是不是这同一堆代码以及数据,只要用这些代码以及数据算一个哈希,然后和这个签名比对,如果相同,那么就是同样的。)
——使用硬件上的机密存储(在“keystore”,“dm-verity”中使用)
——移动支付的安全部件模拟
——实现以及管理安全启动
——DRM( 数字版权管理 ,就是那些正版音乐,影音啥的)
——使用硬件平台功能(比如硬件熵)

为了能够使整个系统都安全,而不是仅仅的应用程序安全,当进入安全世界时系统总线上特定的比特位将为被置位,而离开时归零。

外设可以通过观察这些比特位来推理我们当前是否运作于安全世界里。

TrustZone的安全模型是如何工作的?


ARM也有一篇短篇关于 TrustZone's Secure Model

为了达到安全执行代码,TrustZone以及非TrustZone的代码要得到严格的分割。这将由安全世界(TrustZone内核及它的应用程序)和正常世界(安卓)来划分。

由之前的图你也能看出来,在正常世界里,用户模式(你的App)和系统模式(安卓内核)之间也有一个安全边界。

这个安全边界将由目前程序状态寄存器(CPSR)来界定:

这决定模式的比特位(在图中的M[4:0]),将控制现在的执行模式。在linux内核中(安卓是基于linux内核),用户模式(b10000)将用于你的app,管理者模式(b10011)将用于你的内核。

然而,这里缺少了些东西——没有比特位可以告诉我们现在存在于的世界是哪个。这是因为另一个寄存器将决定我们存在的世界——安全配置寄存器(SCR):

这个寄存器是一个协同处理器寄存器,在CP15 c1,这意味着它将只能通过MRC以及MCR的操作码来控制。(关于CP15可以看这个

像CPSR寄存器一样,正常世界不能够直接修改SCR寄存器。然而,它可以通过执行SMC机器码(这与利用SWI操作码切换到管理者模式相同,关于SWI可以看这个)来切换到TrustZone的内核。

值得注意的是,SMC只能在管理者模式下使用(即Linux内核),所以App无法使用(App想用的话,只能向Linux内核发系统调用来请求)。

为了能够真正使用TrustZone里的功能,Linux 内核必须先注册一些服务,这些服务将在需要的时候被SMC调用的。

在高通的设定下,他们在linux内核中加入了叫做“qseecom”的设备驱动。我们在之后的文章中会提及它,别怕。

小结一下


我们之后要走的路还很长——为了能够从用户模式的安卓程序(即你的App,最低权限)来在安全世界里执行任意代码,我们需要利用以下几个提权漏洞:
——从安卓用户提权成安卓超级用户
——从安卓超级用户到在Linux内核中执行任意代码
——从Linux内核到在安全世界中执行任意代码

如果你觉得挺有趣的话,就接着读吧?

在下一个博客中,我将会提到关于高通Trustzone是怎么实现的,我将利用的漏洞,以及我如何利用这个漏洞来攻击内核。



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (2)
雪    币: 207
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
handsome枫雪 2017-9-20 09:53
2
0
感谢分享~~  精华~~
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
聖blue 2017-9-20 19:36
3
0
不错!!!!!!
游客
登录 | 注册 方可回帖
返回