Fuzz 技术的挖掘 Android 漏洞和如何防御经验分享
1 基础知识 1.1 Android 的 Binder 机制
1.1.1 Binder 概述
Binder 其实也不是 Android 提出来的一套新的进程间通信机制,它是基于 OpenBinder 来实现的。
Binder 是一种进程间通信机制,它是一种类似于 COM 和 CORBA 分布式组件架构,是提供远程过程
调用(RPC)功能。
什么是 Binder
直观来说,Binder 是 Android 中的一个类,它继承了 IBinder 接口 从 IPC 角度来说,Binder 是 Android
中的一种跨进程通信方式,Binder 还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,
该通信方式在 Linux 中没有 从 Android Framework 角度来说,Binder 是 ServiceManager 连接各种
Manager(ActivityManager、WindowManager,etc)和相应 ManagerService 的桥梁 从 Android 应
用层来说,Binder 是客户端和服务端进行通信的媒介,当你 bindService 的时候,服务端会返回一个
包含了服务端业务调用的 Binder 对象,通过这个 Binder 对象,客户端就可以获取服务端提供的服务
或者数据,这里的服务包括普通服务和基于 AIDL 的服务
在 Android 系统的 Binder 机制中,由一系统组件组成,分别是 Client、Server、Service Manager 和
Binder 驱动程序,其中 Client、Server 和 Service Manager 运行在用户空间,Binder 驱动程序运行内
核空间,如图 1-1 所示。Binder 就是一种把这四个组件粘合在一起的粘结剂,其中核心组件便是 Binder
驱动程序了,Service Manager 提供了辅助管理的功能,Client 和 Server 正是在 Binder 驱动和 Service
Manager 提供的基础设施上,进行 Client-Server 之间的通信。Service Manager 和 Binder 驱动已经在
Android 平台中实现好,开发者只要按照规范实现自己的 Client 和 Server 组件就可以了。
这里写图片描述
图 1-1 Binder 架构图
1.1.2 为什么使用 Binder
Android 中有大量的 CS(Client-Server)应用方式,这就要求 Android 内部提供 IPC 方法,而 linux
所支持的进程通信方式有两个问题:性能和安全性。
目前 linux 支持的 IPC 包括传统的管道,System V IPC(消息队列/共享内存/信号量),以及 socket,但
只有 socket 支持 Client-Server 的通信方式,由于 socket 是一套通用的网络通信方式,其传输效率低