9

我的应用程序使用 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 中的权限名称(抛出具有所需权限名称的异常)。

4

3 回答 3

5

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

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

是的,该系统可以滥用。

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

EDIT2:我觉得你在闭上眼睛看更大的 Android 应用程序安全图片时想多了。这并不令人印象深刻。滥用特权基础设施并不是入侵 Android 应用程序的方式。如果我开始拦截您的意图,我不会组装一个虚假的意图接收器(活动、服务)。相反,我会使用调试器将您的应用程序、签名和所有内容中的真正接收器连接起来。

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

于 2012-07-12T18:49:49.727 回答
0

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

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

例子:

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

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

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

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

于 2014-10-06T20:01:54.883 回答
0

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

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

于 2021-04-14T02:01:58.407 回答