2012-07-12 77 views
9

我的应用程序使用android:protectionLevel =“signature”定义权限。如何防止其他应用程序定义相同的权限名称

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

我的意图是让应用程序模块只能通过我已签名的应用程序启动。这些应用程序模块在其活动中具有android:权限。 这工作正常。但是... 第三方应用程序可以使用相同的权限名称。如果我的应用程序第一次安装改变了保护级别设置为正常,像这样

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

,我就可以防止其他人的应用程序覆盖的权限。但是,如果有人卸载我的应用程序,然后安装他的应用程序,则重新定义权限。

是否有可能阻止其他应用程序中使用相同的权限名称,例如,给予许可,如应用程序包一个唯一的ID?

虽然清单是加密的,当它试图启动需要这个权限(将抛出一个异常具有所需的权限名)活动任何人都可以读取日志猫权限名称。

+0

好问题,我的猜测是你没有办法限制其他应用程序这样做。 – FoamyGuy 2012-07-12 18:42:56

+0

这是一个安全问题。我无法保证我签名的应用程序模块只会启动我已签名的核心应用程序,因为未签名的应用程序可以取代定义低级别保护的权限,然后使用我签名的模块。 – Dennix 2012-07-12 19:05:46

+0

您可以通过使用不同的软件包名称,签名和protectionLevel = normal来创建应用的修改版本来设置测试。看看两个应用程序在同一台设备上会发生什么。我的猜测是,a)签名检查将首先启动,并确保流氓应用程序无法访问需要正确签名的应用程序。和b)具有不同保护级别的相同许可字符串可以共存于同一设备上。 – tiguchi 2012-07-12 19:08:00

回答

5

没有执法,只有惯例。与Java世界的其他部分一样,它松散地依赖于域名注册基础设施。这个想法是,你用你自己的公共互联网域名(例如com.myawesomecompany.myapp.MYPERMISSION)作为你的权限名称的前缀。

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

是的,系统开放滥用。

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

EDIT2:我觉得你这个得太多,而在更大的Android应用程序的安全性图片闭上眼睛。这并不令人印象深刻。滥用特权基础设施并不是如何侵入Android应用程序。如果我着手拦截你的意图,我不会把一个假的意图接收者(活动,服务)放在一起。相反,我会将调试器连接到应用中的真正接收器,签名和全部。

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

+0

尽管我使用我的公共互联网域名作为我的权限的前缀,但它不会避免另一个应用程序使用相同的前缀。 我认为Android应该将权限名称与应用程序的包名称绑定。 – Dennix 2012-07-12 18:54:59

+0

就像我说过的 - 它对于故意滥用是开放的。 – 2012-07-12 18:55:41

+0

我认为Android应该将权限名称和应用程序的包名称联系起来。因此,两个不同的应用程序不会有相同的权限定义。 – Dennix 2012-07-12 18:58:33

0

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

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

例如:

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

唯一的问题是AppStore上会显示您所使用的权限,如果下面的代码显示应用程序的清单。XML

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

在这个例子中,你可以访问你用相同的符号关键资源,但绝对不能广播包中取出。

相关问题