Android的Linux“心”
你问我爱你有多深
我爱你有几分
你去想一想
你去看一看
内核代表我的心
......
Android的总体架构有时被描述为“运行在Linux上的Java”,然而这种说法不够准确,并不能完全体现出这一平台的复杂性和架构。Android的总体架构由5个主要层次上的组件构成,这5层是:Android应用层、Android框架层、Dalvik虚拟机层、用户空间原生代码层和Linux内核层。图1显示了这些层是如何构成Android软件栈的。
图1 Android系统的总体架构Android应用层允许开发者无须修改底层代码就对设备的功能进行扩展和提升,而Android框架层则为开发者提供了大量的用来访问Android设备各种必需设备的API,也就是充当应用层与Dalvik虚拟机(DalvikVM)层之间的“粘合剂”。API中包含各种构件(building block)以允许开发者执行通用任务,比如管理UI元素、访问共享数据存储,以及在应用组件间传递信息等。
Android应用和Android框架都是用Java语言开发的,并在DalvikVM中运行。DalvikVM的作用主要是为底层操作系统提供一个高效的抽象层。DalvikVM是一种基于寄存器的虚拟机,能够解释执行Dalvik可执行格式(DEX)的字节码;另一方面,DalvikVM依赖于一些由支持性原生代码程序库所提供的功能。
Android系统中的用户空间原生代码组件包括系统服务(如vold和DBus)、网络服务(如dhcpd和wpa_supplicant)和程序库(如bioniclibc、WebKit和OpenSSL)。其中一些服务和程序库会与内核级的服务与驱动进行交互,而其他的则只是便利底层原生操作管理代码。
Android的底层基础是Linux内核,Android对内核源码树作了大量的增加与修改,其中有些代码存在一些独特的安全后果。后面会更加详细地讨论这些话题。内核级驱动也提供了额外的功能,比如访问照相机、Wi-Fi以及其他网络设备。需要特别注意Binder驱动,它实现了进程间通信(IPC)机制。
下面详细看一下内核。
尽管Android的根基——Linux内核文档相当完备而且已经被深入理解,但是Linux内核和Android使用的内核还是有很多显著的差异。下面将介绍其中的一些变化,特别是那些和Android安全相关的。
Android分支
在早期,谷歌创建了Linux内核的一个Android分支,因为许多修改和添加已经不再与Linux内核主代码树相互兼容。总体而言,这其中包括了大约250个补丁,涉及文件系统支持、网络处理调整,以及进程和内存管理功能等。根据一位内核工程师的说法,绝大部分的补丁“代表着Android开发者在Linux内核中发现的一些局限性”。2012年3月,Linux内核维护者将Android特有的内核修改合并到了主代码树。表1显示了一些对主代码树的添加与修改,这里将详细介绍其中的一部分。
表1 Android对Linux内核的主要修改Binder
对Android的Linux内核最为重要的一个添加也许是Binder驱动。Binder是一个基于OpenBinder修改版本的IPC机制,OpenBinder最初由Be公司开发,后来又由Palm公司开发和维护。Android的Binder代码量相对较小(大约有4000行源码,存在于2个文件中),但是对于大部分的Android功能都是非常关键的。
概括地说,Binder内核驱动是整个Binder架构的粘合剂。Binder作为一个架构,以客户端—服务器模型运行,允许一个进程同时调用多个“远程”进程中的多个方法。Binder架构将底层细节进行了抽象,使得这些方法调用看起来就像是本地函数调用。图2显示了Binder的通信流图。
图2 Binder的通信流Binder也使用进程ID(PID)和UID信息作为一种标识调用进程的手段,允许被调用方作出访问控制的决策。通常会调用Binder.getCallingUid和Binder.getCallingPid等函数,或者调用checkCallingPermission等高层次上的检查函数。
ashmem
匿名共享内存服务,简称ashmem,是另一个在Linux内核Android分支中添加的代码模块。ashmem驱动基本上提供了基于文件、通过引用计数的共享内存接口。它广泛应用于大多数Android核心组件中,包括SurfaceFlinger、AudioFlinger、系统服务器和DalvikVM等。ashmem能够自动收缩内存缓存,并在全局可用内存较低时回收内存区域,因而非常适用于低内存环境。
pmem
另一个Android特有的自定义驱动是pmem,用来管理1—16MB(或更多,取决于具体实现)的大块物理上连续的内存区块。这些区块是特殊的,可以在用户空间进程和其他内核驱动(比如GPU驱动)之间共享。与ashmem不同的是,pmem驱动需要一个分配进程,为pmem的内存堆保留一个文件描述符,直到所有其他索引都关闭。
日志记录器
虽然Android内核仍然维护自己基于Linux内核的日志机制,但它也使用另一个日志记录子系统,即俗称的“日志记录器”(logger)。作为logcat命令的支持,这个驱动用于查看日志缓冲区。它根据信息的类型,提供了4个独立的日志缓冲区:main(主缓冲区)、radio(无线电缓冲区)、event(事件缓冲区)与system(系统缓冲区)。图3显示了日志事件的流图以及辅助日志记录器的组件。
图3 Android日志记录系统架构Paranoid Networking
Android内核基于一个调用进程的辅助用户组来限制网络操作,而这个调用进程就是被称为Paranoid Networking的内核修改模块。在高层次上,这个模块将一个AID(以及随后的GID)映射到应用层的权限声明或请求上。例如,Manifest文件中的权限android.permission.INTERNET有效地映射到AID_INETAID(或GID3003)上。这些用户组、UID以及它们相应的权能在内核源码树的include/linux/android_aid.h文件中定义,详见表2。
表2 根据用户组定义的网络权能
相关图书推荐
1、Android安全第一书
书号:978-7-115-38570-3
作者:Joshua J. Drake,Pau Oliva Fora等
译者:诸葛建伟 肖梓航 杨坤
页数:394
定价:89.00 元
*顶级白帽子(Joshua J. Drake等)原著 + 一线安全专家(诸葛建伟/肖梓航/杨坤)翻译
*tombkeeper、Flanker、dm557、非虫等知名白帽子鼎力推荐
*专注于阐述设备root、逆向工程、漏洞研究和软件漏洞利用等技术细节
《Android安全攻防权威指南》由世界顶尖级黑客打造,是目前最全面的一本Android系统安全手册。书中细致地介绍了Android系统中的漏洞挖掘、分析,并给出了大量利用工具,结合实例从白帽子角度分析了诸多系统问题,是一本难得的佳作。
点击左下角【阅读原文】跳转到京东本书页面。