Android绑定器安全性

Android中的Binder提供的进程间通信是否可以防止中间人攻击? 有没有提供这些信息的文件?

Solutions Collecting From Web of "Android绑定器安全性"

Binder使用基于能力的安全模型。 每个binder对象代表一个能力; 将该对象交给另一个进程将授予该进程访问该function的权限。 从这个angular度来看,你可以通过不把重要的粘合剂物体交给中间的人来阻止中间人的攻击。 如果一个进程没有得到一个活页夹对象,它不能以任何方式访问它。

关于本文讨论的“交叉绑定引用伪造”问题,如果我正在理解他们正在讨论的具体情况,我认为他们关于用户空间的附录比我认同的要弱一些。 他们犯了错误,我想看看为ServiceManager编写的特殊C代码。 在forms上,我认为C ++用户空间代码(特别是Parcel)是Binder体系结构的一部分。 当你调用它的readBinder()和相关的方法时,这个代码特别确保在欺骗时处理这种尝试。

我不同意内核不能完全确保数据完整性的缺陷。 我能想象得到的唯一方法就是为绑定事务定义一个标准的types化的数据结构,以便它可以读取和validation包裹的内容。 这在我看来对内核知识太多了,没有真正的好处。 无论你放在那里多less,用户空间都需要对传入的事务进行一些validation,以确保它符合预期。 今天,这是在validationParcel(readBinder(),readString16(),readInt()等)上的原始数据读取操作被写入以避免攻击的级别来完成的。 对内核进行更多的validation仍然需要在用户空间中validation数据types是否正确,而现在实际上已经将用户空间到内核的一些攻击机会(由于此代码中的错误)提供了一些机会。

关于活页夹安全性的最后一件事是,认识到在平台级别上有另一个在活页夹基础结构上实施的重要安全模型是很重要的。 这是基于权限/基于uid的系统,其中服务可以检查传入呼叫的​​uid,以validation它们是否符合其允许的权限。

这个安全模型还有一个必须处理的欺骗漏洞。 一个典型的场景是一个接收活动pipe理器服务的IBinder的应用程序(因为每个人都可以得到这个)。 活动pipe理器服务的API深深地基于检查传入呼叫的​​uid来确定什么是允许的 – 例如,如果对bindService()进行了调用,它将检查该uid是否有权限绑定到给予服务。 恶意应用程序可以尝试通过将活动pipe理器IBinder交给另一个系统服务来玩游戏,例如作为窗口pipe理器的IWindow。 如果它知道第二个系统服务将进行的事务,它可以设置事件,以便它调用它认为是re​​sizeWindow(),但实际上当它被放入活动时变成对bindService()的调用pipe理器(如果这两个调用映射到相同的事务ID)。

存在这个漏洞是因为活页夹系统没有以任何方式input,“方法”调用仅仅是使用整数事务代码和数据缓冲区发送的事务。

为了防止这种情况发生,由aidl生成的用户空间types化的接口总是在它们的事务缓冲区的起始处放置它们打算调用的接口的名字,并且事务的接收代码检查缓冲区前面的接口名称以确保它符合自己的接口。 这样,当活动pipe理器看到它有一个接口是一个窗口的来电时,上面的场景中的欺骗者将被捕获。

无论如何,对于Android开发人员最实际的使用,基于uid的安全性与核心活页夹function模型一样重要。 在某些情况下,您将通过限制哪些进程访问活页夹来强制安全。 一个例子就是如何有一个IBinder表示每个活动,只有系统进程和运行活动的进程共享。

在其他情况下,IBinder对象将与任何感兴趣的进程共享,但在基于uid的调用点上执行安全性。 如果您正在使用aidl来提供这些接口的标准实现,则可以根据您要应用于uid的含义来完成您自己的这种安全性实现。 例如,您可以使用标准设施将关联的权限与uid关联,并询问包pipe理器,如果传入的uid具有权限。

活页夹有一个确定的安全缺陷,可能会使其易受MITM攻击: http : //crypto.hyperlink.cz/files/xbinder.pdf 。 引用TFA:

攻击者可以pipe理目标进一步传递或调用其“受保护的”绑定(即攻击者不被直接调用)。 我们称之为交叉粘合剂参考伪造(XBRF)

作者继续说,Android有抵御这种攻击的防御,但是

在某些情况下,对攻击过程准备的交易数据进行仔细的处理可能仍然会导致XBRF的成功利用

一个人得到这样的印象,即Binder似乎对于编写精心编写的代码比较安全,但是存在一些风险。