binder安全性binder安全性

频道:财经问答 日期: 浏览:0

大家好,关于binder安全性很多朋友都还不太明白,今天小编就来为大家分享关于安全性的知识,希望对各位有所帮助!

本文目录

Android为什么选择binderBinder机制概述Android bind通信对性能影响深入理解BinderAndroid为什么选择binderBinder主要能提供以下一些功能:

用驱动程序来推进进程间的通信。

通过共享内存来提高性能。

为进程请求分配每个进程的线程池。

针对系统中的对象引入了引用计数和跨进程的对象引用映射。

进程间同步调用。

AndroidBinder设计与实现–设计篇:

目前linux支持的IPC包括传统的管道、SystemVIPC、即消息队列/共享内存/信号量,以及socket中只有socket支持Client-Server的通信方式。

当然也可以在这些底层机制上架设一套协议来实现Client-Server通信,但这样增加了系统的复杂性,在手机这种条件复杂,资源稀缺的环境下可靠性也难以保证。

另一方面是传输性能:

socket作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。

消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,

至少有两次拷贝过程。共享内存虽然无需拷贝,但控制复杂,难以使用。

还有一点是出于安全性考虑:

Android作为一个开放式,拥有众多开发者的平台,应用程序的来源广泛,确保智能终端的安全是非常重要的。

终端用户不希望从网上下载的程序在不知情的情况下偷窥隐私数据,连接无线网络,长期操作底层设备导致电池很快耗尽等等。传统IPC没有任何

安全措施,完全依赖上层协议来确保。首先传统IPC的接收方无法获得对方进程可靠的UID/PID(用户ID/进程ID),从而无法鉴别对方身份。

Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志。使用传统IPC只能由用户在数据包里填入UID/PID,

但这样不可靠,容易被恶意程序利用。可靠的身份标记只有由IPC机制本身在内核中添加。其次传统IPC访问接入点是开放的,无法建立私有通道。

比如命名管道的名称、systemV的键值、socket的ip地址或文件名都是开放的,只要知道这些接入点的程序都可以和对端建立连接,不管怎样都无法

阻止恶意程序通过猜测接收方地址获得连接。

基于以上原因,Android需要建立一套新的IPC机制来满足系统对通信方式,传输性能和安全性的要求,这就是Binder。

Binder基于Client-Server通信模式,传输过程只需一次拷贝,为发送发添加UID/PID身份,既支持实名Binder也支持匿名Binder,安全性高。

面向对象的BinderIPC:

面向对象思想的引入将进程间通信转化为通过对某个Binder对象的引用调用该对象的方法,而其独特之处在于Binder对象是一个

可以跨进程引用的对象,它的实体位于一个进程中,而它的引用却遍布于系统的各个进程之中。最诱人的是,这个引用和java里引用

一样既可以是强类型,也可以是弱类型,而且可以从一个进程传给其它进程,让大家都能访问同一Server,就像将一个对象或引用赋

值给另一个引用一样。Binder模糊了进程边界,淡化了进程间通信过程,整个系统仿佛运行于同一个面向对象的程序之中。

面向对象只是针对应用程序而言,对于Binder驱动和内核其它模块一样使用C语言实现,没有类和对象的概念。

Binder驱动为面向对象的进程间通信提供底层支持。

Binder机制概述Android进程间通讯是通过Binder机制来实现的,Android是基于linux系统因此有必要了解Linux系统进程相关知识.

Linux系统中(其他系统也是这样)不同进程之间不允许直接操作或访问另一进程.也就是进程隔离.

为了保证用户进程不能直接访问内核,操作系统从逻辑上将虚拟空间划分为用户空间和内核空间.内核程序运行在内核空间(kernelspace),应用程序运行在用户空间(userspace).为了安全,他们之间是隔离的,即使用户程序奔溃了,也不会影响内核.内核空间数据是可以共享的,用户空间不可以.

用户空间访问内核空间只能通过系统调用,系统调用是用户空间访问内核空间的唯一方式,保证所有资源访问在内核控制下,避免了用户对系统资源的越权访问,提高了系统安全性和稳定性.

copy_from_user:将用户空间数据拷贝到内核空间

copy_to_user:将内核空间数据拷贝到用户空间

由于用户进程不能直接访问硬件地址,所以系统提供了一种机制:内存映射(MemoryMap).在Linux中通过调用函数mmap实现内存映射,将用户空间一块内存地址映射到内核空间.映射关系建立后,对用户空间内存的修改可以反应到内核空间.内存映射可减少拷贝次数.

