




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android 平台授权管理分析文档By jeffliu 1. 概述Android是一个权限分离的系统。这是利用Linux已有的权限管理机制,通过为每一个Application分配不同的uid和gid,从而使得不同的Application之间的私有数据和访问(native以及java层通过这种sandbox机制,都可以)达到隔离的目的。与此同时, Android还在此基础上进行扩展,提供了permission 机制,它主要是用来对Application可以执行的某些具体操作进行权限细分和访问控制,同时提供了per-URI permission机制,用来提供对某些特定的数据块进行ad-hoc 方式的访问。2. Permission实现机制分析2.1. uid 、gid 、gidsAndroid的权限分离的基础是建立在Linux已有的uid、gid、gids基础上的。l Uid: Uid Android在安装一个应用程序,就会为它分配一个uid(参考PackageManagerService中的newUserLP实现)。其中普通Android应用程序的uid是从10000开始分配(参见Process.FIRST_APPLICATION_UID),10000以下是系统进程的uid 。l Gid:对于普通应用程序来说,gid等于uid。由于每个应用程序的uid 和gid 都不相同,因此不管是native层还是java层都能够达到保护私有数据的作用。l GIDS:gids是由框架在Application安装过程中生成,与Application申请的具体权限相关。如果 Application申请的相应的permission被granted,而且中有对应的 gids,那么这个 Application的gids中将包含这个gids 。Uid、gid、gids的设置过程在ActivityManagerService中的startProcessLocked。在通过 zygote 来启动一个process时,直接将uid传给给了gid。再通过zygote来fork出新的进程(zygote.java 中的forkAndSpecialize),最终在native层进行gid和uid和gids的设置。2.2. permission一个权限主要包含三个方面的信息:权限的名称;属于的权限组;保护级别。一个权限组是指把权限按照功能分成的不同的集合。每一个权限组包含若干具体权限,例如在 COST_MONEY 组中包含 android.permission.SEND_SMS , android.permission.CALL_PHONE 等和费用相关的权限。每个权限通过protectionLevel来标识保护级别: normal , dangerous , signature, signatureorsystem。不同的保护级别代表了程序要使用此权限时的认证方式。normal的权限只要申请了就可以使用; dangerous 的权限在安装时需要用户确认才可以使用;signature和signatureorsystem 的权限需要使用者的app和系统使用同一个数字证书。Package的权限信息主要通过在AndroidManifest.xml中通过一些标签来指定。如 标签, 标签 等标签。如果package需要申请使用某个权限,那么需要使用标签来指定。【注:android包管理服务_PackageManagerService_源码分析.pdf(来自网络)】2.3 cm permission实现原理分析1. Cm将授权管理集成到android原生的applicationManager应用中。在进程及服务详情里禁用和启用相应的权限。2. CM设置里有一个该应用的开关。对应的代码为packages/apps/CMParts。3. 从其AndroidManifest.xml中,可以看出它需要有system的权限,这样才能保证它可以操纵permission相关的framework提供的接口和服务。4. 在frameworks/base/core/java/android/widget/中增加了处理permission on/off的新的类:AppSecurityEditablePermissions。5. 对PackageManager.java/PackageManagerService.java等frameworks/base/core/的PM的逻辑进行了修改GrantedPermissions/SharedUserSetting中增加了新的revokedPermissions和effectivePermissions用来进行permission扩展的属性。6. 在PackageManagerService.java中的checkPermission,checkUidPermission函数,增加了对revokedPermissions和effectivePermissions的检查逻辑,从而保证Setting中修改过的permission在运行时,能够生效.对于revokedPermissions和ffectivePermissions的初始化getRevokedPermissions/setRevokedPermissions/updateEffectivePermissions。7. 在系统中增加了一个叫做android.permission.REVOKE_PERMISSIONS的权限。3.代码整理3.1.core/java/android/content/pm/IPackageManager.aidl中添加两个接口函数:String getRevokedPermissions(String packageName);void setRevokedPermissions(String packageName, in String perms);3.2.core/java/android/content/pm/PackageManager.java中添加两个接口函数:/* * Returns the revoked permissions for given package. * * NOTE: If the package has a shared uid then the revoked permissions for that * ? ? ? uid will be returned. * * param packageName Name of the package which revoked permissions are needed * hide */ public abstract String getRevokedPermissions(String packageName); /* * Sets the revoked permissions for given package. * * NOTE: If the package has a shared uid then this method will revoke the * ? ? ? permissions for that shared uid. * * param packageName Name of the package which revoked permissions are needed * hide */ public abstract void setRevokedPermissions(String packageName, String perms);3.3.core/java/android/app/ContextImpl.java中添加两个函数:(最终调的是PackageManagerService里的这两个方法)Override public String getRevokedPermissions(String packageName) try return mPM.getRevokedPermissions(packageName); catch (RemoteException e) / Should never happen! return new String0; Override public void setRevokedPermissions(String packageName, String perms) try mPM.setRevokedPermissions(packageName, perms); catch (RemoteException e) / Should never happen! 3.4.services/java/com/android/server/PackageManagerService.javadiff -git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.javaindex 982aa82.b13dbb8 100644 - a/services/java/com/android/server/PackageManagerService.java + b/services/java/com/android/server/PackageManagerService.java -1406,21 +1406,21 14061406 14071407 public int getPackageGids(String packageName) 14081408 synchronized (mPackages) 14091409 PackageParser.Package p = mPackages.get(packageName); 14101410 if (Config.LOGV) Log.v( 14111411 TAG, getPackageGids + packageName 14121412 + : + p); 14131413 if (p != null) 14141414 final PackageSetting ps = (PackageSetting)p.mExtras; 14151415 final SharedUserSetting suid = ps.sharedUser; 1416- return suid != null ? suid.gids : ps.gids; 1416+ return suid != null ? removeInts(suid.gids, suid.revokedGids) : removeInts(ps.gids, ps.revokedGids); 14171417 14181418 14191419 / stupid thing to indicate an error. 14201420 return new int0; 14211421 14221422 14231423 static final PermissionInfo generatePermissionInfo( 14241424 BasePermission bp, int flags) 14251425 if (bp.perm != null) 14261426 return PackageParser.generatePermissionInfo(bp.perm, flags); -1678,38 +1678,44 16781678 synchronized (mPackages) 16791679 return mAvailableFeatures.containsKey(name); 16801680 16811681 16821682 16831683 public int checkPermission(String permName, String pkgName) 16841684 synchronized (mPackages) 16851685 PackageParser.Package p = mPackages.get(pkgName); 16861686 if (p != null & p.mExtras != null) 16871687 PackageSetting ps = (PackageSetting)p.mExtras; 1688- if (ps.sharedUser != null) 1689- if (ps.sharedUser.grantedPermissions.contains(permName) 1688+ int uid = Binder.getCallingUid(); 1689+ boolean lie = uid = ps.userId; 1690+ if (ps.sharedUser != null) 1691+ lie = uid = ps.sharedUser.userId; 1692+ if (ps.sharedUser.grantedPermissions.contains(permName) & 1693+ (!ps.sharedUser.revokedPermissions.contains(permName) | lie) 16901694 return PackageManager.PERMISSION_GRANTED; 16911695 1692- else if (ps.grantedPermissions.contains(permName) 1696+ else if (ps.grantedPermissions.contains(permName) & 1697+ (!ps.revokedPermissions.contains(permName) | lie) 16931698 return PackageManager.PERMISSION_GRANTED; 16941699 16951700 16961701 16971702 return PackageManager.PERMISSION_DENIED; 16981703 16991704 17001705 public int checkUidPermission(String permName, int uid) 17011706 synchronized (mPackages) 17021707 Object obj = mSettings.getUserIdLP(uid); 17031708 if (obj != null) 17041709 GrantedPermissions gp = (GrantedPermissions)obj; 1705- if (gp.grantedPermissions.contains(permName) 1710+ if (gp.grantedPermissions.contains(permName) & 1711+ !gp.revokedPermissions.contains(permName) 17061712 return PackageManager.PERMISSION_GRANTED; 17071713 17081714 else 17091715 HashSet perms = mSystemPermissions.get(uid); 17101716 if (pe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汉字笔顺规则课件
- 汉字的演变史
- 内蒙古巴彦淖尔市乌拉特前旗第三中学2025届九年级下学期学业水平考试模拟(三模)数学试卷(含答案)
- 广东省肇庆市2024-2025学年高一下学期期末统一考试物理试卷(含解析)
- 2024-2025学年广东省茂名市高州市八年级(下)5月月考数学试卷(含答案)
- 硬件按需购买模式的市场研究
- 传统文化保护传承与现代文化创新融合探讨
- 网约车行业监管政策分析
- 汉字书法课件模板楷书庵
- 汉字书写讲解课件
- 初中地理学科课程规划方案
- 定额〔2025〕1号文-关于发布2018版电力建设工程概预算定额2024年度价格水平调整的通知
- 塑胶模具类中英文对照专业术语
- 安全- 中国移动认证考试L1题库(附答案)
- 干部民主推荐表(样式)
- 【公开课】社区教案
- 平面磨床操作时注意事项
- GB/T 29651-2013锰矿石和锰精矿全铁含量的测定火焰原子吸收光谱法
- GB/T 13275-1991一般用途离心通风机技术条件
- 核心素养下的高考语文命题评价体系讲座课件
- 高一英语必修一试卷(含答案)(适合测试)
评论
0/150
提交评论