Android 的提权 (root) 原理是什么?修改

赞同 7 反对,不会显示你的姓名

倪大为,待失业

何若昕(@little_cup)、栗明辉、zhou markx  等人赞同
大体上分为两种:
1.使用系统漏洞,设法获取一个root权限的进程。譬如一个经典的,使用adbd的启动过程中的不恰当实现,创建大量进程填充,最后得到一个root权限的adbd,最后用这个最高权限的adbd运行用户自己的脚本。再譬如,对vold进程的几个漏洞,都是通过溢出实现“用root权限运行脚本”这件事的。得到一个可控制的root权限进程后,就可以把需要的可执行命令设置好相应的权限,然后放进系统里,也就是root成功了。
2.刷入一个修改过的固件,这个固件本身就已经把需要提权的文件设定好相应的权限了。
第一种方法的前提是存在漏洞,并且发现利用的方法。
第二种方法的前提是,设备允许你刷入修改过的固件。
因此,有不少设备事实上(暂时)无法root。
2013-05-18  1 条评论             
赞同 6 反对,不会显示你的姓名

陈波,我亦无他唯手熟尔。

栗明辉、洪小亮、黄志琴  等人赞同
(题外话)之前用知乎的手机客户端回复了一下,但是我发现好像没有回复成功,估计那个也是知乎手机客户端的一个bug了。
有必要先解释一下:
linux是什么? linux是一种操作系统,多用于服务器,我们常见的是windows操作系统,例如xp,win7等之类的。
超级用户(超级管理员):在windows下面,你肯定会发现一个叫做administrator的管理员,那个就是超级管理员,什么意思呢,通俗的说,就是这个用户可以做任何事情。例如:它可以限制你不能访问某些文件或者应用程序等。那么,在Linux下面其实也有一个超级用户,它呢,就是root用户。
android其实是基于linux的一个操作系统,只是被用到了移动设备上面了,如果你想在pc上面安装android系统,理论上是完全可行的。
现在其实才牵涉到了android root的原理,root其实就是获取android系统的root权限。至于原理:手机制造商原始出厂的手机并未开放root权限,获取root的方法都是不受官方支持的,因此,目前获取root的方法都是利用系统漏洞实现的。而不同手机厂商可能存在的漏洞不同,也就导致了不同手机root的原理可能不同。不过,不管采用什么原理实现root,最终都需要将su可执行文件复制到Android系统的/system分区下(例如:/system/xbin/su) 并用chmod命令为其设置可执行权限和setuid权限。为了让用户可以控制root权限的使用,防止其被未经授权的应用所调用,通常还有一个Android应用程序来管理su程序的行为。root的基本原理就是利用系统漏洞,将su和对应的Android管理应用复制到/system分区。(这个是我复制的维基百科的,如果你懂一点儿linux,那么这个过程就很好理解,如果不懂呢,那么你可以忽略掉。)
至于root的步骤,这个各个手机的步骤都不同。所以你可以去你相应手机的论坛里看看,就可以了。
2013-05-18  添加评论             
赞同 1 反对,不会显示你的姓名

Thonatos Yang,技术宅改变世界。

刘凡 赞同
一句话解释:添加拥有最高权限的su binary文件用于进行最高权限操作。
2013-05-19  3 条评论             
赞同 1 反对,不会显示你的姓名

droider An,Android Developer

夜露 赞同
Android 的提权 (root) 原理是什么?  @Kevin 更多提到ROOT管理背后的原理,这就是Android和Linux中的SID的用途,这是所有类UNIX通用的申请处理高权限方式。

其实在我的理解中应该是两个:
1,提权
2,ROOT