如果没有内存映射,用户进程需要访问硬盘文件时,需要在内核空间创建一片页缓存,将硬盘文件数据拷贝到页缓存然后用户进程在拷贝页缓存数据,需要两次拷贝.通过内存映射后硬盘文件可以和内核的虚拟内存直接映射,减少一次拷贝.

如图

inter-process-communication进程间通信,指进程间交换数据的过程.

Linux提供了很多进程间通讯的机制,主要有管道(pipe)、消息队列(Message)、信号(sinal)、信号量(semophore)、套接字(socket)等

内核程序在内核空间分配并开辟一块内核缓冲区,发送进程将数据通过copy_from_user拷贝到内核空间的数据缓冲区,内核空间通过copy_to_user将数据拷贝到接收进程,这样就实现了一次进程间通信.如图

Linux的IPC机制有两个问题:

1.数据通过用户空间->内核空间->用户空间,经过两次拷贝,效率不高

2.接收进程无法预先知道数据大小,只能尽可能大创建数据缓冲区,或通过api消息头获取消息体的大小,浪费了空间或时间.

Android进程间通信通过Binder实现,下面介绍Binder机制通信原理,为什么是Binder

内核程序创建一个数据接收缓存区,同时创建一个内核缓冲区.并建立内核缓冲区和数据接收缓冲区内存映射,以及数据内核缓冲区和接收进程用户空间的映射关系.发送进程通过copy_from_user将数据拷贝到内核数据接收缓冲区,因为内核数据接收缓冲区和内核缓冲区以及接收进程用户空间存在映射关系,相当于将数据发送到了接收进程.完成了一次进程间通信.如图

Binder机制是c/s架构的,由Client、server、ServiceManager和Binder组成.client、server和serviceManager都是独立的进程,由于Linux进程隔离的原因,所以需要借助Binder进行通信.

Binder通信主要有三个步骤:注册服务、获取服务、使用服务.如下图

从上一条Binder实现原理示例图中可以看到,Binder可分为JavaBinder、NativeBinder和KernalBinder.应用开发需要了解JavaBinder和NaviveBinder.这里只介绍Binder基本原理.具体可查看文章结尾的链接.

感谢

https://blog.csdn.net/itachi85/article/details/102713845

https://www.jianshu.com/p/429a1ff3560c

https://blog.csdn.net/carson_ho/article/details/73560642?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159651217319195188353096%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159651217319195188353096&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~rank_business_v1-1-73560642.ecpm_v3_rank_business_v1&utm_term=Binder&spm=1018.2118.3001.4187

Android bind通信对性能影响您好,您是想问Androidbind通信对性能有什么影响事吗?

为什么要使用Binder性能。主要影响的因素是拷贝次数:管道、消息队列、Socket的拷贝次书都是两次,性能不是很好;共享内存不需要拷贝,性能最好;Binder拷贝1次,性能仅次于共享内存;Linux下传统的进程间通信原理与不足。内核程序在内核空间分配内存并开辟一块内核缓存区,发送进程通过copy_from_user函数将数据拷贝到到内核空间的缓冲区中。同样的,接收进程在接收数据时在自己的用户空间开辟一块内存缓存区,然后内核程序调用copy_to_user()函数将数据从内核缓存区拷贝到接收进程。这样数据发送进程和数据接收进程完成了一次数据传输,也就是一次进程间通信;其有两点不足之处:一次数据传递需要经历:用户空间_>内核缓存区_>用户空间,需要2次数据拷贝,效率不高。接收数据的缓存区由数据接收进程提供,但是接收进程并不知道需要多大的空间来存放将要传递过来的数据,因此只能开辟尽可能大的内存空间或者先调用API接收消息头来获取消息体的大小,浪费了空间或者时间。

Binder更加稳定和安全。Binder是基于C/S架构的,技术上已经很成熟,稳定;共享内存没有分层,难以控制,并发同步访问临界资源时,可能还会产生死锁;从稳定性的角度讲,Binder是优于共享内存的。Android是一个开源的系统,并且拥有开放性的平台,市场上应用来源很广,因此安全性对于Android平台而言极其重要。传统的IPC接收方无法获得对方可靠的进程用户ID/进程ID(UID/PID),无法鉴别对方身份。Android为每个安装好的APP分配了自己的UID,通过进程的UID来鉴别进程身份。另外,Android系统中的Server端会判断UID/PID是否满足访问权限,而对外只暴露Client端,加强了系统的安全性。

