Android安全机制(2) Android Permission权限控制机制

http://blog.csdn.net/vshuang/article/details/44001661

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

目录(?)[+]

1、概述

Android 是一个权限分离的系统 。 这是利用 Linux 已有的权限管理机制,通过为每一个 Application 分配不同的 uid 和 gid , 从而使得不同的 Application 之间的私有数据和访问( native 以及 Java 层通过这种 sandbox 机制,都可以)达到隔离的目的 。 与此 同时, Android 还 在此基础上进行扩展,提供了 permission 机制,它主要是用来对 Application 可以执行的某些具体操作进行权限细分和访问控制,同时提供了 per-URI permission 机制,用来提供对某些特定的数据块进行 ad-hoc 方式的访问

2、Android Permission机制

一个权限主要包含三个方面的信息:权限的名称;属于的权限组;保护级别。一个权限组是指把权限按照功能分成的不同的集合。每一个权限组包含若干具体 权限,例如在 COST_MONEY 组中包含 android.permission.SEND_SMS , android.permission.CALL_PHONE 等和费用相关的权限。

Android权限等级划分为normal,dangerous,signature,signatureOrSystem,system,development,不同的保护级别代表了程序要使用此权限时的认证方式。

normal 的权限只要申请了就可以使用

dangerous 的权限在安装时需要用户确认才可以使用
        signature需要签名才能赋予权限,
        signatureOrSystem需要签名或者系统级应用(放置在/system/app目录下)才能赋予权限,
        system系统级应用(放置在/system/app目录下)才能赋予权限,系统权限的描述在frameworks/base/core/res/AndroidManifest.xml当中。
        Package 的权限信息主要 通过在 AndroidManifest.xml 中通过一些标签来指定。如
<permission> 标签, <permission-group> 标签
<permission-tree> 等标签。如果 package 需要申请使用某个权限,那么需要使用
<use-permission> 标签来指定。

3、Android 提供的Permission 接口

3.1、CheckPermission

下面这一组接口主要用来检查某个调用(或者是其它
package 或者是自己)是否拥有访问某个 permission 的权限。参数中 pid 和 uid 可以指定,如果没有指定,那么
framework 会通过 Binder 来获取调用者的 uid 和 pid 信息,加以填充。返回值为
PackageManager.PERMISSION_GRANTED 或者 PackageManager.PERMISSION_DENIED 
public int checkPermission(String permission, int pid, int uid) // 检查某个 uid 和 pid 是否有 permission 权限
public int checkCallingPermission(String permission) // 检查调用者是否有 permission 权限,如果调用者是自己那么返回 PackageManager.PERMISSION_DENIED
public int checkCallingOrSelfPermission(String permission) // 检查自己或者其它调用者是否有 permission 权限
        下面这一组和上面类似,如果遇到检查不通过时,会抛出异常,打印消息 。
public void enforcePermission(String permission, int pid, int uid, String message)
public void enforceCallingPermission(String permission, String message)
public void enforceCallingOrSelfPermission(String permission, String message)

3.2、CheckUriPermission

为某个 package 添加访问 content Uri 的读或者写权限。
public void grantUriPermission(String toPackage, Uri uri, int modeFlags)
public void revokeUriPermission(Uri uri, int modeFlags)
        检查某个 pid 和 uid 的 package 是否拥有 uri 的读写权限,返回值表示是否被 granted 。
public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags)
public int checkCallingUriPermission(Uri uri, int modeFlags)
public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags)
public int checkUriPermission(Uri uri, String readPermission,String writePermission, int pid, int uid, int modeFlags)
        检查某个 pid 和 uid 的 package 是否拥有 uri 的读写权限,如果失败则抛出异常,打印消息 。
public void enforceUriPermission(Uri uri, int pid, int uid, int modeFlags, String message)
public void enforceCallingUriPermission(Uri uri, int modeFlags, String message)
public void enforceCallingOrSelfUriPermission(Uri uri, int modeFlags, String message)
public void enforceUriPermission(Uri uri, String readPermission, String
writePermission,int pid, int uid, int modeFlags, String message)

其中check开头的,只做检查。enforce开头的,不单检查,没有权限的还会抛出异常。

4、权限机制实现分析

4.1、CheckPermission

1. 如果传入的 permission 名称为 null ,那么返回 PackageManager.PERMISSION_DENIED 。
2. 判断调用者 uid 是否符合要求 。
1 ) 如果 uid 为 0 ,说明是 root 权限的进程,对权限不作控制。
2 ) 如果 uid 为 system server 进程的 uid ,说明是 system server ,对权限不作控制。
3 ) 如果是 ActivityManager 进程本身,对权限不作控制。
4 )如果调用者 uid 与参数传入的 req uid 不一致,那么返回 PackageManager.PERMISSION_DENIED 。
3. 如果通过 2 的检查后,再 调用 PackageManagerService.checkUidPermission ,判断 这个 uid 是否拥有相应的权限,分析如下 。
1 ) 首先它通过调用 getUserIdLP ,去 PackageManagerService.Setting.mUserIds 数组中,根据 uid 查找 uid (也就是 package )的权限列表。一旦找到,就表示有相应的权限。
2 ) 如果没有找到,那么再去 PackageManagerService.mSystemPermissions 中找。这些信息是启动时,从
/system/etc/permissions/platform.xml 中读取的。这里记录了一些系统级的应用的 uid 对应的
permission 。
3 )返回结果 。

