首页 > 其他分享 >Android root 原理

Android root 原理

时间:2022-10-14 10:00:46浏览次数:61  
标签:setUID 文件 用户 su 原理 Android 权限 root

0x00 关于root

linux和类Unix系统的最初设计都是针对多用户的操作系统,对于用户权限的管理很非常严格的,而root用户(超级用户)就是整个系统的唯一管理员,拥有等同于操作系统的所有权限。所以一旦获取到root权限,就可以对整个系统进行访问和修改。而在Android下获取root权限之后就可以自己定制系统,卸载一些预装软件,完全掌控自己的设备。

0x01 setUID

在讨论root的原理之前,有一个非常重要的概念,就是文件的setUID权限。linux下普通的文件权限大家都很清楚,可读,可写,可执行,下图很清楚的一个普通的可执行文件root的权限,r(可读),w(可写),x(可执行)。

Android root 原理_root权限

但是,要考虑一种情况,比如说,一个用户是有权修改自己的密码的,但是记录密码的文件/etc/shadow只有root用户才是可写的,那普通用户如何才能修改自己的密码呢?这一切都要归功于setUID的设置,修改密码时使用的命令passwd对应的二进制程序是/usr/bin/passwd

Android root 原理_linux_02

可以看到passwd的二进制文件的权限位中不仅仅是rwx了,多了一个s权限,而这个s权限就是我们的主角,setUID权限。

由于passwd有setUID权限,所以linux系统可以临时把这个文件的所有者(root)身份角色赋给普通用户,以达到让普通用户可以修改自己密码的目的。

那如何设置setUID权限呢?

平常使用的普通文件权限位是由3、3、3共9位的二进制数字组成 ---|---|---,分别对应文件所有者,文件所有者同一用户组权限和其他用户权限。最开始的名为root的可执行文件的权限为rwxrwxr-x,所对应的二进制位就是111 111 101 ,然后每三位对应421换算成16进制,就是775。而新增的setUID权限是在前面新增了三位,分别表示setGID、setUID、stick bit权限,而我们现在只关心setUID权限。因此加上setUID权限之后,文件的权限应该由4位数字组成,例如之前的root文件加上setUID权限就是4755。而修改密码的passwd文件对应的权限位就是4755。

可以通过一个小例子来直观的感受一下,平常使用的cat命令对应的二进制文件是没有setUID权限的:

Android root 原理_linux_03

可以在普通用户下尝试使用cat去读取/etc/shadow文件的内容:

Android root 原理_linux_04

提示权限不够,再给cat加上setUID权限之后再去读取/etc/shadow的内容:

Android root 原理_linux_05

是可以读出来的,但是/etc/shadow中的内容都经过加密处理。

0x02 Linux 下的root

平常使用的linux发行版,需要切换到root用户时,直接使用su命令,然后输入su用户的密码就可以切换到root用户了。

Android root 原理_root用户_06

Android root 原理_root用户_07

0x03 Android 的root

但是在未root的Android设备上是没有su的二进制文件,直接执行su命令会提示"su not found"。

Android root 原理_root权限_08

再进入已经root过的设备上查看,平常在adb shell中用的命令对应的二进制文件都是在/system/bin目录下,是存在su文件的:

Android root 原理_root用户_09

可以看到这里的su只是一个指向/system/xbin/的一个链接。

Android root 原理_root权限_10

可以看到这里的su是有setUID权限位的。

而要在系统分区 /system/xbin 中添加文件本身就是需要root权限,而且设置su文件的所有者为root用户也是需要root权限的,设置setUID权限同样也需要root权限。

这就进入到了一个死循环当中,要利用su,首先要有root权限。因此这时就需要利用到Android存在的漏洞,Android系统本身存在着很多以root权限运行的原生进程,而这些root进程中如果存在可以利用的漏洞,就可以利用进程的root身份:

  1. 拷贝su文件到/system/xbin系统分区;
  2. 设置su文件所有者为root用户;
  3. 设置su文件的setUID权限,便于自己的进程执行su命令获取root权限。


标签:setUID,文件,用户,su,原理,Android,权限,root
From: https://blog.51cto.com/u_12148962/5755330

相关文章

  • VMware虚拟机安装Android系统(转)
    一、首先我们先要准备好虚拟机和android系统安装包1、VMware下载:https://www.vmware.com/go/getworkstation-win激活码:ZF3R0-FHED2-M80TY-8QYGC-NPKYF2、Android系统下......
  • Flink的异步算子的原理及使用
    1、简介Flink的特点是高吞吐低延迟。但是Flink中的某环节的数据处理逻辑需要和外部系统交互,调用耗时不可控会显著降低集群性能。这时候就可能需要使用异步算子让耗时操作......
  • Vue1的响应式原理笔记
    参考:https://www.bilibili.com/video/BV1G54y1s7xVhttps://juejin.cn/post/6932659815424458760递归向下创建obObject.defineProperty方法,可以自定义get和set一个对象......
  • MYSQL-->InnoDB引擎底层原理
    逻辑存储结构逻辑存储结构图表空间表空间文件在Linux下存放在/var/lib/mysql文件中的xxx.ibd文件就是表空间文件表空间文件用来存储,记录,索引等数据。段段分......
  • VLQ & Base64 VLQ 编码方式的原理及代码实现
    目录VLQBase64VLQVLQVLQ(Variable-lengthquantity)是一种通用的,使用任意位数的二进制来表示一个任意大的数字的一种编码方式。编码实现:**对数字137进行VLQ**编码,以......
  • android开发使用git-tortoisesvn合并代码处理冲突的使用记录
    android开发使用git-tortoisesvn合并代码处理冲突的使用记录工具Androidstudio,Git,tortoisesvn作为Android开发的,androidstudio离不开,使用git管理项目也是离不开的,......
  • elasticsearch 百亿级数据检索案例与原理
    一、前言   数据平台已迭代三个版本,从头开始遇到很多常见的难题,终于有片段时间整理一些已完善的文档,在此分享以供所需朋友的实现参考,少走些弯路,在此篇幅中偏重于ES的......
  • android开发记录一个依赖冲突问题
    Executionfailedfortask':ent:entPdfConvert:generateEntDebugRFile'.Couldnotresolveallfilesforconfiguration':ent:entPdfConvert:entDebugCompileClasspat......
  • React Native原理
    首先来讲一下,我们必须清楚ReactNative本质是使用React的思想只不过React渲染的是真实的Dom,而ReactNative是使用虚拟Dom通过桥接调用原生的渲染下面就从index.js的App......
  • 一文读懂 HugePages(大内存页)的原理
    在介绍HugePages之前,我们先来回顾一下Linux下虚拟内存与物理内存之间的关系。物理内存:也就是安装在计算机中的内存条,比如安装了2GB大小的内存条,那么物理内存......