【发布时间】:2013-09-02 12:19:57
【问题描述】:
当前Android Permission System causes the following issue:
App A 定义的自定义权限:
com.package.permission.READ_APP_DATA
当应用 B 安装声明自定义权限时,它被授予。
但是,如果应用 A 在应用 B 之后安装,则权限不授予应用 B。
虽然这可能不常见,但由于应用 B 通常是应用 A 的插件,它当然会发生并且对我的应用程序有效。
SuperUser 应用程序同意引入android.permission.ACCESS_SUPERUSER 的全局自定义权限,如果用户决定切换 SuperUser 应用程序,这可能是一个大问题。
为了处理这个问题,我打算在我的应用程序中使用以下代码来获得我即将开始声明的自定义权限:
checkPermissions(this, getCallingActivity().getPackageName()); // get the package name from the sender first
private boolean checkPermissions(Context context, String callingPackage) {
final List<PackageInfo> apps = context.getPackageManager().getInstalledPackages(PackageManager.GET_PERMISSIONS);
for (PackageInfo pi : apps) {
if (pi.packageName.equals(callingPackage)) {
String[] permissions = pi.requestedPermissions;
if (permissions != null) {
for (String permission : permissions) {
if (permission.equals("com.package.permission.READ_APP_DATA")) {
return true;
}
}
}
}
}
return false;
根据这个问题的标题:这种方法“安全”吗?或者是否有一种方法/root-hack 可以在安装应用程序清单并将权限以编程方式“添加”到应用程序 B 后对其进行更改?
【问题讨论】:
-
"但是,如果应用 A 是在应用 B 之后安装的,则权限不会授予应用 B。" -- 在两个应用程序中具有相同的
<permission>元素,特别是如果这是signature级别的权限。 -
“我相信这已经是我正在做的事情”——您的问题表明只有 App A 有一个
<permission>元素,而 App B 只有一个<uses-permission>元素。我是说要将<permission>元素也添加到App B,这样安装顺序就不再重要了。 -
“虽然要求 3rd 方开发人员以这种方式声明我的自定义权限,但感觉有点令人不安” - 正如我所指出的,最好使用
signature级别的权限,因此所有受影响的应用程序都是您的。权限系统的一个不幸限制是,首先进入的人可以定义对用户(标签和描述)的权限。不过,您对此无能为力。 -
关于您上面的技术,我从未见过有人这样做。事实上,我最初的反应是它不起作用,直到我意识到
requestedPermissions确实包括非授权的。鉴于此,我没有看到任何漏洞,但我认为我有同样的恐惧,导致你发布这个问题。 :-) 如果不出意外,请确保您一直测试到您的minSdkVersion,因为这感觉就像多年来 Android 的行为可能发生变化的那些领域之一。 -
在两个应用程序中声明自定义权限在 Android L 上不再起作用(您会收到安装错误:INSTALL_FAILED_DUPLICATE_PERMISSION)。他们似乎已经堵住了这个漏洞(另见commonsware.com/blog/2014/02/12/…)
标签: android permissions android-manifest