在权限检查时,
permission android:name="com.qualcomm.permission.UIM_REMOTE_CLIENT" android:protectionLevel="signatureOrSystem"
跟
permission android:name="com.qualcomm.permission.UIM_REMOTE_CLIENT"
是不一样
在apk安装后,权限信息会解析到 /data/system/packages.xml 文件里
... item name="com.qualcomm.permission.UIM_REMOTE_CLIENT" package="com.qualcomm.uimremoteclient" ... package name="com.redteamobile.virtual.softsim" perms item name="com.qualcomm.permission.UIM_REMOTE_CLIENT" granted="true" flags="0" 区别就在于 item name="com.qualcomm.permission.UIM_REMOTE_CLIENT" package="com.qualcomm.uimremoteclient" protection="18"
通过hook系统包管理服务
com/android/server/pm/PackageManagerService.java android/content/pm/permissionInfo updatePermissionsLPw PMS的全局数据结构中 context.checkCallingOrSelfPermission(String permission) 跟踪这个 ContextImpl.checkCallingOrSelfPermission() checkPermission(String permission, int pid, int uid) ActivityManagerNative.getDefault().checkPermission(permission, pid, uid); 通过AMS去做检测的 AMS.checkPermission() ActivityManager.checkComponentPermission(permission, uid, owningUid, exported); ActivityManager.checkComponentPermission AppGlobals.getPackageManager() .checkUidPermission(permission, uid); PMS.checkUidPermission() 先调用getUserIdLPr,同PMS的Setting.mUserIds数组中根据uid 查找权限列表。找到则表示有相应的权限,接着再根据传过来的参数坐下判断,看是否有对应的 如没有找到,则去PMS的mSystemPermissions 中找。 这些信息是启动时从 /system/etc/permissions/platform.xml 中读取的
https://android.googlesource.com/platform/frameworks/base.git/+/master/services/core/java/com/android/server/pm/PackageManagerService.java
mPermissionManager.updatePermissions
BasePermission bp = (BasePermission) mPermissionManager.getPermissionTEMP(permName);
mPermissions.put(name, new PermissionData(permissionData)); 修改权限
https://sanjay-f.github.io/2016/05/18/%E6%BA%90%E7%A0%81%E6%8E%A2%E7%B4%A2%E7%B3%BB%E5%88%9736—%E5%AE%89%E5%8D%93%E7%9A%84%E5%AE%89%E5%85%A8%E6%9C%BA%E5%88%B6permission/
在Android 8.0 Oreo后, 权限不会自动赋予那些在 system/priv-app目录的应用。
所有的特权应用,都必须通过 在 /etc/permissions目录下的白名单来配置。
比如 privapp-permissions-platform.xml 里就有
privapp-permissions package=”com.android.phone”
…
permission name=”android.permission.READ_PRIVILEGED_PHONE_STATE”
…
的配置
特许权限许可名单
特权应用是位于系统映像某个分区上 priv-app 目录下的系统应用。各 Android 版本中,该分区为:
Android 8.1 及更低版本 – /system
Android 9 及更高版本 – /system, /product, /vendor
在本页面中,/etc/permissions/priv-app 解析为 partition/etc/permissions/priv-app。
过去,设备制造商几乎无法控制可对特权应用授予哪些签名|特许权限。从 Android 8.0 开始,制造商必须在 /etc/permissions 目录下的系统配置 XML 文件中明确授予特许权限。从 Android 9 开始,实现人员必须明确授予或拒绝授予所有特许权限,否则设备将无法启动。
privapp-permissions.xml 文件只有在与特权应用位于同一分区时才能授予或拒绝授予该应用权限。例如,如果 /vendor 分区上的应用请求特许权限,则只能由同样位于 /vendor 上的 privapp-permissions.xml 文件来同意或拒绝该请求。
注意:必须列入许可名单的只有核心平台(“android”软件包)所定义的权限。设备制造商定义的特许权限仍将自动授予。在 privapp-permissions.xml 文件中,请仅列出实际存在于该分区上的应用。如果应用不在该分区上,系统将忽略所列条目。
添加许可名单
应用的权限许可名单可列在位于 frameworks/base/etc/permissions 目录下的单个或多个 XML 文件中,如下所示:
/etc/permissions/privapp-permissions-OEM_NAME.xml
/etc/permissions/privapp-permissions-DEVICE_NAME.xml
对于如何组织内容,没有严格的规则。设备实现人员可以决定内容结构,只要 /system/priv-app 下的所有应用均列入许可名单即可。例如,Google 针对由 Google 开发的所有特权应用提供了一个许可名单,并建议使用以下组织方式:
对于已包含在 Android 开源项目 (AOSP) 树中的应用,请将其权限列在 /etc/permissions/privapp-permissions-platform.xml 中。
对于 Google 应用,请将其权限列在 /etc/permissions/privapp-permissions-google.xml 中。
对于其他应用,请使用以下格式的文件:/etc/permissions/privapp-permissions-DEVICE_NAME.xml。