Android系统以Linux内核为基础,理解Android的安全设计首先要理清Linux安全模型的主要概念与元素,包括用户与权限,进程与内存空间等。
用户与权限
Linux安全模型的基础是用户与用户组。Linux的用户由用户名与用户标识(UID)表示。用户可同时参与多个用户组,每个用户组由组标识(GID)表示。
Linux系统定义有三类用户:
超级用户(root),具有最高的系统权限,UID为0。
系统伪用户,Linux操作系统出于系统管理的需要,但又不愿赋予超级用户的权限,需要将某些关键系统应用文件所有权赋予某些系统伪用户,其UID范围为 1~499。系统的伪用户不能登录系统。
普通用户,只具备有限的访问权限,UID为 500~6000,可以登录系统获得shell。
为控制不同的用户对不同系统资源的访问,Linux操作系统使用用户权限机制实现此目的。在Linux权限模型下,每个文件属于一个用户和一个组,由UID与GID标识其所有权。针对于文件的具体访问权限定义为可读(r),可写(w)与可执行(x),并由三组读,写,执行组成的权限三元组来描述相关的权限。第一组定义文件所有者(用户)的权限,第二组定义同组用户(GID相同但UID不同的用户)的权限,第三组定义其他用户的权限(GID与UID都不同的用户)。比如在shell使用交互命令“ls -l <文件名>” 可以获得文件的相应权限设置:
$ ls -l /bin/foobar -rwxr-xr-- 1 root wheel 20540 Oct 26 22:49 /bin/foobar
字段-rwxr-xr--中的首字符(-)为文件 /bin/foobar的类型,还可能是如下字符,表示不同的文件类型:
"d":目录
"l":符号链接
"c":字符设备文件
"b":块设备文件
“p”:pipe管道
"s":socket套接字
在字段-rwxr-xr--首字符之后,为3个三元组,即rwx的组合,"-"表示无相应权限。例如:
第一组rwx表示文件所有者(此处为root)可以进行读,写,执行的操作。
第二组r-x表示文件组用户(此处为wheel组的用户)没有写权限,但有可读和执行权限。
第三组r--表示任何其它用户对本文件的权限,即只可读,没有写与执行的权限。
但是,Linux对于可执行的文件还有特殊的权限许可标识,即所谓的suid,sgid,以及“粘滞位”(sticky bit)。这3个元素实际成为上述权限三元组之外的第四个组,以(suid,sgid,stickybit)的方式存在。由于特殊权限导致“特权”,若无特殊需求,不应该启用这些权限,避免出现严生安全漏洞!
进程与内存空间
Linux是一个多用户与多进程的操作系统,允许多个用户同时运行各自隔离的多个应用进程,并且通过用户及权限对用户资源进行隔离与保护。
Linux的用户,进程,内核,设备之间的关系如下图:
Linux内核允许多个用户同时存在并运行不同的进程。
每个用户拥有多个同时运行的进程,多个进程分别属于不同的用户。
所有进程(无论是否属于同一用户)各自运行于独立的内存空间。
用户进程通过系统调用接口访问操作系统的服务。
操作系统内核通过设备驱动访问硬件设备与资源,如数据存储与网络设备等。
在技术上,Linux利用现代计算机中央处理器(CPU)的内存管理单元(MMU)将系统内存分为内核区与用户区。操作系统内核本身运行于内核区,而用户进程运行于用户区。在加载进程时,操作系统将进程的可执行映像(代码和数据)映射到虚拟内存空间的用户区,将操作系统内核代码与数据映射到虚拟地址空间的内核区。Linux虚拟内存管理将内核区与用户区的访问权限设置为不同级别,操作系统内核具备最高的虚拟内存访问权限,而进程在运行时能访问的存储空间只限于其可见的虚拟内存空间的用户区。进程的虚拟内存空间的用户区包含着进程本身的程序代码和数据,可细分为代码段,数据段,堆,栈,以及进程运行的环境变量,命令行参数传递区域 等。
Linux的进程虚拟地址与物理地址的映射关系及进程镜像的内存地址分配如下图所示:
可总结为:
进程有自己独立的虚拟内存空间,由内核区和用户区组成,映射入物理内存。
在进程的虚拟内存内核区,操作系统内核的代码和数据等被映射到内核区,从而使进程在运行中得到操作系统的支持。内核区总是映射到物理内存的低地址空间。
在进程的虚拟内存用户区,进程的可执行映像(代码与数据)映射到虚拟内存的用户区,即进程用户区由进程的程序代码和数据组成。用户区映射到物理地址内核映射区以上的任意地址空间。
虚拟内存地址的访问权限,操作系统将进程虚拟内存空间内核区的访问权限设置为0级,用户区为3级;内核访问虚拟内存的权限为0级,而进程访问虚拟内存的权限为3级。所以进程代码永远不能访问内核区的代码与数据。
因此,Linux操作系统的进程内存管理确保一个进程无法访问其他进程的内存空间,无法污染其他进程的内存空间,进而保证应用进程,无论恶意或无意,都无法侵入操作系统空间及其他进程的内存空间更改代码以获得更高权限。