首先关于Root的方式,这里不做详解,可以有很多漏洞,比如利用uid溢出后归为0,得到Root权限,然后操作文件系统等。

手机Root后,最重要的是,给手机安装了su程序和superuser apk。 su一般被安装在/system/xbin 或者 /system/bin 下面,su文件的权限如下:

# ls su -l

ls su -l

-rwsr-sr-x    1 root     root         26336 Aug  1  2008 su

这里可以看到,su的Owner和Group分别为Root,Root。 Other用户具有exeute权限,另外,su设置了suid和sgid,这个非常重要,后面会详述,这个使得Su进程可以提升自身的EUID。

我们这里以RootExplorer为例,看是如何申请和提升权限的:

首先,ps一下,可以看到root explorer的信息,这里第一列是UID,更加准确的,应该是EUID。

app_73    1143  103   301620 39944 ffffffff 400194c4 S com.speedsoftware.rootexp

lorer

这里可以看到,Root Explorer的EUID=10073(App Base是从10000开始的)

然后,Root Explorer通过Runtime方式,使用shell 命令行运行了“su”, 所以,会有一个Root Explorer启动的sh:

app_73    1159  1143  764    376   c003e454 4001cf94 S /system/bin/sh

default情况下,进程的UID是继承的,这里sh的PPID是1143,说明是RootExplorer启动的。

RootExplorer通过类似下面的代码运行“su”:

p = Runtime.getRuntime().exec("su");

所以,1159  PID的sh会启动su,这里需要注意的是,su进程的Real UID是10073,因为继承自parent,但是,其EUID却提升为了ROOT,这就是由于SUID被设置的原因。 由于su进程的EUID是ROOT,所以导致了su可以做很多高权限的事情。

su会通过:

sprintf(sysCmd, "am start -a Android.intent.action.MAIN -n com.koushikdutta.superuser/com.koushikdutta.superuser.SuperuserRequestActivity --ei uid %d --ei pid %d > /dev/null", g_puid, ppid);

if (system(sysCmd))

return executionFailure("am.");

启动SuperUser Request Activity来询问用户是否授权当前应用,如果否的话,则su将return 结束, 否则su会继续运行。

得到用户许可后(通过sqlite和SuperUser Request Activity交流用户许可),su会将自己的Real UID也设置为ROOT:

if(setgid(0) || setuid(0))

return permissionDenied();

由于su的EUID是ROOT,所以su有权限执行以上代码,执行完后su进程的Real UID,effective UID都变成了ROOT。 这里为什么要同时提升Real UID的权限,后面会说明。

然后,su会启动一个额外的sh来运行用户的指令:

char *exec_args[argc + 1];

exec_args[argc] = NULL;

exec_args[0] = "sh";

int i;

for (i = 1; i < argc; i++)

{

exec_args[i] = argv[i];

}

execv("/system/bin/sh", exec_args);

return executionFailure("sh");

这里非常关键的代码是execv! 这里没有使用fork,而是直接使用execv,这将导致不会创建新的进程运行sh image,而是直接在当前su的进程空间load并执行sh image。 所以,return executionFailure("sh"); 正常情况下是永远不会被执行的,执行完execv后,就开始直接sh的代码了。

这里可以看到,由于复用su当前进程来运行sh,使得sh运行的进程的EUID,Real UID都是ROOT,那么,任何操作都可以执行了。 如果不提升Real UID为Root的话,那么只要sh运行中通过启动外部程序的方式来完成操作的话,就会出现权限问题,因为新启动的进程只会继承父进程的Real UID,而不是EUID,那么新起的进程的Real UID=EUID= parent RealUID != ROOT,那么某些操作可能有问题。 所以,su把自己的Real UID也提升为ROOT后,则不管启动后的任何代后的子进程执行操作,都是以ROOT的权限运行。

RootExplorer通过得到sh流后,就可以通过该流执行任何shell指令了:

