Android:AIDL 的安全 IPC 替代品?
Android: secure IPC alternative to AIDL?
我正在尝试做的事情: 在设备上安装的两个应用程序之间实施轻量级、安全 IPC 协议。客户端应用程序应该能够在服务应用程序中向 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
发送消息时,它会将其本地 "callback" Messenger
放入发送的 replyTo
成员 Message
。 Messenger
的文档指出:
Note: the implementation underneath is just a simple wrapper around a
Binder that is used to perform the communication.
所以我想我可以通过某种方式将 Messenger#getBinder()
返回的 Binder 映射到客户的 UID
,但我现在遇到了麻烦:
Messenger#getBinder()
returns IBinder 无法转换为 Binder
- 即使我设法获得对客户
Binder
的引用,方法 Binder#getCallingUid()
是 static
并且不接受参数...
因此,为了使这个特定的实现安全地工作,我需要找到一种方法来根据 Message
的内容或基于特定的 Messenger
来获取调用者的 UID
] 由客户创建。由于 Android 的安全架构是围绕 Binders
构建的,因此没有直接的方法将 Binders
映射到 UIDs
(或包名称)似乎很奇怪......所以,我该怎么做?
加分问题:除了 AIDL,Android 上还有其他 IPC 技术可以满足上述要求吗?
经过一些研究和实验,我得出结论,Android 在安全、签名保护通信方面无法提供 AIDL 的替代方案。
好消息是 AIDL 并不难实现,关于这个特定主题的官方教程一点也不差。
您可以在服务器端检查客户端的签名,以确保它是合格的。
我正在尝试做的事情: 在设备上安装的两个应用程序之间实施轻量级、安全 IPC 协议。客户端应用程序应该能够在服务应用程序中向 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
发送消息时,它会将其本地 "callback" Messenger
放入发送的 replyTo
成员 Message
。 Messenger
的文档指出:
Note: the implementation underneath is just a simple wrapper around a Binder that is used to perform the communication.
所以我想我可以通过某种方式将 Messenger#getBinder()
返回的 Binder 映射到客户的 UID
,但我现在遇到了麻烦:
Messenger#getBinder()
returns IBinder 无法转换为Binder
- 即使我设法获得对客户
Binder
的引用,方法Binder#getCallingUid()
是static
并且不接受参数...
因此,为了使这个特定的实现安全地工作,我需要找到一种方法来根据 Message
的内容或基于特定的 Messenger
来获取调用者的 UID
] 由客户创建。由于 Android 的安全架构是围绕 Binders
构建的,因此没有直接的方法将 Binders
映射到 UIDs
(或包名称)似乎很奇怪......所以,我该怎么做?
加分问题:除了 AIDL,Android 上还有其他 IPC 技术可以满足上述要求吗?
经过一些研究和实验,我得出结论,Android 在安全、签名保护通信方面无法提供 AIDL 的替代方案。
好消息是 AIDL 并不难实现,关于这个特定主题的官方教程一点也不差。
您可以在服务器端检查客户端的签名,以确保它是合格的。