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

bra*_*all 11 permissions android android-manifest

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

App A定义了以下的自定义权限:

com.package.permission.READ_APP_DATA
Run Code Online (Sandbox Code Playgroud)

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

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

虽然这可能不常见,但由于应用程序B经常是应用程序A的插件,它当然可以发生并且适用于我的应用程序.

android.permission.ACCESS_SUPERUSER如果用户决定切换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;
Run Code Online (Sandbox Code Playgroud)

根据这个问题的标题:这种方法"安全"吗?或者是否有一种方法/ root-hack,应用程序的清单在安装后可以更改,并且以编程方式"添加"到应用程序B的权限?

lan*_*ans 9

我不确定我是否正确地提出了这个问题,因为我不知道安装后如何通过黑客攻击清单连接到您上面发布的代码.但要回答你的最后一段:

不是一个简单的方法.用户必须在他的设备上安装mod,它可以在应用程序请求时动态授予任意权限.IIRC清单文件本身仅在安装时解析.

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

它用于向启动器授予android.permission.EXPAND_STATUS_BAR其未在其清单中声明的权限.

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

UPDATE

当然,我可以详细说明一下.我可以看到两种情况发生

1.静态mod

上面提到的课程在于services.jar.我们知道,这样的文件可以被反编译,修改和重新编译.实际上,这个文件很容易编辑.我不知道直接在手机上这样做的方法,但我认为这是可能的.由于需要大量的处理能力,所以可以使用广泛的解决方案,这是不可行的.攻击者不能只提供通用文件.这些文件在设备之间以及固件版本之间发生变化.或者,攻击者需要提供大量修补文件,或者通过将其上传到服务器,对其进行修补,重新下载和安装来实时修补.如果你问我,这种情况不太可能发生.

动态mod

有多个框架可用,允许在操作过程中更改进程.其中最受欢迎的是Xposed Framework.基本上,它是一个补丁app_process和相应的API,可以利用Reflection来改变正在运行的进程.现在,攻击者可以使用此框架发送他的应用程序,并具有root访问权限,然后以静默方式安装它.通过root访问,他甚至可以自己启用模块,这通常需要用户交互.一旦启用了类似的模块,攻击者就可以挂钩上述方法并更改请求的权限.他会通过获取拥有所请求权限的对象字段,添加他需要的那个,然后运行原始方法来添加最初定义的权限.

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