关于root

1、root优缺

  android的root跟苹果越狱很类似,可以享受“解禁”后的很多自由。

  1、删除系统中不需要的一些app,特别是一些厂商强制安装的app。

  2、美化系统,例如修改字体,修改开关机音乐、动画等;

  3、可以更细致的优化系统,例如屏蔽掉一些自动运行的app;

  当然,android root后带来的肯定远不止这些好处。但root后毫无约束的自由就会产生很多不可控的问题,例如流氓软件可以很轻易的植入广告、病毒、修改系统文件,并且root并非官方支持的行为,root后会影响保修。

2、root原理

  android的系统管理员为root,该用户可以在系统最高许可范围内进行任何操作(并不是所有操作root都有权执行)。而root android手机的过程也就是获取root用户的权限,同时为了防止不良软件随意利用root权限,我们需要给系统安装一个Superuser.apk的应用,当有应用需要通过su获取root权限时,Superuser会拦截该动作并向用户做出询问,当用户允许才执行。所以root的过程简单来说就是将su文件放到/system/bin下,将Superuser.apk放到/system/app下,还需要设置/system/bin/su能让任意用户执行,需要set uid,即需要设置adb shell chmod 4755 /system/bin/su。但由于厂商并不支持该行为,所以一般会有诸多限制让我们很难顺利完成root提限,需要合理的利用系统进程的一些漏洞来完成这一操作(一般所谓的“不完全root”就是指通过Superuser来防止未经授权的应用随意获取root权限)。

3、root方法

  1> adb push su /system/bin                                             #复制su到bin目录

  2> chown root:root su                                                        #将su的拥有者以及所属群组设置为root

  3> chmod 4755 /system/bin/su                                   #将su设置为-rwsr-xr-x,使所有用户都可以使用

  4> adb push Superuser.apk /system/app                 #安装Superuser应用,对root权限进行授权使用

  上述步骤看似简单,实际却很难实现。在linux中,如果想获取root权限可以通过执行su切换到root权限,或者通过sudo临时获取root权限,且不管哪一种方式,系统都要求输入正确的root用户密码才能获取相应的root权限。而android本身就不希望用户得到root权限,所以大部分手机出厂的时候根本就没有su这个程序,即使有,一般也都将4755权限设置为了755,使普通用户无法使用。并且android的su和linux里的su还不一样,在android中不是靠密码验证,而是看你原来的权限是什么,如果你是非root用户,就无法切换到root,会提示permission denied,也就是说只有root运行su才有用。而且system目录对于普通用户一般也都是只读,无法写入,同样chmod也需要root权限才能运行。sudo在android中也不支持。

  要想完成上面的root步骤,首先需要root权限,所以只能通过找一个本身已经有root权限,并且存在漏洞的进程来执行上述命令。所以想要root android手机,首先需要找到一些拥有root权限的程序漏洞,再通过该漏洞执行上述root步骤。目前最常用的root工具都是pc客户端程序,通过android系统的adb shell运行漏洞利用程序,也有一些是能直接在android设备上运行。由于漏洞并不具有完全的适用性,不同的方法也只适应一定的机型,所以这里不讨论具体的实现步骤。下面三个链接比较细致的讲解了root的相关知识,需要进一步了解的可以看看。其中讲解了如何利用RageAgainstTheCage漏洞,使adb拿到root权限。

  http://www.cnblogs.com/xiaoxiaoboke/archive/2012/02/13/2349719.html

  http://www.cnblogs.com/xiaoxiaoboke/archive/2012/02/13/2349723.html

  http://www.cnblogs.com/xiaoxiaoboke/archive/2012/02/13/2349711.html

4、关于suid和sgid

  在讲解root步骤时,我们提到一个为su设置set uid,或者说4755权限的步骤。那我们需要了解一下什么是suid,什么是sgid,什么是sbit以及4755的意思。

image

image

  在linux中文件和目录的默认权限通常由上述结构表示,r表示可读,w表示可写,x表示可执行,-表示无权限(当用数字模式时,r为4,w为2,x为1,-为0,而4755的后三位表示默认权限,即对于文件拥有者,有4+2+1=7,即可读可写可执行权限;对于文件所属群组,4+1=5,具有可读可执行权限;而对于其他用户,4+1=5,同样具有可读可执行权限)。而除了这些默认权限外,还有三个特殊权限:suid、sgid、sbit,数字模式时,suid为4,sgid为2,sbit为1,而4755的第一位表示特殊权限,也就是4,所以4755的特殊权限为suid。

  1、suid,控制用户执行的文件,以文件所属用户的身份执行,而不是执行文件的用户本身。当一个可执行的文件拥有suid时,会将文件拥有者的x位变成s,这时称为set uid,简写就是suid。而android root时,就是需要确保su已经suid为root用户,这样其他用户也可以通过root身份来执行su,也就取得了root权限。

  suid权限仅对二进制程序(系统中的一些命令)有效,不能用在脚本上,因为脚本是将很多程序集合到一起来执行,而不是脚本本身在执行;suid放在目录上是无效的;suid权限仅在执行该程序的过程中有效(run-time);程序执行者对于该程序来说,需要具备x的权限。

  2、sgid,对目录的控制是以目录所属群组的身份运行,在目录中创建的任何子目录或文件的所属群组都与目录所属群组一致。

  sgid同样对二进制程序有效;程序执行者对于该程序来说,需要具备x的权限;sgid主要用在目录上。

  3、sbit,主要针对其他用户(others)来设置的,只对目录有效,当用户在该目录下建立文件或目录时,仅有自己与root才有权利删除。例如/tmp目录,任何人都可以在/tmp内增加,修改文件,因为权限都是rwx,但仅有该文件或目录的建立者与root才能够删除自己的目录或文件。

  特殊权限的设置和默认权限一样,使用chmod命令,也同样可采用UGO模式或数字模式,具体如何设置请自行查阅。

5、root在开发中的影响

  在实际开发中,经常会有一些功能由于没有足够的权限而无法实现。例如设置系统时间,静默安装,读取一些系统的配置文件等,要解决这些问题,最常见的就是查找源码中是否存在隐藏的api可以在不需要root权限的情况下通过反射机制实现,否则就只能加入android:sharedUserId=“android.uid.system”属性,通过配置和系统进程中运行的apk一样的userid,这样就可以使apk运行在系统进程中,也就拥有了相应权限。由于采用uid方式需要目标系统的platform key,所以生成的apk只能安装在目标系统中。

参考资源

http://www.opsers.org/base/learning-linux-the-day-that-the-special-privileges-suid-sgid-sbit.html

原文地址:https://www.cnblogs.com/endure/p/3545562.html