checkCallingOrSelfPermission

checkCallingOrSelfPermission

我正在查看Context类中的checkCallingOrSelfPermission(),并想知道如何利用它。即,如果某个应用程序触发了被调用者/您的应用程序的方法,该方法又调用checkCallingOrSelfPermission(),最终将访问权限授予其他应用程序,或者释放了本来需要该权限的敏感信息。

这是我通过Java Doc后了解的:

此方法只能由与被调用方应用程序处于同一过程的任何调用应用程序利用。为了进入相同的过程,两个应用程序还需要在 list 文件中具有相同的shareuserid和进程,并且还必须由相同的证书签名。

因此,调用应用程序需要执行以下操作。

  • 必须知道被调用方应用程序在哪个进程和共享用户ID下运行。 (我不确定这有多可行?)
  • 必须使用与被调用方应用程序签名时所使用的证书相同的证书进行签名(不太可能假定该证书是安全的)。

  • 这是checkCallingOrSelfPermission()文档所警告的一种利用方法,或者还有其他(更现实的)可以利用它的方法。

    我还检查了this post,但是答案并不令人满意。

    最佳答案

    通常情况下,Binder.callingPid() == Process.myPid()成立。这在处理IPC请求时会发生变化,系统会修改Binder存储的主叫PID值,并将其分配给调用方应用程序的PID。但是,此更改仅影响执行远程调用方法的线程,在其他线程中,相等性仍然成立。因此,如果在这样一个不受影响的线程中调用checkCallingOrSelfPermission(),它将返回PERMISSION_GRANTED(前提是服务应用程序拥有该权限),并且可能发生泄漏(或其他圣经后果)。

    或者,如果在clearCallingIdentity()之前调用checkCallingOrSelfPermission(),可能会出现相同的问题,尽管我相信这种情况不太可能发生。

    已在Nexus 6P,Android 6.0.1(MHC19I)上进行了测试。

    09-30 21:05