前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你熟悉的Android Root 方式有哪些?|附演示视频

你熟悉的Android Root 方式有哪些?|附演示视频

作者头像
腾讯云安全
发布2018-06-12 14:56:38
1.4K0
发布2018-06-12 14:56:38
举报

你熟悉的Android Root方式有哪些?

如何在无需任何特殊权限条件下

控制用户手机设备?

安小妹无意中发现了乐固一枚技术GG的文档

于是整理分享给大家

喜欢的话别忘了分享噢

[附视频演示]

不依赖于软件漏洞的

Android Root 方式 

引言:

安全界有四大著名的顶级会议:

S&P,CCS,USENIX Security,NDSS

这四个会议论文通过率都非常之低,也从侧面透露出其发表的研究论文含金量极高。在其中2016年的CCS会议上,来自阿姆斯特丹自由大学与加利福尼亚大学圣巴巴拉分校的研究员Victor van der Veen、Yanick Fratantonio 等人发表了一篇名为

《Drammer: Deterministic Rowhammer Attacks on Mobile Platforms》论文,里面介绍了一种不依赖于软件漏洞的Android Root方式,通过Drammer,攻击者可以利用恶意软件来触发安卓手机硬件漏洞,在无需任何特殊权限的条件下完全控制用户手机设备,成功Root。

△提权成功演示图

可触发Android手机CPU漏洞的

Drammer究竟是什么?

Drammer这个单词其实是Deterministic Rowhammer 的简称,也就是确定性的Rowhammer攻击,要弄明白Drammer攻击,我们需要先了解Rowhammer是什么。

Rowhammer是一种针对DRAM的攻击手段,它可以通过利用硬件的漏洞,如DDR3来任意操作内存中的数据。

利用Drammer

视频演示Android Root 

该铺垫的背景知识铺垫完了,平常安小妹看到的让Android Root方式多为利用软件,而本次文中介绍的为利用硬件漏洞Drammer,第一个演示视频为:利用Drammer漏洞在安卓6.0.1上的一个shell提权演示。在0:50秒时,Drammer 获得 Root 访问权限,并打开一个Shell 窗口,设备得以完全控制。

△利用Drammer漏洞在安卓6.0.1上的Root演示

第二个视频则是通过Stagefright的漏洞来拿Shell,再利用Stagefright这个Shell获取存在Drammer漏洞安卓机器的Root权限。在03:30秒时,获取Root权限成功。

Stagefright+Drammer 获取Root权限演示

漏洞细节分析

看完演示视频我们一起来了解Drammer(Deterministic Rowhammer)漏洞的细节分析。

如上图所示,DRAM由一个cell存储单元组成的二维数组构成,每一组存储单元行与列组成的矩阵称之为bank,如图中示例row 0 –row 4组成的矩阵为一个bank。

每一个DRAM芯片都包含多个bank, 每一个bank都有自己的一块row-buffer,这个row-buffer其实是一排灵敏放大器(Sense Amplifier)。在每次访问内存时,一个存储单元行会被激活,将整个row的数据保存在row-buffer之中,同时cell放电,然后将row-buffer的上下文写入原来的存储单元行之中,cell充电。

由于存储单元现在做的越来越小,也越来越紧凑,同时内存制造业不断地改进芯片工艺以容纳更多的存储单元,在不断的充电放电的过程中,会引发电荷逃逸或直接进入相邻的存储单元,从而影响到相邻的内存。如果进行足够多次数的访问,就可以让一个存储单元从0变成1,或者从1变为0.。

如以下示例代码即可导致bit翻转。

code1a:

  mov (X), %eax  // Read from address X

  mov (Y), %ebx  // Read from address Y

  clflush (X)  // Flush cache for address X

  clflush (Y)  // Flush cache for address Y

jmp code1a

这里有两点需要注意:

1、 由于row-buffer相当于扮演了一个缓存的角色,如果X、Y指向了同一行(row),那么进行code1a操作的时候,会直接读取row-buffer,而不会去进行激活操作,同时,由于每一个bank都有自己的row-buffer,那么如果X,Y处于不同的bank,读取操作也会直接去读取各自的row-buffer,而不会继续进行激活操作,所以X,Y必须处在同一个bank下的不同行。

2、 Clflush指令,由于现代CPU基本都有cache缓存,如果不对缓存进行刷新,那么访问操作则会直接读取缓存中的内容。

漏洞利用条件

由上分析可知,一个成功的Drammer漏洞利用需要同时满足以下两个条件:

1、 快速的对非缓存内存的访问;

2、 巧妙排布内存,触发rowhammer的bit位翻转,从而使受害程序使用被控制的存储单元来存储敏感信息(如PTE表基址);

漏洞利用难点

