Android中的权限管理(基于uid gid gids setUid)

我们首先来说一下传统的Linux基于uid,gid的权限管理机制:

1、用户的uid gid gids:

Ubuntu操作系统当前登陆的用户是jltxgcy,那么该用户的uid为jltxgcy,gid也是jltxgcy,那么gids怎么查看呢?

答案是使用命令:cat /etc/group | grep jltxgcy。如下图:

用户的gids的名字为adm,dialout,cdrom,plugdev,lpadmin,admin,sambashare。此本分请参考linux用户组、/etc/group文件及账户相关操作命令

2、进程的uid gid gids:

shell进程uid,gid,gids都来源于用户,也就是说,该用户的进程的uid,gid,gids就是用户的uid,gid,gids;

另外很重要的一点是进程中其实没有uid,有的只有realUid和effectiveUid。

对于一般的进程来说realUid等于effectiveUid。在进程中真正有作用的effectiveUid。realUid象征着身份,effectiveUid象征着权力。

子进程realUid和effectiveUid都等于父进程的readUid。在shell中执行命令,其实就是fork出了shell进程的子进程。

文件操作时对进程是否有权限的识别的UID,即是指effectiveUid。ps命令输出的UID是effectiveUid。

3、文件的uid gid:

对于/bin/cat来说文件uid为root,gid为root。说明只有effectiveUid为root的进程才可以对文件进行rwx,effectiveGid为root的进程可以对文件进行rx,effectiveUid为其他的进程只可以对文件x。

下面举个例子把刚才讲的内容串联起来。

当前用户为jltxgcy,所以当前进程(shell进程的子进程)的realUid等于effectiveUid都为jltxgcy。

然后执行命令cat test,如上面两个图,对于cat来说当前进程effectiveUid为jltxgcy对这个文件来说是可执行的,然后再看test,对于当前进程effectiveUid为jltxgcy来说是可读的,所以我们能够通过这个命令看到test里面的内容,而不会出现Permission Deny。

我们接下来要分享的是setUid。首先我们把touch命令改成具有setUid权限的命令,如下图:

然后使用touch命令来建立test1文件,我们看看有什么不同,如下图:

不同之处是,test的user是jltxgcy,而test1的user是root。

这是因为:当effectiveUid为jltxgcy的进程在执行touch时,由于touch命令的user有了setUid的权限,所以这个进程的effectiveUid被设置为了root,具有了“皇权”,但是realUid仍为jltxgcy。

由于子进程realUid和effectiveUid都等于父进程的readUid,所以它的子进程的realUid和effectiveUid都等于jltxgcy,未正身。

与之不同的su命令,su命令的user也具有setUid权限,su这个进程把自身的effectiveUid提升为root后,把realUid也提升为root。这样它的子进程就是名正言顺的root了,它的子进程的readUid和effectiveUid都为root了。

capability是比传统的rwx权限管理更为细粒度的权限管理,比如当前进程在执行setUid提升自己的effectiveUid时,就会检查effective capabilty sets是否允许setUid。

我们讲了这么多在Linux下的权限管理,那么在Android下的权限管理是怎么样的呢?

用户:在Android中用户的概念已经被淡化,通常使用的是root用户和shell用户。

进程:shell用户的进程effectiveUid为2000。为什么?

使用busybox的命令whoami,当前用户是的uid为2000,那么2000对应哪个用户呢?我们查看Android_filesystem_config.h的源码:

#define AID_SHELL         2000  /* adb and debug shell user */

所以当前用户是shell用户,并且shell进程的uid为2000。

 
    当前进程,由于是shell进程的子进程,它的uid为2000,我们cc文件只有sdcard_r这个组才可以读,那么为什么我们的进程可以读这个文件呢?只有一种可能,那就是当前进程它的gids里面包含了sdcard_r。

在Android中,shell是进程,命令执行时是shell的子进程,应用程序是进程。

这是应用程序的私有文件,这样的权限机制就阻止了其他进程访问,有效保障了安全。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-21 08:39:27

Android中的权限管理(基于uid gid gids setUid)的相关文章

Android中的权限管理(基于Permission ProtectionLevel)