对于 1,提权 是利用系统的漏洞,获得原本获取不了的权限,提升本应用的权限。
已知的漏洞:
1.a:之前提到的利用adbd的漏洞,在2.X时代有效。这个利用的过程还是比较复杂,时间也比较长;
1.b:三星CPU的漏洞,比如在Galaxy系上可以利用这个漏洞来ROOT,这个漏洞就比较好利用了,之接在APK代码里就可以利用。在我的Galaxy Note上用过。
提权不一定是对于主系统(Android系统),还有些是针对辅助系统(BOOTLOADER和RECOVERY)。
1.c:三星系的手机可以利用一个BOOTLOADER的漏洞(我不太清楚是不是漏洞,但是三星本身没有官方解锁工具这一说的,难道是官方提供的?),可以任意的刷包,这样我们就可以利用这个途径来修改SYSTEM分区了,都有权限修改SYSTEM分区了,往上放个文件还不是分分钟的事。官方解锁的就是提供方式,允许用户刷入自定义的文件。
1.d:OPhone系统的老版本(2.0、2.5)中(不知道还有没有人用这个系统)的RECOVERY存在一个关于路径的处理的漏洞。它有一个自己定义的upk升级包,只能处理 /system/carrier下的文件,但在路径处理上估计是文本比较,你可以通过 /system/carrier/../app这种方式来绕过它的管理系统,来修改/system/app下的文件。
一般情况下主系统的漏洞对用户的危害最大,因为它使一个普通权限的应用可以访问到本没有权限访问的资源。对于三星CPU漏洞,如果一个应用利用它提高自己的权限,直接访问短信的数据库文件,而不是通过Android提供的Provider,系统就没有使用沙盒检查的机会,而且用户也不知道它们做了什么,你从它的权限申请列表上也看不到它会读取短信。
对于辅助系统的漏洞,一个普通的应用就没有办法了,因为平时辅助系统是不启动的。但也并不是没有利用的可能。

对于 2,ROOT 在我理解就是安装ROOT管理工具,对于Linux的发行版本来说,本身提供了ROOT管理工具su还有sudo。但是对于Android来说本身没有提供ROOT管理工具,所以我们需要利用提权的这个过程在系统中插入ROOT管理工具,以方便我们使用更高的权限。因为毕竟提权这个过程一般来说不是很容易实现的。比如我们提到的BOOTLOADER或RECOVERY的漏洞,是没有办法在主系统中使用的,所以需要安装ROOT管理工具以在主系统中使用。
ROOT之后因为可以修改系统,所以我们也有机会修复已知的漏洞,比如上面提到的三星CPU的漏洞。

以下由于本身半桶水水平,可能不正确,请轻拍:
对于ROOT本身来说不会降低系统安全性,除非ROOT管理器本身又有漏洞。所以通过官方解锁的方式,使用 安全的RECOVERY和 安全的ROOT管理器,与官方的安全性一致。

但是两个黑色的“ 安全”提醒着我们,市面上鱼龙混杂的ROOT工具并不是都安全的,所以使用时一定选用大家认可的,安全的方式。例如说我们平时用的SuperU.apk和与其相配的su应用,在应用层申请ROOT权限时,都会提示用户许可。但是针对一些黑色的ROOT的管理工具,它如果留下后门,对于一些特定的请求不提示直接同意,而且不记录日志的话,这样就像在自己的设备中下了一个定时炸弹一样。
2013-08-10  2 条评论             
赞同 1 反对,不会显示你的姓名

chinaxing,流浪/远方

盛杲 赞同
根本的问题在于获取root权限,然后执行什么都是次要的了。

至于答案中提到的su啊sudo啊,之类的都是获取了root权限后的事情,不是问题的根本。

获取root权限不是你按照常规的在命令行执行一些命令或者运行一个程序就可以得到的。因为这些都是在linux的既定规则内玩,怎末可能破坏其规则?

所以只有一条路:非正常路径,比如:找到bug和漏洞,让规则破坏,从而获得提权。或者在系统之外进行操作,比如系统还没启动就操作其磁盘上的文件系统,让某些你安排的程序发生规则外的特性。这时候由于系统还没启动,任你摆布(他睡着完全没有知觉和抵抗以及运行规则的能力)所以你可以换掉系统(涮rom把自己改过的系统刷上去)不过如果硬件上不允许那么此路不通。


所以无论安卓、ios还是pc系统的linux,windows等都是一样的。必须找到漏洞或走非常规路线才能取得特权。


