我在Context类中经历了checkCallingOrSelfPermission(),并想知道它是如何被利用的;即,如果某个应用程序触发了被调用者/您的应用程序的方法,该方法又调用checkCallingOrSelfPermission(),最后将该权限授予其他应用程序,或者发布否则需要该权限的敏感信息.
这是我通过Java Doc后所理解的:
此方法只能由处于被调用者应用程序的同一进程中的任何调用应用程序利用.要进入相同的过程,除了同样的证书签名之外,应用程序还需要在清单文件中具有相同的shareuserid和进程.
因此调用应用程序需要执行以下操作.
>必须知道callee应用程序正在运行的进程和共享用户标识. (我不确定这有多可行?)
>必须使用与被调用者应用程序签署的相同证书进行签名(不太可能假设证书保持安全).
这是checkCallingOrSelfPermission()文档警告的利用方法,还是其他(更现实的)方法可以被利用.
我也查了this post,但答案并不理想.
解决方法
在正常情况下Binder.callingPid()== Process.myPid()成立.当处理IPC请求时,系统会修改Binder存储的调用PID值,它会将其分配给调用者应用程序的PID.但是,此更改仅影响执行remotelly调用方法的线程,在其他线程中,相等性仍然存在.因此,如果在这样一个未受影响的线程中调用checkCallingOrSelfPermission(),它将返回PERMISSION_GRANTED(假设服务应用程序持有该权限)并且可能发生泄漏(或其他圣经后果).
或者,如果在checkCallingOrSelfPermission()之前调用clearCallingIdentity(),则会出现同样的问题,尽管我认为它不太可能发生.
在Nexus 6P,Android 6.0.1(MHC19I)上测试.