详解Android系统中的root权限获得原理

作者:zinss26914 时间:2023-06-19 20:28:25 

前言
一直很好奇Android Root的原理,恰好最近碰到了一个跟Android默认带Root权限的问题,这里顺便记录一下Android系统root的原理。

原理
Android是基于Llinux内核的开源操作系统,与Ubuntu系统类似,所以在Android里获取root权限其实和在Linux系统下获取root权限是一回事。在Linux系统下获取root权限的方法是在命令行执行sudo或者su,接下来输入提权密码就可以获取root权限了。Android系统其实也是这样,例如应用层程序开发,在root过的手机上运行root权限的代码如下所示:


 Process process = Runtime.getRuntime().exec("su");
 DataOutputStream os = new DataOutputStream(process.getOutputStream());
 ......
 os.writeBytes("HelloWorld!\n");
 os.flush();

我们可以看到,Android应用程序获取root权限也是需要执行su命令,因此Android能够root的密码都在su程序上。但是,Android本身是不想让你获取root权限的,因此大部分手机出厂都是user版本,默认是不带su这个二进制程序的。所以你想获取Android的root权限,第一步就是要把编译好的su文件拷贝到Android手机的/system/bin或/system/xbin目录下(为什么要拷贝到/system目录下,是因为这个分区是没有nosuid限制的,同时/system/bin和/system/xbin又都是系统环境变量PATH里的路径,可以直接执行su)。我们先假设你可以把编译好的su程序放在xbin或者bin目录下,接下来你可以在Android手机的adb shell或者串口下输入su提权了。
Linux命令行下输入su之后,是需要输入root密码才能够提权的,但是Android里的su和Linux里的su是不一样的,Android里的su是不靠验证密码的,而且需要验证你之前的权限是什么。意思是,如果你是root用户,那你可以通过su切换到别的用户,比如shell、wifi、audio等。但是如果你是root之外的其他用户,就不能切换到root了,会提示你permission denied。也就是说,用root运行su才有用,但是这个时候我没还有root权限怎么办?这就是接下来要讨论的问题。
我们在Ubuntu下查看/usr/bin/passwd文件的权限,如下图所示:

详解Android系统中的root权限获得原理

这个文件的权限比较特殊,Linux用户一般都知道文件分为r、w、x权限,那这个s是神马意思呢?这里回答一下,s代表当任何一个用户执行该文件的时候都拥有文件所有者的权限,这文件所有者是root。简单来说,就是不管谁执行这个文件,他执行的时候都是以root身份来执行的。
看到这里,大家是不是都有思路了,也就是说,即使我不是root用户也可能以root用户的身份来执行程序,那么我把一个所有者是root的su程序权限标志位设置为-rwsr-xr-x,那么不管是谁执行它,都是以root身份执行。这就牛逼了,su果断可以执行成功,那你也就可以顺利的获取root权限了。

破解
原理都清楚了,那root的过程其实就是分两步:
1. 把一个所有者是root的su拷贝到Android手机上。
2. 把su的权限标志位设置成-rwsr-xr-x。
写成代码大概如下所示:


 cp /sdcard/su /system/xbin/
 chown root:root /system/xbin/su
 chmod 4755 /system/xbin/su

代码看起来很简单,但是想真正的运行成功,以上代码每一句都需要root权限执行。我擦,一下回到解放前,跟先有鸡还是先有蛋的问题类似,代码运行需要root权限,而代码本身的目的就是获取root权限,成了一个封闭的死循环了。但是所幸Android系统有Bug,因此就给了你打破这个死循环的机会。
打破的方法就是找一个本身已经有root权限的进程来运行这个3行的shell脚本,这样脚本就可以顺利执行了。但是已经有root权限的进程都是出厂时候就装到手机上的,代码写死了,你没法控制它执行自己的代码啊,这个时候就需要查找漏洞了。例如Android2.3 root权限的zergRush漏洞就是利用一个拥有root权限的进程栈溢出漏洞。具体利用漏洞的方法大家就可以自行google了。

防止root
通过上述分析,我们可以简单的理解,解决Android系统能够su提权的方法就是把su文件干掉就可以了。

标签:Android,root
0
投稿

猜你喜欢

  • Android Build类的详解及简单实例

    2023-07-02 21:12:45
  • Java的Hibernate框架中Criteria查询使用的实例讲解

    2023-08-22 23:25:47
  • 实例分析Android中HandlerThread线程用法

    2022-05-25 23:34:13
  • Java如何实现单链表的增删改查

    2021-09-19 09:49:25
  • 浅谈Java之Map 按值排序 (Map sort by value)

    2021-06-20 01:23:10
  • 探讨Object转为String的几种简易形式详解

    2023-08-21 11:47:27
  • Spring Boot 在启动时进行配置文件加解密的方法详解

    2023-11-12 17:13:54
  • Android 全屏无标题栏的三种实现方法

    2022-01-05 03:01:31
  • Java多线程模拟银行系统存钱问题详解

    2023-11-28 22:13:32
  • Spring Security角色继承分析

    2022-02-03 03:39:12
  • 详解Spring Bean的集合注入和自动装配

    2023-02-18 15:02:58
  • spring cloud gateway请求跨域问题解决方案

    2021-11-05 11:19:25
  • Java Socket实现传输压缩对象的方法示例

    2022-12-18 06:52:30
  • java实现科学计算器的全过程与代码

    2022-04-09 07:49:52
  • Java 数据结构与算法系列精讲之哈希算法实现

    2022-01-10 23:56:07
  • JAVA实现基于Tcp协议的简单Socket通信实例

    2022-07-07 21:44:36
  • C++中string字符串分割函数split()的4种实现方法

    2023-02-05 23:28:48
  • JVM的基本介绍以及垃圾回收

    2023-12-20 02:59:51
  • Java 数据结构与算法系列精讲之贪心算法

    2023-09-12 17:56:13
  • MyBatis-Plus 如何单元测试的实现

    2022-03-02 19:45:08
  • asp之家 软件编程 m.aspxhome.com