1.try {

2.   // Preform su to get root privledges

3.   p = Runtime.getRuntime().exec("su");

4.

5.   // Attempt to write a file to a root-only

6.   DataOutputStream os = new DataOutputStream(p.getOutputStream());

7.   os.writeBytes("echo \"Do I have root?\" >/system/sd/temporary.txt\n");

8.

9.   // Close the terminal

10.   os.writeBytes("exit\n");

11.   os.flush();

通过ps也可以明显看到su变成了sh,如下,

app_73    1143  103   301620 39944 ffffffff 400194c4 S com.speedsoftware.rootexp

lorer

app_73    1159  1143  764    376   c003e454 4001cf94 S /system/bin/sh

root      1161  1159  772    388   c012e760 4007c578 S sh

这里的PID=1161的进程其实是su(可以通过打log验证),当执行execv("/system/bin/sh", exec_args);后,进程名就变成了sh。当然进程EUID不变,仍然是ROOT。

通过cat 进程的proc信息,我们也可以看到其实RootExplorer自身的UID或者权限根本没有被提升(这是和linux上执行su不一样的地方),

# cat status

cat status

Name:   re.rootexplorer

State:  S (sleeping)

Tgid:   1143

Pid:    1143

PPid:   103

TracerPid:      0

Uid:    10073(Real)   10073(Effecttive)   10073(saved)   10073

Gid:    10073   10073   10073   10073

而su演变成的sh,却是具有所有的ROOT UID:

# cat status

cat status

Name:   sh

State:  S (sleeping)

Tgid:   1161

Pid:    1161

PPid:   1159

TracerPid:      0

Uid:    0       0       0       0

Gid:    0       0       0       0

总结: Android中App授权获取Root权限,其实不是App自身的权限提升了,而是通过具有ROOT权限的sh流来执行shell命令

Android权限管理原理,Android手机Root授权原理细节全解析相关推荐

  1. android 一个字符串分两行显示_重新梳理Android权限管理

    Android Developer指南中,对Android安全体系结构的核心有这么一个说法:默认情况下,任何应用程序都无权执行任何会对其他应用程序.操作系统或者用户产生负面影响的操作.这句话其实就很好 ...

  2. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  3. android 开机小企鹅_手机root是好是坏 小编来帮你分析

    本文由 业务盟询报价平台 整理编辑 手机root通常是针对android系统的手机而言,它使得用户可以获取android操作系统的超级用户权限.root通常用于帮助用户越过手机制造商的限制,使得用户可 ...

  4. android 跳转权限管理的代码,Android权限管理

    Android权限管理 说明 在targetSdkVersion的值为23或者更高,就要进行权限管理,否则如果运行在Android6.0或以上的设备会没有相应权限而导致崩溃 请求权限后,在onRequ ...

  5. Android权限管理

    Android权限管理 说明 在targetSdkVersion的值为23或者更高,就要进行权限管理,否则如果运行在Android6.0或以上的设备会没有相应权限而导致崩溃 请求权限后,在onRequ ...

  6. android 权限管理之判断禁止后不再提示

    android 权限管理之判断禁止后不再提示 我看到了许多博客中写到了单独去判断shouldShowRequestPermissionRationale()方法的值去判断为是否为不再提示,结果遇到了小 ...

  7. 手机root通用原理

    手机root通用原理 通用原理是,找一个你机器对应的能支持挂写系统分区的boot.img,然后把手机进入fastboot模式,用命令行把你的boot.img挂起来,然后把su文件放到system/xb ...

  8. 转:权限管理——用户认证和用户授权

    转自: https://blog.csdn.net/xdd19910505/article/details/51926540 因为做了权限的项目经理,so,恶补一下一个权限框架:shiro.其实作为框 ...

  9. 权限管理——用户认证和用户授权

    因为做了权限的项目经理,so,恶补一下一个权限框架:shiro.其实作为框架首要目标是易于使用和理解.安全有时候是很复杂的,甚至是痛苦的,但框架没有必要这样.框架应该尽可能掩盖复杂的地方,露出一个干净 ...

最新文章

  1. 00后电竞女学霸直博中科院,本科武大王者全国16强,网友:现实版爽文女主角...
  2. 微服务的分解和组合-文末赠书
  3. SVN中trunk、branch、tag区别
  4. [转载]IE678兼容性前缀区分
  5. mssql sqlserver sql脚本自动遍历重复生成指定表记录
  6. 免费的FTP linux 服务器中文,linux ftp服务器的搭建和中文字体乱码的解决
  7. 【分享-免费下载】免费下载配乐/视频/平面设计/游戏素材
  8. SQL Server数据库的查询、排序
  9. OkHttp3详细使用教程(2)
  10. 实现可拖拽,拉伸,吸附功能的甘特图(时间/任务表)
  11. Linux下修改文件权限
  12. 纯新手DSP编程--5.29--基于CCS的DSP片级支持库CSL
  13. 谷歌地图:谷歌地图的级别与对应比例尺及分辨率探究
  14. 中缀表达式转后缀表达式规则
  15. 反激变换器的变压器设计
  16. 数据分析案例——销售利润不达标原因分析及应对策略
  17. 李某同案律师下挑战书
  18. 学习日志day52(2021-09-22)(1、SpringMVC文件上传 2、Spring发送邮件 3、拦截器 4、日志 )
  19. OneNote for Win10 代码高亮
  20. python中字符串如何新增元素_python向字符串中添加元素的实例方法

热门文章

  1. IntelliJ IDEA 2021.2 正式发布
  2. 如果恶魔给你一亿,一年之后必须还两个亿,你会接受吗?
  3. 看 B 站,可以更快!
  4. IDEA这样配置注释模板,让你高出一个逼格!!
  5. 使用proguard混淆java web项目代码
  6. 动态表单及动态建表实现原理
  7. 重装Windows后修复Linux引导
  8. Redis快速扫描Scan
  9. css中calc()方法的使用
  10. Python3.7 Scrapy安装(Windows)