【问题标题】:Control access of third party APIs to Android system resources?控制第三方 API 对 Android 系统资源的访问?
【发布时间】:2016-05-29 06:05:42
【问题描述】:

当您在 Android 项目中导入第三方 API(数据包依赖项注入、生成的库、源代码等)时,您会假设它们的行为与宣传的一样。大多数时候代码不是开源的,它被混淆或只是编译。

有没有办法控制此 API 对重要系统资源(如网络、联系人、视频和音频、位置)的访问?

最好的方法是为他们提供proxy 以获取系统资源。这将有以下好处:

  • 可以通过在代理中提供模拟数据来执行测试
  • 您的应用程序不必提供 API 所需的所有权限(如果它们不是必需的),并且代理会通过模拟授予的权限允许 API 不会因为权限而中断
  • 过滤在本地收集的关于用户的可能数据并发送到 API 主存储库,用于广告或恶意意图

由于用户定义的活动和服务无法控制第三方 API 的服务,甚至无法阻止它们直接调用任何 Android 公共接口,因此我无法找到如何实现这样的解决方案。

该解决方案不应要求 root 访问权限,因为您不希望在自己的应用程序边界之外拥有此控件。

这个问题的内容与几个问题相关联,这些问题解决了这个广泛问题的特殊性(log data of content providersnetwork requests - 这让我在研究这个问题的答案时想到了这个问题)

注意:简短的回答是否定的,但一个人可以有足够的创造力(也许去本地级别的黑客可能会解决这个问题 - idk)

【问题讨论】:

  • 您可以在单独的沙盒进程中运行该代码,该进程没有权限。但是,由于通常该代码会期望具有某些权限,因此该代码可能会崩溃。如果该库支持依赖注入,或许着眼于用于测试的模拟,您可能能够安装一种方法,将使用 IPC 从沙箱进程注入到您自己的“模拟”,以管理对受保护 API 的访问。但是,很少有图书馆会支持这一点。
  • @CommonsWare 是测试这一点的好方法,尽管有些恶意软件可以检测到它们何时处于测试状态,如果你所追求的是恶意意图。但是,如果您不打算构建新框架并仍然使用 API,那么问题仍然存在

标签: android api proxy android-security


【解决方案1】:

在名为 com.myproxies 的包中为您想要保护的所需 Android 资源构建代理类(例如 MediaRecorder、SensorManager、Camera、java.net.HTTPURLConnection)。在代理中,您需要实现所有的公共方法您正在模拟的类,您需要实现逻辑以允许访问(转发到适当的方法)或拒绝。一个有用的步骤是检查caller of the method

  • 如果您打算导入源代码,请重构代码以将包更改为您的代理(proguard 可以帮助您解决此问题)。

  • 如果您使用库,请获取 Jar Jar Links,这是一个实用程序,可轻松重新打包 Java 库并将它们嵌入到您自己的发行版中,并在内部将包名称更改为包中类的名称这将用作代理。

  • 如果你使用Maven或者Gradle包依赖注入,你也可以尝试导入Jar Jar Links并在编译时进行包重构(不太确定能不能做到)

不幸的是,根据我自己的经验,破坏 API 非常容易,并且涉及大量的体力劳动。

【讨论】:

    猜你喜欢
    • 2018-08-16
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2015-09-07
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    相关资源
    最近更新 更多