【问题标题】:How to prevent other applications from define same permission name如何防止其他应用程序定义相同的权限名称
【发布时间】:2012-07-12 18:39:18
【问题描述】:

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

【问题讨论】:

  • 好问题,我猜你无法限制其他应用程序这样做。
  • 这是一个安全问题。我不能允许我的签名应用程序模块将仅启动我签名的核心应用程序,因为未签名的应用程序可以替换我定义低级别保护的权限,然后使用我的签名模块。
  • 您可以通过创建具有不同包名称、签名和 protectionLevel=normal 的应用的修改版本来设置测试。看看当两个应用程序在同一台设备上时会发生什么。我的猜测是,a) 签名检查将首先启动,并确保流氓应用程序无法访问需要正确签名的应用程序。 b) 具有不同保护级别的相同权限字符串可以在同一设备上共存。
  • @Dennix 您必须添加另一层安全性的一个选项是将某种加密的 Extra 添加到您用于启动模块活动的意图中。并以这样的方式对它们进行编程,如果这个额外的不存在并且适合简单地关闭而不做任何事情。这样,如果您的模块活动是从其他来源启动的,他们将不会有这个额外的,并且模块似乎什么都不做。

标签: android permissions


【解决方案1】:

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

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

是的,该系统已被滥用。

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

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

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

【讨论】:

  • 即使我使用我的公共互联网域名来为我的权限添加前缀,但它并不能避免其他应用程序使用相同的前缀。我认为Android应该将权限名称与应用程序的包名称联系起来。
  • 就像我说的 - 它可以被蓄意滥用。
  • 我认为Android应该将权限名称与应用程序的包名称联系起来。因此,两个不同的应用程序不会有相同的权限定义。
  • 我从未尝试过,但很有可能在安装包时检查权限名称冲突。可以设置一个实验 - 创建一个故意的冲突(具有不同的签名,不少于),并尝试在设备上安装这两个包。我怀疑第二个 APK 会失败。
  • 我做了这个测试。第二个 apk 安装正常,但权限定义仍然来自第一个 apk。问题是当卸载第一个 apk 并安装第二个 apk 时重新定义权限。
【解决方案2】:

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

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

示例:

<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" />

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-12
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      相关资源
      最近更新 更多