深入理解Binder之前一直对Binder理解不够透彻,仅仅知道一些皮毛,所以最近抽空深入理解一下,并在这里做个小结。

Binder是Android系统中实现IPC(进程间通信)的一种机制。Binder原意是“胶水、粘合剂”,所以可以想象它的用途就是像胶水一样把两个进程紧紧“粘”在一起,从而可以方便地实现IPC。

那么为什么会有进程通信呢?这是因为在Linux中进程之间是隔离的,也就是说A进程不知道有B进程的存在,相应的B进程也不知道A进程的存在。A、B两进程的内存是不共享的,所以A进程的数据想要传给B进程就需要用到IPC。

在这里再科普一下进程空间的知识点:进程空间可以分为用户空间和内核空间。简单的说,用户空间是用户程序运行的空间,而内核空间就是内核运行的空间了。因为像内核这么底层、至关重要的东西肯定是不会简单地让用户程序随便调用的,所以需要把内核保护起来,就创造了内核空间,让内核运行在内核空间中,这样就不会被用户空间随便干扰到了。两个进程之间的用户空间是不共享的,但是内核空间是共享的。

所以到这里,有些同学会有个大胆的想法,两个进程间的通信可以利用内核空间来实现啊,因为它们的内核空间是共享的,这样数据不就传过去了嘛。但是接着又来了一个问题:为了保证安全性,用户空间和内核空间也是隔离的。那么如何把数据从发送方的用户空间传到内核空间呢?

针对这个问题提供了系统调用来解决,可以让用户程序调用内核资源。系统调用是用户空间访问内核空间的唯一方式,保证了所有的资源访问都是在内核的控制下进行的,避免了用户程序对系统资源的越权访问,提升了系统安全性和稳定性(这段话来自《写给Android应用工程师的Binder原理剖析》)。我们平时的网络、I/O操作其实都是通过系统调用在内核空间中运行的(也就是内核态)。

至此,关于IPC我们有了一个大概的实现方案:A进程的数据通过系统调用把数据传输到内核空间(即copy_from_user),内核空间再利用系统调用把数据传输到B进程(即copy_to_user)。这也正是目前Linux中传统IPC通信的实现原理,可以看到这其中会有两次数据拷贝。

(图片来自于《写给Android应用工程师的Binder原理剖析》)

Linux中的一些IPC方式:

通过上面的讲解我们可以知道,IPC是需要内核空间来支持的。Linux中的管道、socket等都是在内核中的。但是在Linux系统里面是没有Binder的。那么Android中是如何利用Binder来实现IPC的呢?

这就要讲到Linux中的动态内核可加载模块。动态内核可加载模块是具有独立功能的程序,它可以被单独编译,但是不能独立运行。它在运行时被链接到内核作为内核的一部分运行。这样,Android系统就可以通过动态添加一个内核模块运行在内核空间,用户进程之间通过这个内核模块作为桥梁来实现通信。(这段话来自《写给Android应用工程师的Binder原理剖析》)在Android中,这个内核模块也就是Binder驱动。

另外,BinderIPC原理相比较上面传统的LinuxIPC而言,只需要一次数据拷贝就可以完成了。那么究竟是怎么做到的呢?

其实Binder是借助于mmap(内存映射)来实现的。mmap用于文件或者其它对象映射进内存,通常是用在有物理介质的文件系统上的。mmap简单的来说就是可以把用户空间的内存区域和内核空间的内存区域之间建立映射关系,这样就减少了数据拷贝的次数,任何一方的对内存区域的改动都将被反应给另一方。

所以,Binder的做法就是建立一个虚拟设备(设备驱动是/dev/binder),然后在内核空间创建一块数据接收的缓存区,这个缓存区会和内存缓存区以及接收数据进程的用户空间建立映射,这样发送数据进程把数据发送到内存缓存区,该数据就会被间接映射到接收进程的用户空间中,减少了一次数据拷贝。具体可以看下图理解

(图片来自于《写给Android应用工程师的Binder原理剖析》)

Binder的优点

在整个Binder通信过程中,可以分为四个部分:

其中Client和Server是应用层实现的,而Binder驱动和ServiceManager是Android系统底层实现的。

具体流程如下:

(Binder通信过程示意图来自于《写给Android应用工程师的Binder原理剖析》)

binder安全性和安全性的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

股市盘语

吃秋葵有哪些营养价值 吃秋葵有哪些营养价值呢

信息披露人工智能

哪些理财收益8%

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 931614094@qq.com 举报,一经查实,本站将立刻删除。