Android 系统对 Binder Tokens 的使用

Android System's use of Binder Tokens

我正在 this 博客 post 上阅读有关在 Android 系统中使用 Binder 令牌的信息。我看到了与唤醒锁相关的示例,其中令牌用于识别来自同一应用程序的后续请求。

我想问一下为什么在Android系统中调用应用程序的UID不足以跟踪来自应用程序的后续请求?是否需要 Binder 令牌来满足 UID 在识别应用程序方面不能满足的要求?

Binder 令牌不像 uid 那样识别应用程序。令牌是一种能力或票证,这意味着 possession 才是最重要的。换句话说,使用活页夹令牌,什么并不重要,重要的是你是否拥有令牌。最后一部分是关键:在 Android 框架中,出于安全原因需要区分许多对象,但它们要么都具有相同的 uid(例如,system_server process space) and/or uid 未识别真正的主题(例如,Binder RPC 本地端的代码 运行)。

这种相对于 uid 的差异实现了不易实现的功能,甚至无法使用 uid。您引用的 blog post 就是一个很好的例子:

Applications can ask the InputMethodManager to hide the soft keyboard by calling the hideSoftInputFromWindow(IBinder windowToken, int flags) method, but must provide a window token as part of the request. If the token doesn't match the window token belonging to the window currently accepting input, the InputMethodManager will reject the request. This makes it impossible for malicious applications to force-close a soft keyboard opened by another application.

这里使用标记的主要原因是 window 对象不是具有 uid 的对象。当然,它是某处具有 uid 的某个进程的一部分,但无论 uid 是什么,它都不是试图隐藏软键盘的应用程序的 uid。因此,确保请求者拥有当前接受输入的 window 的唯一方法是强制应用程序提供在首次创建 window 时由 WindowManager 提供的令牌。