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

你熟悉的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

原文发布于微信公众号 - 腾讯云安全(TencentCloudSecurity)

原文发表时间:2016-12-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

高性能网络编程6--reactor反应堆与定时器管理

反应堆开发模型被绝大多数高性能服务器所选择,上一篇所介绍的IO多路复用是它的实现基础。定时触发功能通常是服务器必备组件,反应堆模型往往还不得不将定时器的管理囊括...

651
来自专栏Albert陈凯

2018-08-05 没有测试用例的代码,根本不应该跑在服务器上

在实际测试中,一个单元可以小到一个方法,也可以大到包含多个类。从定义上讲,单元测试和集成测试是有严格的区分的,但是在实际开发中它们可能并没有那么严格的界限。如果...

755
来自专栏用户2442861的专栏

caffe 依赖的作用

1.      Boost库:它是一个可移植、跨平台,提供源代码的C++库,作为标准库的后备。

651
来自专栏xdecode

图解高内聚与低耦合

模块就是从逻辑上将系统分解为更细微的部分, 分而治之, 复杂问题拆解为若干简单问题, 逐个解决.

531
来自专栏码字搬砖

JVM内存模型

先磨磨肩擦擦掌,小二很早就听说jvm的内存很是奇特,今日一看果然不同凡响。下面且听小二一一道来。

1125
来自专栏后台开发+音视频+ffmpeg

ffmpeg视频云转拉过程中耗时分析与优化

在整个视频云的流程中(对于冷流整个流程是比较多的),其中有一个环节是转拉。转拉就是从源站拉流,然后推流到目的服务器上的过程。

50220
来自专栏游戏杂谈

JavaScript监控当前cpu使用状况

也许在你面试的某一天,突然问你一个问题:“如何粗略的计算出当前系统cpu的使用情况?”

672
来自专栏.NET技术

.net core实践系列之短信服务-架构优化

通过前面的几篇文章,讲解了一个短信服务的架构设计与实现。然而初始方案并非100%完美的,我们仍可以对该架构做一些优化与调整。

482
来自专栏软件测试经验与教训

脚本开发和场景运行的检查点

2684
来自专栏IMWeb前端团队

Unix Pipes to Javascript Pipes

本文作者:IMWeb 杨文坚 原文出处:IMWeb社区 未经同意,禁止转载 Unix Pipes Unix管道扫描稿 ? 简单样例: $ ne...

17510

扫码关注云+社区