1.什么是protectionlevel呢? 我们经常在AndroidManifest中使用权限,如果我们想让应用程序可以发短信,那么应该这样写: <uses-permission android:name="android.permission.SEND_SMS" /> 那么这个权限的定义是在哪里定义的呢?如下: frameworks/base/core/res/AndroidManifest.xml <permission android:name="a

Android中那些权限

Permission Permission Permission Group Permission Tree Users Permission ACCESS_CHECKIN_PROPERTIES 允许读写访问"properties"表在checkin数据库中,改值可以修改上传( Allows read/write access to the "properties" table in the checkin database, to change values th

【源码笔记】BlogEngine.Net 中的权限管理

BlogEngine.Net 是个功能点很全面的开源博客系统,容易安装和实现定制,开放接口支持TrackBack,可以定义主题配置数据源等等.可谓五脏俱全,这里先记录一下它基于Membership的权限管理(一般只说到角色就没了). Membership是.net2.0的时候就出来了,现在的最新版本是Identity(微软已经将这个Asp.net项目开源 https://github.com/aspnet/Identity ).权限管理就是处理用户.角色.和具体权限的关系.用户和角色是多对多的关

Android中使用SQLiteOpenHelper管理SD卡中的数据库

使用Android中自带的SQLiteOpenHelper可以完成数据库的创建与管理,但有两点局限: (1)数据库创建在内存卡中,大小受限,创建位置位于/data/data/应用程序名/databases中(可使用Eclispe的DDMS查看). (2)如果无法获取Root权限,则无法直接查看创建的数据库. 鉴于上述限制及实际需要,打算使用SQLiteOpenHelper管理SD卡上的数据库,通过研究SQLiteOpenHelper的源码,发现其创建或打开数据库的代码位于getWritableD

Android 中各种权限深入体验及详解

Android 中各种权限深入体验及详解 分类: Android2012-07-15 19:27 2822人阅读 评论(0) 收藏 举报 androidpermissionsinstallersystemserviceinteger 一. 权限(permission) 权限用来描述是否拥有做某件事的权力.Android系统中权限分为普通级别(Normal),危险级别(dangerous),签名级别(signature)和系统/签名级别(signature or system).系统中所有预定义的

在Android中查看和管理sqlite数据库

http://www.cnblogs.com/walkingp/archive/2011/03/28/1997437.html 在Android中查看和管理sqlite数据库 在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看.android项目中的sqlite数据库位于/data/data/项目包/databases中. 使用DDMS导出sqlite数据库. 1.首先打开android项目的调试模式,然后找到显示DDMS: 选择DDM

Android 6.0 权限管理

Android 6.0 权限管理 Android permission 运行时权限(Runtime permission) 旧版兼容 6.0权限弹框的两种模式 6.0之后的权限分类 Normal permissions(普通权限) Dangerous permissions(危险权限) 运行时权限请求的基本步骤 权限请求策略 运行时权限(Runtime permission) android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次.一旦安装了,app可以在用户毫不知晓

统一身份管理中的权限管理设计

关注嘉为科技,获取运维新知 权限集中管理是统一身份管理关注的主要内容之一,由于企业应用建设的自身历程不同,权限设计与实现也必然存在差异,针对集中权限管理的设计和实现带来了不小的挑战,本文根据多年的实践经验,就统一身份管理的集中权限管理的设计与实现给予设计建议. 一 问题背景 随着信息技术和网络技术的迅猛发展,企业内部的应用系统越来越多,为此,为减少用户访问的麻烦,提升访问的便利性和体验,众多企业采用了统一身份管理的方案来解决该问题. 就企业的统一身份管理,业界提出了相应的标准,即4A标准,分别是

数据库中的grant权限赋予和系统中的权限管理是两码事。

数据库中的grant权限赋予和系统中的权限管理是两码事.grant一般是赋给个人的,对全部或单个数据库的增删改查等权限,不多说.权限管理系统 在数据库中建表,存角色,权限,不同的菜单,在java层面上写代码控制的.用filter或if等都能控制.参考资料:grant:http://www.cnblogs.com/Richardzhu/p/3318595.htmlhttp://blog.csdn.net/leshami/article/details/5688875http://7567567.b