当前位置: 移动技术网 > IT编程>移动开发>Android > 关于Android的root提权漏洞

关于Android的root提权漏洞

2018年02月21日  | 移动技术网IT编程  | 我要评论

九孔桥,本科在读已生二胎,冥神盛典

0x001 什么是root?


硬件root

刷有带su和superuser的rom
刷入定制内核/镜像等

软件root

利用漏洞提权
并将一个带有恰当set-uid权限的su文件移动到系统分区

两种都要突破NAND锁成为永久root

以下两个转自于知乎少仲哥 和flanker_hqd的回答:

0x02历史上已知的比较有代表提取漏洞


1.CVE-2009-2692(Wunderbar/asroot)

sock_sendpage()的空指针解引用.因为sock_sendpage 没有对 socket_file_ops 结构的 sendpage 字段做指针检查,有些模块不具备sendpage 功能,初始时赋为 NULL,这样,没有做检查的sock_sendpage 有可能直接调用空指针而导致出错并提升权限.

2.adbd setuid

ADB守护进程(adbd进程)以root权限开始启动,然后降权到shell用户.在Android2.2及以前的版本中,ADB守护进程在降权时不会检查setuid调用的返回值.在此之前,adb.c中的代码都是以root权限运行,以完成部分初始化工作.通过调用setuid()将用户从root切换回shell,但setuid()在shell用户进程数达到上限RLIMIT_NPROC时,会失败,因此adb.c继续以root身份运行,而没有报错.

3.CVE-2011-3874(zergRush)

漏洞的本质是”use after free”.具有root权限的vold进程使用了libsysutils.so,其中某个函数存在栈溢出的问题,因此可以控制root身份的vold执行system(),借以提权.

4.CVE-2012-0056(mempodroid)

Linux通过一个特殊字符设备/proc/$pid/mem把每个进程的虚拟内存暴露为一个文件.出于安全考虑,读写这个文件的权限被严格限制,拥有写入权限的只有内存的所属进程.但是攻击者可以打开目标进程的mem设备,把它复制到进程的stdout和stderr.当stdout重定向到与虚拟内存相关的字符设备时,攻击者可以写入其他程序内存,但是写入的地址是未知的.

5.CVE-2011-1823(GingerBreak)

在Android 3.0版本和2.3.4之前的2.x版本上的volume守护进程(vold)由于信任从PF_NETLINK套接字接收到的消息,因此允许以root权限执行任意代码,利用方法是通过一个负数索引绕过只针对最大值的有符号整数检测.

6.Exynos-abuse

早期的三星手机,经常是某些设备被chmod 755/666,造成了全局可读写,然后只要将这些设备mmap出来,就可以操作物理内存,之后可以通过patch相关参数或者构造payload函数达到提权的目的.

7.CVE-2012-4220(diag)

Android 2.3-4.2使用的QualcommInnovation Center (QuIC) Diagnostics内核模式驱动程序diagchar_core.c在实现上存在整数溢出漏洞,通过向diagchar_ioctl内传递特制的输入,远程攻击者可利用此漏洞执行任意代码或造成拒绝服务.

8.CVE-2013-6282

ARM v6/v7架构的Linux内核中的get_user/put_user接口没有验证目标地址,由于硬件架构的更迭,get_user/put_user最初用于实现和控制域切换的功能被弃用了,导致任何使用该API的内核代码都可能存在安全隐患.让任意应用来读写内核内存,造成权限泄漏.

9.CVE-2014-3153

漏洞利用了 futex_requeue,futex_lock_pi,futex_wait_requeue_pi三个函数存在的RELOCK漏洞和REQUEUE漏洞,造成了对内核栈上的数据修改,知名root工具towelroot就是利用了这个漏洞可以覆盖2014年6月以前的设备.

10.CVE-2015-3636

该漏洞是Linux kernel的ping套接字上存在的一个Use-After-Free漏洞.


Android 2.*时代,vold有多个溢出漏洞,都被用来exploit和poc.
Android 4.*时代,大部分的exploit都盯上了内核中的堆栈溢出和整数溢出等.
Android 5.*以后,更强悍的SELinux策略,想通过kernel漏洞提取更加困难.


0x03如何入门android内核挖掘?


Andriod平台漏洞也有很多种,分为不同的方向,比如内核漏洞挖掘/利用,用户态高权限进程漏洞挖掘/利用,浏览器漏洞挖掘/沙箱逃逸和针对Andriod自身结构的漏洞(权限泄漏、敏感信息泄漏等)。题主应该希望学习的是前两种。

Android是一个基于Linux的复杂系统,想要熟练挖掘Android漏洞必须要了解Linux系统本身(内核,驱动),以及Android在Linux架构上添加的各式各样的组件和功能(binder,media/graphics subsystem,zygote, chromium/skia和最上层的四大金刚等)。从问题中的角度来讲,对于不熟悉Windows平台的初学者,不建议将大量时间投入到Windows平台上的漏洞利用学习上,因为两个平台的漏洞虽然核心思想相通,但具体到利用的细节不太相同。这些精力时间投入到Linux平台和Android自身的研究学习上对于Android漏洞挖掘这个目的意义更大。并且从实际的角度出发,业界目前需要更多的也是Mobile系统方向上的人才。

基础的漏洞类型例如栈溢出、堆溢出、未初始化、OOB、UAF、条件竞争/TOCTOU漏洞等必须要熟练理解掌握,这些在各种CTF平台上在Linux平台下都可以练习到。但是需要注意的一点是CTF还是和实际有些区别。例如CTF上的堆溢出题目绝大部分都基于dlmalloc,而Android早在5.0就切换到了jemalloc。现代软件中最常见的条件竞争漏洞因为比赛平台的限制也很少在CTF中看到(利用比较耗费资源,很难支撑比赛中的大规模并发需求)。

在了解了基础知识之后,可以进一步学习Andriod自身的体系结构。
Binder方面可以学习调试几个经典漏洞(GitHub - flankerhqd/mediacodecoob: Infoleak and PC control poc for CVE-2015-6620 (24445127), I’ll add after conference, https://www.blackhat.com/asia-16/briefings.html)

文件格式漏洞自然是经典的stagefright,https://www.exploit-db.com/docs/39527.pdf。

驱动/内核漏洞3636和1805(https://www.blackhat.com/docs/us-15/materials/us-15-Xu-Ah-Universal-Android-Rooting-Is-Back.pdf)。

Chrome V8相关:GitHub - 4B5F5F4B/Exploits

关注每个月的android security bulletin, 尝试从diff反推漏洞研究如何触发和利用。

代码审计:经典书籍 The art of software security assessment

fuzzing

当然,只要掌握了计算机体系结构,熟悉了程序的运作方式,到达一定境界之后那么各种漏洞、各种系统之间的界限也就渐渐模糊了。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网