而取得特权对于系统安全是十分严重的事情,即如果普通用户很容易获取到特权,那将是严重性的安全灾难。
你想想如果运行于企业服务器集群上的linux如果某个版本发现提权漏洞,那被黑客黑掉拿到数据的风险后果非常严重。
2013-10-04  添加评论             
赞同 1 反对,不会显示你的姓名

赵冬毓,干的是码农的活儿,长了个工程师的脑子

j jacky 赞同
上面这么多用Linux解释的。其实Android上用的Linux内核是一个裁剪过的嵌入式Linux,取得Root的方法没有其他人说的那么复杂,只要修改内核二进制文件的两个字节,外加在Android权限配置XML(主要是为了向App暴露Root权限申请接口)里面加两个配置文件就好了。
2013-11-26  6 条评论             
赞同 0 反对,不会显示你的姓名

吴利文,CG模型师,葡萄酒爱好者,学习烈酒中

@Kevin 的答案有问题,看来他并不知道root的原理
先引用他的两段话:
大概意思就是两行代码
cp /data/tmp/su /system/bin/ #copy su 到/system/分区
chmod 1775 /system/bin/su #把su置成-rwsr-xr-x
那怎么搞定这个事情呢?Android的system分区本身不可写,只有是root的权限才能改动它,执行不了啊。

获得root的时候是这么写的:
Process p = Runtime.getRuntime().exec("su");

也就是它们在代码里调用了一下su这个程序,哪可以写成下面这个样子吗?
Process p = Runtime.getRuntime().exec("./data/tmp/su");

先看第一段,理解没有错误的话他是想说,只要system有了写入的权限,就可以执行这两行代码,进而获取root权限。既然Android的system分区不可写,那干脆不写system,等获取root权限再写入system就行了,第一条命令需要system可写入,命令一只是拷贝,其本身没有实质性意义。第二条命令把su设置成-rwsr-x-rx也其实只完成了一半——

su还需要所有者(Owner)是root才能正确的给其他程序赋予root权限。linux系统中,当前用户执行的程序,该程序进程的 有效用户ID(Effective UID)就是当前用户,但拥有s(set uid)权限的程序,其进程的有效用户ID是这个程序的所有者。换句话说,有set uid权限的程序,运行之后,就相当于所有者运行了这个程序,如果所有者是root,那这个进程也拥有root权限。 能够正常授权的su,其所有者必须是root,否则不能正常授权。没有root权限的情况下,我们可以通过chmod来设置s权限,但是不能使用chown来修改su的所有者为root(提示Unable to chown su: Operation not permitted)。

所以通过zergRush破解权限的原因是,只有破解到了root权限,才能设置su的所有者是root,才能有可正常使用的su。

再看第二段,就算把代码改成Process p = Runtime.getRuntime().exec("./data/tmp/su");也不能获得root权限。正如我前面所说的,必须先修改su的所有者为root才能获取root权限,所以在破解到root权限之前,无论做什么都不能获得一个有效的su。

现在root流程一般是zergRush破解root权限,然后用root权限启动adbd,电脑端用adb登陆之后直接就拥有了root权限,然后设置su权限和所有者,重挂载system使system可写入,然后拷贝su到/system/xbin/并安装SuperSu,重启手机。这个过程还可以变成 安装SuperSu,破解root权限,设置su的权限和所有者,重启手机,执行su,重挂载system,拷贝su自身到/system/xbin。看到了吗,获取root权限跟system不可写没有关系,重挂载system并拷贝su到xbin只是为了让应用程序更容易调用su罢了

PS: chmod 1775 /system/bin/su #把su置成-rwsr-xr-x 
这个chmod的权限应该是4755才对吧?1755对应的权限是-rwxr-xr-t,连s都没有

PPS:还有一点,Kevin说输入su要密码,安卓连/etc/passwd都没有,哪来的密码
2013-08-10  8 条评论             
赞同 0 反对,不会显示你的姓名

巨芋,写写程序炒炒饭。