其实在Drammer漏洞爆出之前,已经有了X86框架下的rowhammer攻击利用手段,如Zero day团队获取了Linux x64的Root权限(通过改写诸如/bin/ping等以root权限运行的可执行程序的PTE表基址,使得攻击程序可通过页表写入shellcode,并覆盖程序入口),Dedup Est Machina(获得了BlackHat 2016最具创新Pwnie奖,通过Javascript触发,攻破了微软Edge浏览器,代码完全由Javascript编写。

Js利用代码的地址:

https://github.com/IAIK/rowhammerjs/blob/master/javascript/rowhammer.js

这次的Drammer攻击则直接针对Android ARM平台,其实现的难点在于

1、 刷新cache的指令需要权限,对于ARMv7,其刷新cpu cache的指令只能在内核层执行,虽然Android kernel也提供了cacheflush()的系统调用,但是其只能刷新level2的cache,对于ARMv8,虽然其提供了无需权限的刷新缓存的指令,但是其可能被内核关闭。

2、 ARMv8虽然提供了不访问缓存的load和store指令,但是这些指令只是对CPU进行提醒,表示可以不访问缓存,但在实际测试中,还是会直接访问缓存。

3、 内存的排布,例如Project Zero的利用方式,其通过mmap在内存中喷射了大量的Page-table,但是这种利用方式可能会使操作系统崩溃,利用并不稳定。还有利用方式使用了内核的Kernel same-page merging特性(允许不同进程共同使用同一内存页),Android系统默认没有启动这个特性。

4、 了解虚拟内存对应物理内存的映射,对于Linux 4.0以下版本的内核,可以通过/proc/self/pagemap来读取虚拟内存与物理内存的映射关系。如图:

Project Zero的rowhummer利用就使用了这种方式来获得虚拟内存与物理内存的映射,但是Linux4.0内核版本之后,内核禁止了未授权的访问,而Android在2015年后,内核使用了最新的特性,也禁止了未授权访问/proc/self/pagemap,因此这个特性也是无法使用的。

5、Huge page,Kim的利用方式里使用了Huge page特性,通常情况下Linux的内存页大小是4k,而启动Huge page属性后, 会有大页面出现如2m,4m,16m,4k大小的内存页小于一个存储单元行,而2m大小的内存页则通常会包含多行,而且大部分都在同一个bank之下,这样同一虚拟内存附近的地址也会在物理内存地址上相邻,就可以进行双侧hammering攻击,提高翻转几率。 可以通过cat /proc/meminfo | grep Huge 命令查看是否启用Huge page。

不幸的是,只有少部分Android手机支持这个特性,攻击不具备普适性。

6、 ARM规格未提供内存详情,因此无法清楚知晓一个存储单元行的实际大小,手机设备也没有提供swap交换空间,同时如果手机内存紧张,Android内存管理会自动杀死进程。

针对利用难点

如何巧妙进行攻击?

针对以上利用难点,Drammer做了很多巧妙的工作进行攻击

1、 对于无法知晓ARM下DRAM的存储单元行的大小的问题,Drammer使用了基于时间的边信道攻击方式,其原理是访问同一个bank下的两个不同row内存页,要比访问不同bank下的内存页慢(因为不同bank下有不同的row-buffer),因此我们可以通过访问n 和n+i两个不同的内存页,通过递增i,如果访问时间显著增加,则说明n+I 与n在同一bank下的不同row。通过这种手段可推得一个DRAM存储单元行的大小。

2、 直接内存访问,由于移动设备除了CPU和芯片外,还会有GPU,摄像头等设备,为了提供高效的内存共享方式,一般现代操作系统都会提供直接内存访问管理机制,而对于Android,其提供了ION内存管理器,可以通过ION,在用户态访问未cache的内存。

3、采用Phys Feng Shui攻击手段,利用标准物理内存alloctor(如Linux的buddy alloctor)的内存reuse模型,通过内存模板探针(探测哪个内存位可被利用)和不断地分配和释放不同大小的内存,最终在可被利用的内存位附近分配了PTP页表,然后通过内存位翻转,修改自身进程的PTP页表,从而可访问任意物理地址。

4、通过在内核空间搜索自身进程的security context(struct cred),更改UID,刷新TLB,获取Root。

该漏洞受影响机型

根据论文作者的实验,以下机型受到该漏洞的影响:

论文的作者提供了测试APK以供下载

https://vvdveen.com/drammer/drammer.apk 

可以下载后使用,查看自己的手机机型是否受影响。测试APK的native代码,作者也已开源[注意只有检测功能,Root代码作者未提供]。

缓解方案

截至目前为止,没有完美的修复方式, 腾讯云乐固建议手机厂商可以用使用具有ECC功能的RAM让这个攻击造成拒绝服务,而非获取Root权限,从而得以缓解。 对于Android用户们,乐固则建议保持平常的安全意识,从官方渠道下载APP,不要轻易打开未知链接。

版权的分割线

参考链接:

http://arstechnica.com/security/2016/10/using-rowhammer-bitflips-to-root-android-phones-is-now-a-thing/

https://vvdveen.com/publications/drammer.pdf

https://en.wikipedia.org/wiki/Kernel_same-page_merging

https://www.vusec.net/projects/flip-feng-shui/

http://www.cs.vu.nl/~herbertb/download/papers/dedup-est-machina_sp16.pdf

https://users.ece.cmu.edu/~yoonguk/papers/kim-isca14.pdf

https://googleprojectzero.blogspot.com/2015/03/exploiting-dram-rowhammer-bug-to-gain.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云安全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档