一个人的闲言碎语

dr0v

blog.drov.com.cn
一个人碎碎念。
About Me
A lazy security employee.

2016年8月17日星期三

关于android-root的一点材料整理

root的方案

获取root权限有哪些方式?
  • 使用本地提权漏洞利用工具来直接 Root,这是最原始最纯洁的方式。随着厂商对 Rom 的升级,这些内核的漏洞随时都可能被修补,因此,这种 Root 方法在时间与空间上都有着很大的局限性。
  • 刷第三方的 Recovery,利用 Recovery 来提权。但目前手机厂商为了保障手机安全性和可控性,一般会选择锁死 Bootloader ,so - -#
  • 刷第三方 Rom 包,目前很多第三方 ROM 是自带了 Root 的。但手机厂商在 OTA 升级时使用 Recovery 对包签名进行验证来防止用户刷入修改过的包。这种情况下,就只能通过 FastBoot 来刷了。

获取root权限的过程

利用本地提权漏洞来实现root

在大多数情况下都遵循以下步骤:
一键root流程
需要使用漏洞的原因:
  1. 中文版的/system路径是只读权限,我们是不能完成写入或者copy操作的
  2. chmod命令是需要拥有Root权限后才可以使用的,我们的在操作的时候是没有Root权限的,所以这个命令在我们Root过程中是无法使用的。
  3. 某些厂商定制的系统在系统重新启动的时候会自动将su的权限从4755改成755或者直接删除了su,正是因为这个原因我们经常会碰到,明明我们是已经Root过的手机,但是手机重启后就没有Root权限了。这种只是临时获得的Root权限。
其中Exploit在Root过程中扮演着关键角色;exp可能是一个工具,也有可能是一整套,它是对于系统漏洞或者Android源码漏洞加以利用的工具,突破上文的逻辑闭环的工作就是由它完成。根据不同的版本,都会有不同的exploit,比如早期的ratc,psneuter等。
示例:
ratc漏洞exp

刷recovery方式来实现root

通过pc端工具,连接手机也可以进行root。
pc端工具会根据机型选择对应的修改后的recovery(其中认同度最高的是ClockWorkMod的recovery),通过cat或dd命令将su刷入recovery对应的硬件地址。
recovery其实是一个小型的手机系统,也是linux内核的。也就是说,可以理解为手机上装了双系统,一个是android系统,一个是recovery。如果android系统被毁了(比如删了rom中的/system分区),手机还是可以进入recovery的。
通过recovery怎样获取root权限呢?原理很简单,进入recovery后,/system分区就变成了rom中的一个硬件盘块,对它当然可以自由修改。我们把su放到/system/xbin文件夹下,赋予rwsr-sr-x权限,基本就大功告成了。

刷ROM方式获取得到root

一般只有非常少的机型支持从SD卡boot来进行root或刷机,这里就简单介绍一下这种情况root的思路:
因为是从SD卡boot,所以SD卡上会有对应的boot.img。修改这里的boot.img,就可以达到我们的目的。

用于提权的漏洞

漏洞CVE号/名称 简介
CVE-2009-2692 (Wunderbar/asroot) sock_sendpage()的空指针解引用因为 sock_sendpage 没有对 socket_file_ops 结构的 sendpage 字段做指针检查,有些模块不具备sendpage 功能,初始时赋为 NULL,这样,没有做检查的 sock_sendpage 有可能直接调用空指针而导致出错并提升权限。所以,sendfile(fdout, fdin, NULL, PAGE_SIZE);的调用使得该洞被触发,最终执行以下代码获取到 Root 权限
adbd setuid 在Android2.2及以前的版本中,adb.c中的代码都是以root权限运行,以完成部分初始化工作.通过调用setuid()将用户从root切换回shell,但setuid()在shell用户进程数达到上限RLIMIT_NPROC时,会失败,因此adb.c继续以 root 身份运行
Exynos-abuse 早期的三星手机,经常是某些设备被chmod 755/666,造成了全局可读写,然后只要将这些设备mmap出来,就可以操作物理内存,之后可以通过patch相关参数或者构造payload函数达到提权的目的
CVE-2010-EASY udev 对热插拔消息检测不严导致的,用户通过发送恶意信息让内核加载自定义的恶意程序从而取得 root 权限
CVE-2011-1823(GingerBreak) 在Android 3.0版本和2.3.4之前的2.x版本上的volume守护进程(vold)由于信任从PF_NETLINK套接字接收到的消息,因此允许以root权限执行任意代码,利用方法是通过一个负数索引绕过只针对最大值的有符号整数检测.
CVE-2011-3874 (zergRush) 漏洞的本质是Use-After-Free(UAF).具有root权限的vold进程使用了libsysutils.so,其中某个函数存在栈溢出的问题,因此可以控制root身份的vold执行system(),借以提权
CVE-2012-0056 (mempodroid) 利用系统中具有s属性(suid)的程序通过自修改程序的内存,执行 Shellcode 达到获得 Root 权限的目的
CVE-2012-4220(diag) Android 2.3-4.2使用的QualcommInnovation Center (QuIC) Diagnostics内核模式驱动程序diagchar_core.c在实现上存在整数溢出漏洞,通过向diagchar_ioctl内传递特制的输入,远程攻击者可利用此漏洞执行任意代码或造成拒绝服务
CVE-2013-6282 ARM v6/v7架构的Linux内核中的get_user/put_user接口没有验证目标地址,由于硬件架构的更迭,get_user/put_user最初用于实现和控制域切换的功能被弃用了,导致任何使用该API的内核代码都可能存在安全隐患.让任意应用来读写 内核内存,造成权限泄漏
CVE-2014-3153 漏洞利用了futex_requeue,futex_lock_pi,futex_wait_requeue_pi三个函数存在的RELOCK漏洞和REQUEUE漏洞,造成了对内核栈上的数据修改,知名root工具towelroot就是利用了这个漏洞可以覆盖2014年6月以前的设备
CVE-2015-1805 在linux 内核3.16版本之前的fs/pipe.c当中,由于pipe_read和pipe_write没有考虑到拷贝过程中数据没有同步的一些临界情况,造成了拷贝越界的问题,因此有可能导致系统crash以及系统权限提升
CVE-2015-3636 Linux kernel的ping套接字上存在的一个Use-After-Free(UAF)漏洞
CVE-2016-0728 由keyring的引用计数溢出问题导致的UAF漏洞

防root手段

了解了root的一些原理和手段后,怎么防root呢?
目前主流的防root手法如下:
  • 针对漏洞利用型提权——升级系统或打补丁修复漏洞等方法;
  • 针对刷recovery型提权——保护recovery,禁止sdcard刷机方式,锁死bootload等方法;
  • 针对刷ROM型提权——禁止刷ROM,锁死bootloader。
目前手机可能主流的都已锁死了bootloader——禁止刷ROM;
漏洞方面则只能靠良心和用户自身的意愿了,碎片化十分严重。
而对于漏洞,因为android版本的碎片化而无法达到面面俱到,漏洞的补丁又多、用户更新意愿也不强等问题。在这个层面上,可以考虑针对root工具做检测,提示用户或禁止安装root工具。另外一种方式,通过对底层api的监控,防止root工具利用exp的执行来获取临时root权限——一般exp执行都是会调用一些非常用api来达到进程重启或越权的目的,获取临时root。那么针对性的解决临时root的问题就可以了。
Categories: , ,

0 评论:

发表评论