Android系统对Binder Tokens的使用

5
我正在阅读有关在Android系统内使用Binder令牌的内容,该内容可以在博客文章中找到。我看到了与wakelocks相关的示例,其中令牌用于识别来自同一应用程序的后续请求。
我想问为什么在Android系统中,调用应用程序的UID不足以跟踪应用程序的后续请求?是否有任何需要Binder令牌满足而UID不能完成的内容,以确定应用程序的身份?
1个回答

8
一个 Binder 令牌不像 uid 那样标识应用程序。令牌是一种能力或凭证,这意味着关键在于拥有。换句话说,使用 Binder 令牌时,无论你是或者什么,只要你拥有该令牌就可以了。这最后一点非常重要:在 Android Framework 中,有许多需要出于安全考虑进行区分的对象,但它们都具有相同的 UID(例如,system_server 进程空间中的对象)和/或 UID 不能识别真正的主体(例如,在 Binder RPC 的本地端运行的代码)。
与 UID 相比,这种差异使得一些功能变得更加容易实现甚至可能实现不了。你提到的 博客文章 就是一个很好的例子。
应用程序可以通过调用 hideSoftInputFromWindow(IBinder windowToken,int flags)方法来请求 InputMethodManager 隐藏软键盘,但必须提供窗口标记作为请求的一部分。如果令牌与当前接受输入的窗口所属的窗口令牌不匹配,则 InputMethodManager 将拒绝该请求。这使恶意应用程序无法强制关闭由另一个应用程序打开的软键盘。
使用令牌的主要原因是窗口对象不是具有 uid 的东西。当然,它是某个进程的一部分,该进程具有 uid ,但是无论该 uid 是什么,它都不是尝试隐藏软键盘的应用程序的 uid 。因此,确保请求方拥有当前接受输入的窗口的唯一方法是强制应用程序提供其在窗口首次创建时由 WindowManager 给出的令牌。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接