作为补充,发一下之前从网上扒来的SU中的部分代码,以此解释Android是通过原有的权限来判断你有没资格执行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 su\n", myuid);
return 1;
}
2013-12-01  添加评论             
赞同 1 反对,不会显示你的姓名

j jacky,探索人生路

陈维舟 赞同
最近也在捣鼓这个问题,想弄明白如何获取最初的root权限。很多命令比如mount,chown都需root权限才能执行的。这些命令能够执行成功,说明已经获取到了临时的root权限了。

拷贝一段root精灵的执行脚本:
#!/system/bin/sh

export PATH=$PATH:/sbin:/system/bin:/system/sbin:/system/xbin:/data/local/tmp
//此句不需要root权限,只是当前shell的path值会改变。 

mount -o suid,remount /dev /dev || busybox mount -o suid,remount /dev /dev  
//此句执行成功的话,是需要root权限的,那么root权限从何来呢??
cat /system/bin/sh > /dev/sh
chown 0.0 /dev/sh
chmod 06755 /dev/sh

#permanent root
mount -o remount,rw /system
if [ -d "/system/xbin/"] 
then
	dd if=/data/local/tmp/busybox of=/system/xbin/busybox
	chown root.root /system/xbin/busybox
	chmod 04755 /system/xbin/busybox
	/system/xbin/busybox --install -s /system/xbin
	/system/xbin/busybox --install -s /system/bin
	rm /system/xbin/su
	rm /system/bin/su
	dd if=/data/local/tmp/su of=/system/xbin/su
	chown root:root /system/xbin/su
	chmod 06755 /system/xbin/su
	ln -s /system/xbin/su /system/bin/su

else
	dd if=/data/local/tmp/busybox of=/system/bin/busybox
	chown root.root /system/xbin/busybox
	chmod 04755 /system/bin/busybox
	/system/bin/busybox --install -s /system/bin
	rm /system/bin/su
	dd if=/data/local/tmp/su of=/system/bin/su
	chown root:root /system/bin/su
	chmod 06755 /system/bin/su

fi

dd if=/data/local/tmp/KingUser.apk of=/system/app/KingUser.apk
chmod 0644 /system/app/KingUser.apk
pm install -r /system/app/KingUser.apk
rm /data/local/tmp/su
rm /data/local/tmp/KingUser.apk
rm /data/local/tmp/busybox
2013-12-15  添加评论             
赞同 0 反对,不会显示你的姓名

FrankLau,喜欢旅行的测试人

DDMS有个工具  Dump View Hierarchy需要用到ROOT权限
然后我找了root包,刷入后,
敲入命令adb shell
shell@android:$
输入su后变为root@generic:#

另建了模拟器,敲入adb shell
直接显示root@generic

想问下,第一种需要输入su才变为root用户
第二种直接是root用户

这两种用户区别在哪里?
2014-02-10  添加评论             
赞同 0 反对,不会显示你的姓名

cool chris

请问如果要解除root 的话是不是把bin里面的su删除就行了?
2014-02-25  添加评论             
赞同 0 反对,不会显示你的姓名

吴仲華,想学得多一点的普通人

sudo -s
2013-05-18  添加评论             
赞同 0 反对,不会显示你的姓名

William King,吾生于黑暗,归于黑暗

和Linux没什么区别,Android不过是架在Linux内核上的虚拟机,root与它关系不大
2013-05-19  添加评论             
赞同 0 反对,不会显示你的姓名

孙典,研究生

在Android里通常是在程序中执行su去获取root权限,而就是在这个su中调用了setUid(0)和setGid(0),大概是,记不清了,通过这两个函数把你进程的uid设为和root一样(root的uid就是0),所以也就是说你自己随便写一个可执行文件,去调用这两个函数就能提权。
而要成功调用这两个函数,需要特殊权限,一般我们可以见到chmod 0777 xxx这样的形式,前面的那个0就是对应的setUid和setGid的权限,可以用chmod 4777 xxx去改。

其实看透了之后原理很简单,一些操作可以在adb shell中实现,试试就知道了~

你可能感兴趣的:(Android 的提权 (root) 原理是什么?修改)