Android系统篇之—-Android中的run-as命令引出升降权限的安全问题(Linux中的setuid和setgid)

一、前言

最近一周比较忙,没时间写东西了,今天继续开始我们今天的话题:run-as命令,在上周的开发中,遇到一个问题,就是在使用run-as命令的时候出现了一个错误,不过当时因为工作进度的问题,这问题就搁浅没有解决,用了其他一个曲线救国的方式去解决的。那么咋们今天闲来说说Android中的run-as命令吧。

 

二、遇到的问题&解决问题

Android中我们知道如果设备没有root,我们想看一个应用的沙盒数据(/data/data/目录内容),在以前的方式很难办到,一般人都是选择root之后,去查看对应的数据库,xml等数据。但是如果如果我们没有root了,照样也想看这些数据,怎么办呐?其实Android中提供了一个命令,那就是:run-as,不过这个命令有一个缺陷,就是只有Debug应用才能查看,这个到后面在分析run-as源码的时候再说。这个命令的用法很简单:run-as [packagename]

其中packagename就是我们想查看的应用的包名,运行命令之后,就直接进入到指定应用的目录下:/data/data/packagename/

那么我现在稍微了解了Android中有这个命令,可以查看Debug应用的沙盒数据,那么我遇到一个什么问题呢?下面来看我运行的结果:

呵呵,点够北的,为毛这个命令会报错呢?遇到这个问题我们只有两种方式去解决:一种是网上查资料,一种是自己去看那操蛋的源码,好吧,现在我们有时间了,那就去看源码吧,关于Android中的这些命令,一般都在/system/bin/system/xbin目录下,这些命令的源码一般都是放在源码的:Android源码目录\system\core\ 下:

那么我们就来看看run-as的源码:run-as.c:

看到这里,我们知道了,原来run-as命令运行有很多限制的:

第一个限制:运行的uid限制,运行命令的用户id只能是shell和root用户

下面我们可以验证一下,我们使用system的uid运行命令:

这里我们用于测试的设备已经root了,因为我要讲解问题,所以需要root之后操作方便。这里看到使用su可以随意设定uid,这个后面分析su源码在说他是如何做到的。这里我们将uid变成了system了,在运行run-as,发现报错了,符合预期吧。

第二限制:这个应用的安装必须合法

这里我们在仔细看看get_package_info这个函数的源码了,它位于run-as.c同目录下的package.c

这里通过map_file函数来获取PACKAGES_LIST_FILE文件的buffer内容,我们再来看一下PACKAGES_LIST_FILE的定义:

是这个文件,我们导出这个文件,查看内容:

这个文件记录所有安装应用的信息:

包名,用户id(uid),是否为debug模式,对应的数据目录,是否是release版,组id(gid)

这里我们看到,demo.systemapi应用是debug模式的。一般正式app都是非debug模式。

这里通过读取这些信息就可以构造出一个PackageInfo了:

注意:

这里我们看到了packages.list文件是存储安装包的简略信息的,其实和他同一目录下还有一个重要文件:packages.xml,我们可以导出来看看:

看到了,这里就记录了安装应用的详细信息,还有一个重要信息就是还能够知道应用的安装来源,有些app可以做到这点,就是通过这个信息来获取到的,还有签名信息,权限等。

当然我们可以使用Android中的dumpsys packageinfo命令来查看指定应用的详细信息:

第三个限制:应用的uid必须合法

我们看到这里AID_APP的定义,在 Android源码目录\system\core\include\private\android_filesystem_config.h

这里定义了一些uid信息,看到:

AID_ROOT对应的是root用户,uid=0

AID_SYSTEM对应的是system用户,uid=100

AID_SHELL对应的是shell用户,uid=2000

从这里我们可以看到,root用户的权限》system用户的权限》shell用户的权限》第三方应用的权限

不过这里所说的权限只是对于一些情况,不是全部哦,比如一个简单的例子,Android中有些api是会做uid限制的,即时我们用反射机制也是访问失败的,那么比如有一个api他限制只能uid=1000的用户就是system用户才能调用,那么这时候,即时你是root用户也是没办法的,不过可以使用su进行降权,这个后面会通过一个例子来看。

这三个用户的id最好记住啦,算是常识了。

在往下看:

看到了,这里的AID_APP是10000,我们也知道,我们安装的应用的uid都是从10000开始的,所以uid都是大于10000的,这里所以做了一层uid的合法性判断限制

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值