4.2、CheckUriPermission

1. 如果 uid 为 0 ,说明是 root 用户,那么不控制权限。
2. 否则,在 ActivityManagerService 维护的 mGrantedUriPermissions 这个表中查找这个 uid 是否含有这个权限,如果有再检查其请求的是读还是写权限。

5、总结

上文介绍过基于UID和GID的Android安全机制,使用的是Linux的权限访问控制,控制文件和设备访问。

这次讲的Android Permission权限机制是对Android安全机制的一个重要补充,控制了应用对于系统接口或者对外接口的访问。

后续再讲Android 签名机制和Selinux Android

6、参考文献

1、http://dengzhangtao.iteye.com/blog/1990138

2、http://www.ibm.com/developerworks/cn/opensource/os-cn-android-sec/

3、http://www.cnblogs.com/senix/archive/2013/01/15/2853733.html

时间: 2024-10-14 21:25:50

Android安全机制(2) Android Permission权限控制机制的相关文章

Android安全机制(2) Android Permission权限控制机制

1.概述 Android 是一个权限分离的系统 . 这是利用 Linux 已有的权限管理机制,通过为每一个 Application 分配不同的 uid 和 gid , 从而使得不同的 Application 之间的私有数据和访问( native 以及 java 层通过这种 sandbox 机制,都可以)达到隔离的目的 . 与此 同时, Android 还 在此基础上进行扩展,提供了 permission 机制,它主要是用来对 Application 可以执行的某些具体操作进行权限细分和访问控制,

132、Android安全机制(2) Android Permission权限控制机制(转载)

http://blog.csdn.net/vshuang/article/details/44001661 http://www.cnblogs.com/mengdd/p/4892856.html

Android中的安全与访问权限控制

Android是一个多进程系统,在这个系统中,应用程序(或者系统的部分)会在自己的进程中运行.系统和应用之间的安全性是通过Linux的facilities(工具,功能)在进程级别来强制实现的,比如会给应用程序分配user ID和Group ID.更细化的安全特性是通过"Permission"机制对特定的进程的特定的操作进行限制,而"per-URI permissions"可以对获取特定数据的access专门权限进行限制. 安全架构 Android安全架构中一个中心思

linux权限控制机制

linux对于用户权限的分配有着很严格的约束,在linux中一切皆文件的概念已深入人心,它通过对不同的文件定义其属主及所属用户组的方式控制着文件的访问权限.在linux中站在文件的角度来考虑,系统角色大概分为四种,分别第一种超级用户,第二种文件或目录的属主也就是文件的所有者,第三种角色是属主的同组人,第四种便是其他人,这也就是Linux基于UGO的权限控制模型,U代User,G代表Group,O代表Other,每一个文件的权限基于UGO进行设置.权限三个一组(rwx),对应UGO分别设置每一个文

Android权限机制(三) 针对权限控制如何设计App

随着Android 5.0的到来,原生的权限管理控制功能AppOps终于登场(虽然4.3的代码中已经包含). 它的使用路径是Settings -> Security -> AppOps(有些厂商的ROM可能依然屏蔽着,或名字被修改) AppOps引进的一个新概念"Ops",也就是"Operations"操作.之前的第三方应用(如LBE)和手机厂商ROM(三星.MIUI),都实现了类似功能,但强调的是permission权限.而在AppOps中,ops操作

SEAndroid安全机制对Android属性访问的保护分析

Android系统通过属性暴露设备和运行时信息,并且可以通过设置属性来控制系统行为.因此,属性也像文件一样,是一种需要保护的资源.在启用SEAndroid之前,敏感属性只能被预先设定的进程进行设置.启用SEAndroid之后,敏感属性会进一步被SEAndroid安全策略保护.这样就可以更有效地保护系统属性了.在本文中,我们就详细分析SEAndroid安全机制对Android属性设置保护提供的支持. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 在分析SE

星辉科技Odoo开发教程5-配置安全权限控制01

Odoo 自带有权限控制机制,用户仅能使用被授权了的功能.这就意味着我们自建的库功能不对普通用户甚至是管理员开放. “ 注意: Odoo 12 的修改管理员用户现在也像其它用户一样受权限控制所限制.在此前的 Odoo 版本中, admin 都作为特权用户不受权限规则控制.而新版中我们需要进行授权管理员才能访问模型数据. ” Odoo 安全权限通过安全组来设置访问权限.每个用户的权限根据所属组来决定,对于我们的测试项目,我们将创建一个 to-do 用户组,然后通过组来分配可使用功能的用户.我们通常

android permission权限与安全机制解析

总结整理了一下android权限相关的知识,分享一下: uses-permission 用法为<uses-permission android:name="string" android:maxSdkVersion="integer"/> 为了保证application的正常运行,需要系统授予app的权限声明.这个权限是在用户安装应用的时候授予的. android:name的值可以是其他app通过<permission>声明的(用于两个应用之

android permission权限与安全机制解析(下)

在android permission权限与安全机制解析(上)篇博客中,我已经详细介绍了android相关系统permission和自定义permission,以及一些权限机制和安全机制.这篇博客主要将会介绍到android 6.0的相关权限更改,原理和相关的处理方式,解决方法等. 就以我以前的一个仿最新版微信相册为例子来分析. android 6.0权限全面详细分析和解决方案 Marshmallow版本权限修改 android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次