Android允许开发者在manifest文件里声明和使用权限(permission)。声明的权限可以在不同的app里使用。如果不同的app声明了同名的权限,就可能会发生一些与预期不符的现象,并产生一些安全隐患。
在官方文档里,并没有找到Android如何裁定同名权限声明的资料。按照网上的一些说法以及实际发生的情况来看,第一个安装并声明权限的app,决定了这个权限的所有属性。后续安装app的权限声明将被忽略。
权限属性中比较重要的一个,保护级别(protectionLevel),决定了一个权限能否被使用。如果保护级别设为签名级别,那么只有第一个声明权限的应用可以使用这个权限,其他声明同名权限但签名不同的应用,会因为被第一个声明所覆盖,签名不符,而无法使用该权限。
更危险的是,如果一个关键app声明了签名权限,另外一个间谍软件声明了同名的正常权限,间谍软件先安装的话,会导致关键app的权限降级,间谍软件也就可以取得本该关键app才可取得的权限了。
Android 5.0对这种情况进行了一些修正。系统只允许签名相同的app,声明同名权限。后安装的,签名不同的app,会报INSTALL_FAILED_DUPLICATE_PERMISSION,应用无法安装。
参考资料:https://github.com/commonsguy/cwac-security/blob/master/PERMS.md(分析非常全面的一篇文章)