以编程方式更改Manifest – Android自定义权限

目前的Android权限系统导致以下问题 :

应用程式A定义以下的自订权限:

com.package.permission.READ_APP_DATA 

安装应用程序B时声明自定义权限,它被授予。

但是,如果应用程序A安装应用程序B之后,则该权限不会授予应用程序B.

虽然这可能不是一个普遍的情况,但是由于应用程序B往往是应用程序A的插件,所以当然可以发生,并为我的应用程序。

超级用户应用程序同意引入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; 

根据这个问题的标题:这种方法是“安全的”? 或者有没有办法/根破解应用程序的清单可以改变后安装和权限以编程方式“添加”到应用程序B?

Solutions Collecting From Web of "以编程方式更改Manifest – Android自定义权限"

我不知道我是否正确地得到了问题,因为我不知道在安装连接到上面发布的代码之后,如何盗取清单中的权限。 但要回答你最后一段:

不是一个简单的方法。 用户必须在他的设备上安装一个mod,可以在应用程序请求时即时授予任意权限。 清单文件本身是在安装时parsing的。

所以我们在mod中使用的是改变com.android.server.pm.PackageManagerService类中的grantPermissionsLPw方法。

它用来授予启动器权限android.permission.EXPAND_STATUS_BAR ,它没有在其声明中声明。

我不确定,如果这将永远用于您的应用程序。 但要总结一下:如果用户想要授予应用程序一个仲裁权限,则自定义权限:是的,这是可能的。

UPDATE

当然,我可以详细阐述一下。 我可以看到两种情况发生

1.静态mod

上面提到的类位于services.jar 。 正如我们所知,这样的文件可以反编译,修改和重新编译。 其实,这个文件是一个相当简单的编辑。 我不知道如何直接在电话上这样做,但我会认为这是可能的。 这是不可行的,广泛的解决scheme是可用的,因为它需要大量的处理能力。 攻击者不能只提供一个通用文件。 这些文件从设备到设备,以及固件版本之间也有所不同。 攻击者可能需要提供大量补丁文件,或者通过将补丁上传到服务器,进行修补,重新下载并安装补丁。 如果你问我,这种情况不太可能。

2.dynamicmod

可用的框架不止一个,可以在运行时改变stream程。 最stream行的是Xposed框架 。 基本上,它是一个修补程序app_process和一个相应的API,利用Reflection来改变正在运行的进程。 现在攻击者可以使用这个框架发布他的应用程序,并拥有root权限,默默安装。 有了root权限,他甚至可以自己启用模块,这通常需要用户交互。 一旦启用了这样的模块,攻击者就可以挂钩上述方法并修改请求的权限。 他将通过获取拥有所请求的权限的对象字段来添加他所需的对象字段,然后运行原来的方法,从而添加最初定义的权限。

请注意,这两种情况都需要用户自己安装恶意应用程序。 你没有提到你的应用程序是什么,所以我不能真正帮你评估风险。 我只能说,攻击者可以做这样的事情。

我看到一个问题,如果应用程序A安装在应用程序B之前,并且未在应用程序A中声明<permission>元素,则用户永远不会看到权限请求。 但是,如果您确实需要使用AppA中的<permission>元素,则可以使用类似的方法来validation向用户显示的标签和说明是否准确。