这个漏洞网上有很多资料,我也来总结一下。
首先,先来大致了解下Root Android系统的原理。Root的本质就是修改替换/system/bin/su这个文件。这个文件就跟桌面linux的su命令一样,提供切换到root用户的功能。但是系统自带的su文件(有时候系统中甚至不会有这个文件)有诸多限制,不可能让随便一个程序就能使用su命令。该文件的源码在/system/extras/su/目录下,其中有这样一段代码:
[cpp] view plaincopyprint?
01./* Until we have something better, only root and the shell can use su. */
02.myuid = getuid();
03.if (myuid != AID_ROOT && myuid != AID_SHELL) {
04. fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
05. return 1;
06.}
从这个 if 我们能够看到它对不是root和shell的用户进行了排除(android中每个普通应用程序所属的用户id应该都是临时用户?)。所以我们只要用我们修改后的su文件将系统中的替换即可。修改su时除了修改它的源代码,它的权限也要进行修改——需要设置上SUID和GUID位(这两位有什么作用我这里就不细说了,网上很多资料)。
但是,/system/bin/这个目录的权限是644,用户和用户组均是root,所以你也不可能直接删除修改su文件,而是需要获得root权限才能删除修改su,这就形成了死循环了。所以这里root的关键点就是怎样获得root权限来修改su,答案当然就是漏洞了。
也许有人会问了,既然你都已经通过漏洞获得root权限了,为什么还要通过修改su来获得root权限呢,这不多此一举吗?因为这里的漏洞有点特殊:这次我们讲RageAgainstTheCage这个漏洞,它只是临时的一次性的获取root权限,当你手机重启后就还原了,更重要的是,它需要手机通过USB连接电脑时才能获得root权限,这让我们平时需要root需要使用手机带来了不方便,总不可能每次需要root的时候都去连接电脑执行一次漏洞程序吧。所以我们的策略是使用那个“不方便的一次性的root”来修改su使得我们能够获得“永久root的权限”。
下面我们来看RageAgainstTheCage这个漏洞的原理。
既然是漏洞,那么是哪里的漏洞呢?难道是linux内核漏洞?那是不可能的,如果真是linux内核漏洞,那么世界早就乱套了。既然Android是基于linux的系统,那么肯定是android自己的问题了。
Android系统有一个服务程序:adb(Android Debug Bridge),我们这里利用到的漏洞就是adb程序的一个漏洞。adb是一个“客户端-服务器端 ”程序,其中客户端是你用来操作的电脑,服务器端是android设备;adb也是android sdk里的一个工具,用于连接、调试、管理android设备。一般来说当手机通过usb连接到电脑后(当然,还得需要该手机的驱动才行),系统会自动启动手机端的adb程序,这样我们在电脑上的命令行里输入命令就能连接控制手机了,例如我们在开发程序时在命令行里输入的”adb devices“、”adb install ***“、”adb shell“等。adb程序就是为这个功能提供服务支持。其中adb shell很有用,它为我们提供了一个登陆手机的shell,可惜它也没有权限使用su命令(虽然它是shell权限,通过了上面代码中的 if 条件判断,但是后面还有其他验证,看来普通shell也是不能使用su的啊,还是 root 靠谱)。
明白了adb是个什么东西后,我们再来看看adb的源代码,分析其中到底哪里有漏洞。adb的源代码在/system/core/adb/adb.c,简要如下:
[cpp] view plaincopyprint?
01.int adb_main(int is_daemon)
02.{
03. ......
04. property_get("ro.secure", value, "");
05. if (strcmp(value, "1") == 0) {
06. secure = 1;
07. ......
08. }
09. if (secure) {
10. ......
11. setgid(AID_SHELL);
12. setuid(AID_SHELL);
13. ......
14. }
15.}
Adbd服务进程初始是Root权限,因为它要进行一些系统的初始化的工作,这时必须要是root权限才行。初始化完成后它会给自己降级为shell,所以我们在使用adb shell时看到的权限是shell,而不是root。降级的关键代码是setgid()和setuid()这两个函数,而漏洞就出在这里。
试想一下,若是降级失败会怎样?很明显,若是降级失败,函数setgid()和setuid()都返回非0值,但是,程序并没有检查它的返回值,也就是并没有判断它是否降级成功,这就给了我们可乘之机。若是降级失败,程序继续运行,并没有任何出错的地方,唯一的不同就是这个服务程序依然是root权限,而当我们使用adb shell得到它返回给我们使用的shell窗口时,我们得到的也就是root权限的shell。
为什么?因为它使用fork()函数来产生子进程(这个子进程就是我们得到的shell),而在linux中子进程将继承父进程的权限,所以我们得到的shell就是具有root权限,显然,此时我们就能很方便地删除修改su文件了。
那么,其中的关键点就是:怎么让它降级失败,也就是setgid()和setuid()函数执行失败。在此之前我们来补充一个知识点。
linux系统中,任何一个用户他所能拥有的进程数量是有限的,这个上限为RLIMIT_NPROC(我电脑上这个值大概是6万多),平时大家都很少接触这个东西,因为正常作业时我们每个用户所拥有的进程数量基本不会超过它。一旦达到这个上限,那么系统就不会再为此用户添加新的进程。
结合之前的分析,我们就可以利用这一点使得adb服务降权失败:当adb服务在执行setuid和setgid之前,我们让shell用户的进程数量达到上限,那么当它使用setuid来降权时,就会因为shell用户的进程数量满了而失败,使得adb继续保持root权限。
网上对于RageAgainstTheCage源码的分析也有不少,我这里就不详述了,只是画一些图方便大家理解,
流程图:
时序图:
最后,如果要封堵这个漏洞也非常简单,只需对那两个函数的返回值加以判断即可:
[cpp] view plaincopyprint?
01.int adb_main(int is_daemon)
02.{
03. ......
04. property_get("ro.secure", value, "");
05. if (strcmp(value, "1") == 0) {
06. secure = 1;
07. ......
08. }
09. if (secure) {
10. ......
11. if(setgid(AID_SHELL) != 0){
12. exit(1);
13. };
14. if(setuid(AID_SHELL) != 0){
15. exit(1);
16. };
17. ......
18. }
19. }
- 大小: 110.5 KB
- 大小: 68.3 KB
分享到:
相关推荐
### Android Root提权原理深度解析 #### Root概念与重要性 在探讨Android Root提权的原理之前,我们首先需要理解“Root”这一概念及其在Android生态中的地位。“Root”源自Unix/Linux系统,代表着系统中拥有最高...
1. **部署rageagainstthecage**: 这是一个针对特定Android设备的本地root漏洞利用程序。SuperOneClick首先将rageagainstthecage文件推送到手机的/data/local/tmp目录下,因为该目录具有较高的执行权限。接着,使用...
1. **Root概念**:Root权限源自Linux系统,是系统中的顶级权限,拥有者可以修改系统文件、控制硬件、卸载预装应用等。但同时,这也会带来安全风险,因为恶意应用也可能获取这些权限。 2. **ADB(Android Debug ...
通常所说的Android越狱,实际上是指获得Android设备的最高管理员权限(root权限),这与iOS系统的越狱概念类似。通过获得root权限,用户可以完全控制他们的Android设备,包括但不限于卸载预装应用、安装非官方系统更新...
5. **Root过程**:Root过程中可能会用到rageagainstthecage,这是一个常见的临时Root方法,通过利用系统的安全漏洞来获取Root权限。之后,脚本可能还会安装或更新su二进制文件,这是Root权限的核心,使得非系统应用...
电脑端用SuperOneClick 2.1 获取手机Root权限 首先说明一点,如果在xp系统必须安装NET.framework,在这个构架下superoneclick才能连接手机。win7的话没有这个问题 ROOT机步骤: 1.点开 设置---应用程序---开发 ...
5. **rageagainstthecage**:这是一个利用安全漏洞实现ROOT的工具,有时会在设备特定的ROOT方法失效时作为备选方案。 6. **psneuter**:这可能是防止进程自我保护的工具,确保ROOT过程中不受干扰。 7. **AdbWinApi...
【SuperOneClickv1.6.5】:这个软件标题提到的是SuperOneClick的一个特定版本——1.6.5,这是一款专为Android系统设计的工具,它的主要功能是帮助用户快速并简单地获取设备的ROOT权限。在Android系统中,ROOT权限...
1. `Defy_Get_BL.apk`:这可能是一个Android应用程序,用于在设备上运行实际的Bootloader等级检测。用户通常需要安装此应用来获取Bootloader的信息。 2. `DefyBL`:可能是一个与Motorola Defy Bootloader相关的工具...