2023年7月26日发(作者:)
Android操作系统获取Root权限原理详细解析许多机友新购来的Android机器没有破解过Root权限,⽆法使⽤⼀些需要⾼权限的软件,以及进⾏⼀些⾼权限的操作,其实破解⼿机Root权限是⽐较简单及安全的,破解Root权限的原理就是在⼿机的/system/bin/或/system/xbin/⽬录下放置⼀个可执⾏⽂件“su”,这是⼀个⼆进制⽂件,相当于电脑上的exe⽂件,仅仅在系统中置⼊这个“su”⽂件是不会给⼿机的软件或硬件造成任何故障。下⾯的代码是android系统原版的su中的部分代码,可以看出只允许getuid()为AID_ROOT和AID_SHELL的进程可以使⽤su进⾏登陆。复制代码 代码如下:/* Until we have something better, only root and the shell can use su. */myuid = getuid();if (myuid != AID_ROOT && myuid != AID_SHELL) {fprintf(stderr,"su: uid %d not allowed to sun", myuid);return 1;}⾯在Superuser这个android程序中的su不再有上⾯的⼀部分,这样任何进程都可以使⽤su进⾏登陆了,有⼀部分android程序要使⽤root权限可能的⽤法类似于(这个也是Superuser中的⼀部分代码):复制代码 代码如下:Process process = time().exec("su");DataOutputStream os = new DataOutputStream(putStream());ytes("mount -oremount,rw /dev/block/mtdblock3 /systemn");ytes("busybox cp /data/data/ser/su /system/bin/sun");ytes("busybox chown 0:0 /system/bin/sun");ytes("chmod 4755 /system/bin/sun");ytes("exitn");();⽽在上⾯提到的Superuser和android程序中的su源码中都有这部分代码:复制代码 代码如下:if(setgid(gid) || setuid(uid)) {fprintf(stderr,"su: permission deniedn");return 1;}看上去这⾥就是进⾏权限切换的地⽅了。⾯普通⽤户要能使⽤su,su的权限要是这样:-rwsr-xr-x. 1 root root 34904 11⽉ 3 2010 /bin/su这个和电脑版的su上是⼀样的。从出上⾯的分析可以认为破解android的root权限的实质是:在系统中加⼊⼀个任何⽤户都可能⽤于登陆的su命令。当然这⾸先要取得root权限才能做到。在z4root这个android下的破解android的root权限的程序中有⼀个rageagainstthecage,可能就是设法得到root权限的程序。第⼆篇⽂章:如果你进⾏过程序开发,在root过的⼿机上⾯获得root权限的代码如下:复制代码 代码如下:Process process = time().exec("su");DataOutputStream os = new DataOutputStream(putStream());......ytes("exitn");();从上⾯代码我们可以看到⾸先要运⾏su程序,其实root的秘密都在su程序中,《android root权限破解分析》中讲到Android系统默认的su程序只能root和shell可以⽤运⾏su,这个是安全的。如果把这个限制拿掉,就是root破解了!下⾯我们仔细分析⼀下程序是怎样获得root权限的,如果对Linux的su命令熟悉的朋友可能知道su程序都设置SUID位,我们查看⼀下我的⼿机(已经root破解)上的su权限设置,我们发现su的所有者和所有组都是root,是其实是busybox的软链接,我们查看busybox的属性发现,其设置了SUID和SGID,并且所有者和所有组都是root。SUID和SGID的作⽤是什么呢?如果你不太清楚,请参考《Linux进程的实际⽤户ID和有效⽤户ID》,这样运⾏busybox的普通⽤户,busybox运⾏过程中获得的是root的有效⽤户。su程序则是把⾃⼰启动⼀个新的程序,并把⾃⼰权限提升⾄root(我们前⾯提到su其实就是busybox,运⾏期它的权限是root,当然也有权限来提升⾃⼰的权限)。再强调⼀下不光root⼿机上su需要设置SUID,所有的Linux系统上的su程序都需要设置SUID位。请参考⼀下UC服务器的su的权限情况:我们发现su也设置了SUID位,这样普通⽤户也可以运⾏su程序,su程序会验证root密码,如果正确su程序可以把⽤户权限提⾼的root(因为其设置SUID位,运⾏期是root权限,这样其有权限提升⾃⼰的权限)。这样我们就可以看出其实Android系统的破解的根本原理就是替换掉系统中的su程序,因为系统中的默认su程序需要验证实际⽤户权限(只有root和 shell⽤户才有权运⾏系统默认的su程序,其他⽤户运⾏都会返回错误)。⽽破解后的su将不检查实际⽤户权限,这样普通的⽤户也将可以运⾏su程序, 也可以通过su程序将⾃⼰的权限提升。到这⾥⼤家对root破解不感到神秘了吧。root破解没有利⽤什么Linux内核漏洞(Linux内核不可能有这么⼤的漏洞存在),可以理解成root 破解就是在你系统中植⼊“⽊马su”,说它是“⽊马”⼀点⼉都不为过,假如恶意程序在系统中运⾏也可以通过su来提升⾃⼰的权限的这样的结果将会是灾难性 的。所以⼀般情况下root过⼿机都会有⼀个SuperUser应⽤程序来让⽤户管理允许谁获得root权限,也算是给系统加了⼀层保险吧!通过上⽂《Android系统root破解原理分析》 的介绍⼤家应该明⽩了root破解过程的终极⽬标是替换掉系统中的su程序。但是要想替换掉系统中su程序本⾝就是需要root权限的,怎样在root破 解过程中获得root权限,成为我们研究的重点了。下⾯我们先清点⼀下我们需要破解系统情况,假设需要破解的Android系统具备如下条件:复制代码 代码如下:1、可以通过adb连接到设备,⼀般意味着驱动程序已经安装。
2、但是adb获得⽤户权限是shell⽤户,⽽不是root。要想理解root破解过程我们⾸先需要了解⼀下adb⼯具,SDK中包含adb⼯具,设备端有adbd服务程序后台 运⾏,为开发机的adb程序提供服务,adbd的权限,决定了adb的权限。具体⽤户可查看/system/core/adb下的源码,查看 你将会发现adb和adbd其实是⼀份代码,然后通过宏来编译。查看adb.c的adb_main函数你将会发现adbd中有如下代码:复制代码 代码如下:int adb_main(int is_daemon){ ...... property_get("", value, ""); if (strcmp(value, "1") == 0) { // don't run as root if secure = 1; ...... } if (secure) { ......从中我们可以看到adbd会检测系统的属性,如果该属性为1则将会把⾃⼰的⽤户权限降级成shell⽤户。⼀般设备出⼚的时候在/⽂件中都会有:复制代码 代码如下:=1这样将会使adbd启动的时候⾃动降级成shell⽤户。然后我们再介绍⼀下adbd在什么时候启动的呢?答案是在中配置的系统服务,由init进程启动。我们查看中有如下内容:复制代码 代码如下:# adbd is controlled by the system propertyservice adbd /sbin/adbd disabled对Android属性系统少有了解的朋友将会知道,在中配置的系统服务启动的时候都是root权限(因为init进⾏是root权限,其⼦程序也是root)。由此我们可以知道在adbd程序在执⾏:复制代码 代码如下:/* then switch user and group to "shell" */setgid(AID_SHELL);setuid(AID_SHELL);代码之前都是root权限,只有执⾏这两句之后才变成shell权限的。这样我们就可以引出root破解过程中获得root权限的⽅法了,那就是让以上⾯setgid和setuid函数执⾏失败,也就是降级失败,那就继续在root权限下⾯运⾏了。这其实利⽤了⼀个RageAgainstTheCage漏洞,具体分析请参考《Android adb setuid提权漏洞的分析》和《RageAgainstTheCage》。这⾥⾯做⼀个简单说明:复制代码 代码如下:1、出⼚设置的属性为1,则adbd也将运⾏在shell⽤户权限下;2、adb⼯具创建的进程ratc也运⾏在shell⽤户权限下;3、ratc⼀直创建⼦进程(ratc创建的⼦程序也 将会运⾏在shell⽤户权限下),紧接着⼦程序退出,形成僵⼫进程,占⽤shell⽤户的进程资源,直到到达shell⽤户的进程数为 RLIMIT_NPROC的时候(包括adbd、ratc及其⼦程序),这是ratc将会创建⼦进程失败。这时候杀掉adbd,adbd进程因为是 Android系统服务,将会被Android系统⾃动重启,这时候ratc也在竞争产⽣⼦程序。在adbd程序执⾏上⾯setgid和setuid之 前,ratc已经创建了⼀个新的⼦进程,那么shell⽤户的进程限额已经达到,则adbd进程执⾏setgid和setuid将会失败。根据代码我们发 现失败之后adbd将会继续执⾏。这样adbd进程将会运⾏在root权限下⾯了。3、这是重新⽤adb连接设备,则adb将会运⾏在root权限下⾯了。通过上⾯的介绍我们发现利⽤RageAgainstTheCage漏洞,可以使adbd获得root权限,也就是adb获得了root权限。拿到root权限剩下的问题就好办了,复制破解之后的su程序到系统中(见上⽂《Android系统root破解原理分析》的介绍),都是没有什么技术含量的事情了。其实堵住adbd的这个漏洞其实也挺简单的:复制代码 代码如下:/* then switch user and group to "shell" */if (setgid(AID_SHELL) != 0) { exit(1);}if (setuid(AID_SHELL) != 0) { exit(1);}如果发现setgid和setuid函数执⾏失败,则adbd进程异常退出,就把这个漏洞给堵上了。为什么这么多设 备都没有堵上这个漏洞呢?我觉得是设备⼚商的策略(不排除傻X的⼚商存在哦),虽然知道怎么封堵漏洞但是就是留着个后门给⼤家,让第三⽅给⾃⼰定制 rom,提⾼⾃⼰系统的易⽤性。⾄此我们把root的过程和root之后系统情况都进⾏了介绍,相信你也不会对root破解再神秘了吧!
发布者:admin,转转请注明出处:http://www.yc00.com/web/1690317053a331651.html
评论列表(0条)