你熟悉的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 条评论
登录 后参与评论

相关文章

来自专栏张戈的专栏

实测Nginx服务器开启pagespeed加速效果

上周有一个站长问到我一个问题,问 fastcgi_cache 和 pagespeed 加速有没有冲突。略微想了下,2 个都是比较原生的主,应该不存在兼容问题。 ...

6099
来自专栏FreeBuf

浅谈非PE的攻击技巧

背景 近日,金山毒霸安全中心捕获到一例利用邮件传播的非PE样本,类型为lnk快捷方式文件,执行后会下载勒索病毒,最终会加密用户机器上的文档、图片、视频等重要文件...

3517
来自专栏北京马哥教育

Linux 新手必会的21条命令合集

2107
来自专栏PHP在线

8个最佳PHP库

原文出处: codegeekz 译文出处:oschina PHP标准库 (SPL)的目的就是提供一组接口,让开发者在PHP5中充分利用面向对象编程。因此...

4754
来自专栏魏艾斯博客www.vpsss.net

更换 sitemap 插件为 Google XML Sitemaps 及相关设置过程

2432
来自专栏Python爬虫与算法进阶

拥抱linux,体验双系统

我的回答:是,明明已经把自动更新关闭了,可是还是会有“易升”,win10易升一直卸载不掉。所以就想试试别的系统。

7077
来自专栏SDNLAB

SDNLAB技术分享(五):浅谈Open vSwitch移植

好了我们开始今天的主题吧!! 前一段时间自己私下一直学习Open vSwitch。起初学习Open vSwitch的目的,只是为了更好的学习OpenFlow协议...

38715
来自专栏Material Design组件

Human Interface Guidelines — Custom Keyboards

1443
来自专栏Java技术分享

XML语言基本介绍

怎么解释呢,拿我们平时熟悉的HTML语言来说,HTML就是一种规定了特定标签的语言,而XML语言则没有规定特定的标签(可能有一些基本的?目前我还没有学习到,以后...

2136
来自专栏工科狗和生物喵

Python爬虫小白入门(一)

开篇语 本篇文章适用人群 >有一点点语法基础,至少知道Python这个东西,如果有其他方面语言的基础那也凑合 >会一点点Linux系统的操作,最好是ubunt...

50811

扫码关注云+社区

领取腾讯云代金券