如何防止其他应用程序定义相同的权限名称

时间:2012-07-12 18:39:18

标签: android permissions

我的应用程序用android定义了一个权限:protectionLevel =“signature”。

<permission android:name="my.app.permission.EXAMPLE" android:protectionLevel="signature" />

我的目的是制作只能由我签名的应用程序启动的应用程序模块。这些应用程序模块在其活动中具有android:permission。 这很好用。但... 第三方应用可以使用相同的权限名称,并将保护级别更改为正常,如此

<permission android:name="my.app.permission.EXAMPLE" android:protectionLevel="normal" />

如果我的应用程序首先安装,我可以阻止其他应用程序覆盖该权限。但是,如果卸载我的应用程序然后安装他的应用程序,则会重新定义权限。

是否可以阻止其他应用程序使用相同的权限名称,例如,为权限提供应用程序包等唯一ID?

虽然Manifest已加密,但任何人在尝试启动需要此权限的活动时都可以读取log cat中的权限名称(抛出具有所需权限名称的异常)。

3 个答案:

答案 0 :(得分:5)

没有强制执行,只有惯例。与Java世界的其他部分一样,它松散地依赖于域名注册基础设施。我们的想法是,在您的权限名称前加上您拥有的公共互联网域名(例如com.myawesomecompany.myapp.MYPERMISSION)。

域名的唯一性由注册商社区自然执行。

是的,系统已被滥用。

编辑:如果您要保护基于广播的频道,可以添加双向签名检查,如果您愿意的话。使用权限名称作为第二个参数调用Context.sendBroadcast()。

EDIT2:我觉得你正在过度思考,同时关注更大的Android应用安全图片。这并不令人印象深刻。滥用权限基础设施并不是攻击Android应用程序的方式。如果我打算拦截你的意图,我将不会把假意接收者(活动,服务)放在一起。相反,我会将调试器连接到您应用中的真正接收器,签名和所有。

使用公开可用的工具,为给定的APK投入Eclipse项目需要几分钟。将其加载到Eclipse中,连接到正在运行的进程,在相关的系统API中设置断点(Android是开源的,请记住),瞧。通过一些额外的努力,您可以获得APK的反编译Java源代码,并根据您的方法进行调试,而不是系统方法。

答案 1 :(得分:0)

如果要阻止其他应用程序更改权限级别,可以使用具有级别“签名”的系统预定义权限。没有其他常规应用可以在系统之前定义权限。

使用系统权限保护您的资源并不意味着您的应用必须使用平台密钥进行签名。

示例:

<service
        android:name="xxx.xxx.xxx.exservice"
        android:permission="android.permission.BROADCAST_PACKAGE_REMOVED" >

唯一的问题是AppStore会显示您使用的权限,如果代码显示在应用程序的manifest.xml中

<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED" />

在此示例中,您可以通过相同的符号键访问您的资源,但绝对不能广播包删除。

答案 2 :(得分:0)

复制自 Google Andorid Doc: 注意:系统不允许多个包声明同名权限,除非所有包都使用相同的证书签名。如果包声明了权限,则系统不允许用户安装具有相同权限名称的其他包,除非这些包使用与第一个包相同的证书签名。为避免命名冲突,我们建议对自定义权限使用反向域样式命名,例如 com.example.myapp.ENGAGE_HYPERSPACE。

https://developer.android.com/guide/topics/permissions/defining