详解Android系统中的root权限获得原理
前言
一直很好奇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文件的权限,如下图所示:
这个文件的权限比较特殊,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学习笔记之AndroidManifest.xml文件解析(详解)
- 在AndroidManifest.xml中uses-sdk内属性意思
- 深入AndroidManifest.xml文件解析详解
- AndroidManifest.xml配置文件解析
- Android 6.0权限申请详解及权限资料整理
- Android 程序申请权限注意事项
- Android 权限(permission)整理
- Android获取设备隐私 忽略6.0权限管理
- Android 读取Properties配置文件的小例子
- Ubuntu下android adb环境变量配置方法
- Android获取手机配置信息具体实现代码
- AndroidManifest.xml uses-feature功能详解
相关文章
Java使用PreparedStatement接口及ResultSet结果集的方法示例
这篇文章主要介绍了Java使用PreparedStatement接口及ResultSet结果集的方法,结合实例形式分析了PreparedStatement接口及ResultSet结果集的相关使用方法与操作注意事项,需要的朋友可以参考下2018-07-07SpringCloud Tencent 全套解决方案源码分析
Spring Cloud Tencent实现Spring Cloud标准微服务SPI,开发者可以基于Spring Cloud Tencent开发Spring Cloud微服务架构应用,Spring Cloud Tencent 的核心依托腾讯开源的一站式服务发现与治理平台 Polarismesh,实现各种分布式微服务场景,感兴趣的朋友一起看看吧2022-07-07SpringBoot 整合Mybatis-Plus并输出SQL日志示例详解
这篇文章主要介绍了SpringBoot整合Mybatis-Plus并输出SQL日志,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-06-06Java中 equals 重写时为什么一定也要重写 hashCode
这篇文章主要介绍了Java中 equals 重写时为什么一定也要重写 hashCode,equals 方法和 hashCode 方法是 Object 类中的两个基础方法,它们共同协作来判断两个对象是否相等,所以之间到底有什么联系呢,接下来和小编一起进入文章学习该内容吧2022-05-05
最新评论