关于AIDL调用的安全机制(存在2个AIDL的被调用方)
之前做AIDL的时候,只考虑了AIDL的1对1的调用。今天考虑到项目安全性,跟大家讨论后发现了如下问题。
为了与之前的博文http://blog.csdn.net/singleton1900/article/details/8434643描述风格表述一致,现在还是以AIDL服务端(被调用端),以及AIDL客户端(调用端)来表述。
这个问题就是:AIDL客户端唯一,AIDL服务端存在2个,且都实现了AIDL接口,接口的入口地址(BIND_ACTION)也一样。
现在,客户端会调用哪个服务端?
回答这个问题最直观的方法就是测试。
经过测试,AIDL客户端始终会调用先安装的AIDL服务端apk。将先安装的AIDL服务端apk卸载后,才会调用后安装的AIDL服务端apk。
因此,使用AIDL作为项目之间的接口可能存在一定的风险。
如何规避这个风险,网上有文章说,在IBinder里面的onTransact函数中调用Binder.getCallingUid()和Binder.getCallingPid()来判断外来方的身份。
但这个方法,只能是被调用方检测调用方的身份。
如果一个第三方应用(调用方)通过AIDL使用支付应用(被调用方)完成购买操作,现在有不法分子获得了双方AIDL接口以及绑定的入口,他就可以伪造一个假的支付应用(将之前的支付应用干掉),从而获取用户的银行密码等重要信息。而上面的那个方法,则无法对这个事例做出相应的安全处理。因为被调用方都不存在了,还怎么检测;况且,检测到的,也还是正常的第三方应用的身份。
有一种解决方案,就是在调用方调用被调用方的时候,检测被调用方的Uid和Pid,如果Uid或Pid异常,就判定是非法被调用方,终止调用。
但这个方法具体怎么实现,现在还不知道。
等了解了,我会更新下这篇博文。
当然如果有大神了解,还请不吝赐教~