Android:AIDL 的安全 IPC 替代品?

标签 android ipc android-security android-binder

我正在尝试做的事情:在设备上安装的两个应用程序之间实现轻量级、安全 IPC 协议(protocol)。客户端应用程序应该能够向在服务应用程序中运行的 Service 发送命令和查询,并接收返回的计算结果。

应用关系:两个应用的源代码都在我的控制之下,但应用会有不同的签名(不可协商)。

安全要求:服务应用程序应向单个客户端提供服务。客户端的应用程序 ID(程序包名称)是已知且不变的。

我的尝试:我尝试使用双向 Messenger 通信方案(类似于 this blog post)实现 IPC。这种方法工作正常,但我遇到了一个主要问题——我找不到一种方法来获取客户端的 UID,因此我无法满足安全要求。

考虑在服务应用程序的 Service 中找到的这段代码:

// This messenger will be used by the clients of this service in order to send commands
private Messenger inboxMessenger = new Messenger(new Handler() {

    @Override
    public void handleMessage(Message msg)

        // TODO: verify the identity of the client

        switch (msg.what) {
            case MSG_GET_DATA:
                returnDataToClient(msg.replyTo);
                break;
        }
    }
});

这里的想法是,当客户端应用程序向此 Service 发送消息时,它将其本地“回调”Messenger 放入 replyTo已发送的 Message 的成员。 Messenger 的文档指出:

Note: the implementation underneath is just a simple wrapper around a Binder that is used to perform the communication.

所以我想我可以以某种方式映射 BinderMessenger#getBinder() 返回给客户端的 UID,但我现在遇到了麻烦:

  1. Messenger#getBinder() 返回 IBinder无法转换为 Binder
  2. 即使我设法获得对客户端 Binder 的引用,Binder#getCallingUid() 方法也是static 并且不接受争论...

因此,为了使这个特定的实现安全地工作,我需要找到一种方法来根据 Message 的内容或基于特定的Messenger 由客户端创建。由于 Android 的安全架构是围绕 Binders 构建的,因此没有将 Binders 映射到 UID(或包名称)的直接方法似乎很奇怪。 .. 那么,我该怎么做呢?

加分问题:除了 AIDL,Android 上还有其他 IPC 技术可以满足上述要求吗?

最佳答案

经过一些研究和实验后,我得出结论,在安全、签名保护的通信方面,Android 无法提供 AIDL 的替代方案。

好消息是 AIDL 并不难实现,关于这个特定主题的官方教程一点也不差。

关于Android:AIDL 的安全 IPC 替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34185108/

相关文章:

android - 没有蓝牙的蓝牙的phonegap权限

c++11 进程间原子和互斥锁

android - 如果应用程序被反编译,GoogleAuthUtils.getToken() 的安全性如何

android - Android 权限(我们在 list 文件中定义)与相应 API 调用/方法之间的映射

libpng - 安卓 : Removing OpenCV older version will resolve Libpng Vulnerability warning?

Android Nougat PopupWindow showAsDropDown(...)重力不起作用

java - Android 异步任务 ArrayList 操作导致 onDraw 中 IndexOutOfBounds

android - SignalR:从数据库向用户ID发送消息

Linux 程序之间的通信

java - .net<->Java 文本编码在开发环境中有效,但在 "production"处失败