Android安全模型之Android安全机制(进程通讯)

进程通讯是应用程序进程之间经过操做系统交换数据与服务对象的机制。Linux操做系统的传统进程间通讯(IPC)有多种方式,好比管道,命令管道,信号量,共享内存,消息队列,以及网络与Unix套接字等。虽然理论上Android系统仍然可使用传统的Linux进程通讯机制,可是在实际中,Android的应用程序几乎不使用这些传统方式在Android的应用程序设计架构下,甚至看不到进程的概念,取而代之的是从组件的角度,如Intent,Activity,Service,Content Provider,实现组件之间的相互通讯。Android应用程序一般由一系列Activity和Service组成的,通常Service运行在独立的进程中, Activity既可能运行在同一个进程中,也可能运行在不一样的进程中。在不一样进程中的Activity和Service要协做工做,实现完整的应用功能,必须进行通讯,以获取数据与服务。这就回归到历史久远的Client-Server模式。基于Client-Server的计算模式普遍应用于分布式计算的各个领域,如互联网,数据库访问等。在嵌入式智能手持设备中,为了以统一模式向应用开发者提供功能,这种Client-Server方式无处不在。Android系统中的媒体播放,音视频设备,传感器设备(加速度,方位,温度,光亮度等)由不一样的服务端(Server)负责管理,使用服务的应用程序只要做为客户端(Client)向服务端(Server)发起请求便可。java

可是,Client-Server方式对进程间通讯机制在效率与安全性方面都是挑战数据库

  • 效率问题。传统的管道,命名管道,网络与UNIX套接字,消息队列等须要屡次复制数据数据先从发送进程的用户区缓存复制到内核区缓存中,而后再从内核缓存复制到接收进程的用户区缓存中,单向传输至少有两次复制),系统开销大传统的共享内存(shmem)机制无需将数据从用户空间到内核空间反复复制,属于低层机制,但应用程序直接控制十分复杂,于是难以使用编程

  • 安全问题。传统进程通讯机制缺少足够的安全措施:首先,传统进程通讯的接收进程没法得到发送进程可靠的用户标识/进程标识(UID/PID),于是没法鉴别对方身份Android的应用程序有本身UID,可用于鉴别进程身份。在传统进程通讯中,只能由发送进程在请求中自行填入UID与PID,容易被恶意程序利用,是不可靠的。只有内置在进程通讯机制内的可靠的进程身份标记才能提供必要的安全保障。其次,传统进程通讯的访问接入点是公开的,如FIFO与unix domain socket的路径名,socket的ip地址与端口号,lSystem V键值等,知道这些接入点的任何程序均可能试图创建链接,很难阻止恶意程序得到链接,如经过猜想地址得到链接等。缓存

Android基于Dianne Hackborm的OpenBinder实现,引入Binder机制以知足系统进程通讯对性能效率和安全性的要求。Binder基于Client-Server通讯模式,数据对象只需一次复制而且自动传输发送进程的UID/PID信息,同时支持实名Binder与匿名Binder。Binder其实提供了远程过程调用(RPC)功能,概念上相似于COM和CORBA分布式组件架构。对于熟悉Linux环境的程序设计者而言,从Linux意义的进程通讯角度来看,Android的进程通讯原理以下图所示:安全


Binder进程通讯机制由一系列组件组成:ClientServerService Manager,以及Binder Driver。其中,Client,Server和Service Manager是用户空间组件,而Binder Driver运行于内核空间用户层的Client和Server基于Binder Driver和Service Manager进行通讯。开发者一般无需了解Binder Driver与Service Manager的实现细节,只要按照规范设计实现本身的Client和Server组件便可。从Android应用程序设计的角度来看,进程通讯机制以下图:网络

在系统安全设计方面,Android的进程通讯机制设计具有优于传统Linux的重要优点架构

  • Android应用基于权限机制,定义进程通讯的权限,相比传统Linux IPC具备更细粒度的权限控制。dom

  • Binder进程间通讯机制具有类型安全的优点。开发者在编译应用程序时,使用Android接口接描述语言(AIDL)定义交换数据的类型,确保进程间通讯的数据不会溢出越界污染进程空间。socket

  • Binder经过Android的共享内存机制(Ashmem)实现高效率的进程通讯,而不是采用传统的Linux/UNIX共享内存(Shared Memory),也具有特殊的安全含义。编程语言

Android在Binder进程通讯机制中采用Android接口描述语言(AIDL。AIDL同传统RPC中的IDL语言同样,根据描述能够生成代码,使两个进程经过内部通讯进程进行交互。例如,在一个Activity(一个进程)中访问一个Service(另外一个进程)的对象/服务,使用AIDL定义接口与参数并实如今进程间的传递。AIDL IPC的机制是基于接口的,相似于COM与Corba,但更为轻量级,使用代理类在客户端和实现层间传递值。

AIDL的接口定义与参数描述是类型安全的,与程序设计语言中的类型安全概念一致。Android应用程序使用java语言编写。Java语言就具有所谓的“类型安全”特性,是一种强类型化的编程语言, 它强制不一样内容遵循规定的数据格式,进而防止错误或恶意应用。不完整的类型安全与边界检查机制极易受到内存污染或缓冲区溢出攻击,进而致使任意代码,甚至恶意代码的运行。可是,在C/C++程序设计中,容许未经类型检查的强制类型转换,并且,除非编程者专门编程进行边界检查,不然C语言自己不要求边界检查。实践证实,这些C/C++语言的灵活性恰成为恶意代码攻击的目标。Android系统原生库容许采用C/C++编程,存在必定的安全隐患,须要其余特殊技术加以防范。传统Linux的进程通讯机制虽然有用户权限的限制,但缺乏强制的类型安全

因为类型安全的接口与数据描述,在接收方从其余进程接收数据时,能够充分检查安全性,确保其余进程发来的参数都在可接受的范围内,而无论调用者想要干什么,均可以防止进程间通讯的数据溢出越界污染进程空间。

相关文章
相关标签/搜索