Androd Linux进程,用户权限关系
Android 沙箱本质是为了实现不同应用程序之间的互相隔离,而这种隔离策略是通过让不同的应用程序运行于各自己的虚拟机进程中实现的。沙箱,对使用者来说可以理解为一种安全环境,对恶意访问者来说是一种限制。
在Android系统中,应用(通常)都在一个独立的沙箱中运行,即每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik经过优化,允许在有限的内存中同时高效地运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行。Android这种基于Linux的进程“沙箱”机制,是整个安全设计的基础之一。
Android从Linux继承了已经深入人心的类Unix进程隔离机制与最小权限原则,同时结合移动终端的具体应用特点,进行了许多有益的改进与提升。具体而言,进程以隔离的用户环境运行,不能相互干扰,比如发送信号或者访问其他进程的内存空间。因此,Android沙箱的核心机制基于以下几个概念:
1.标准的Linux进程隔离
2.大多数进程拥有唯一的用户ID(UID)
3.以及严格限制文件系统权限。
1.进程、用户ID和文件ID对应关系
进程运行时与用户ID,文件ID权限访问上的对应关系。对于一个普通文件,有三个ID,这三个ID对应三组权限,这三组权限控制着进程对该文件的访问权限。如下图所示。
【进程.文件.user对应关系】
2、linux中进程的用户管理 (PID与UID、GID的关系)
每个进程都拥有真实的用户、组(uid、gid),有效的用户、组(euid、egid),保存的设置用户、组(suid、sgid),
还有linux中专门用于文件存储存取的用户、组id(fsuid、fsgid对于unix系统没有这两个fields)。现说明进程中每种类
型用户的功能:
(1)真实的用户、组(uid、gid):进程的真正所有者。每当用户在shell终端登录时,都会将登录用户作为登录进程
的真正所有者。通过getuid来获得进程的真正用户所有者,修改进程的真正用户所有者可以通过setuid、seteuid、
setresuid、setreuid。
(2)有效的用户、组(euid、egid):进程的有效用户、组。进程所执行各种操作所允许的权限(process credentials)
是依据进程的有效用户来判断的,引入了一个新的进程权限管理模型process capabilities,通过process capabilities来
确定进程所允许的各种操作。通过geteuid来获得进程的有效用户,修改进程的有效用户可以通过setuid、seteuid、
setresuid、setreuid、seteuid。
- 文件本质实现inode
文件数据存储在块中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做inode,中文译名为索引节点,也叫i节点。因此,一个文件必须占用一个inode,但至少占用一个block。
inode包含很多的文件元信息,但不包含文件名,例如:字节数、属主UserID、属组GroupID、读写执行权限、时间戳等。
表面上,用户通过文件名打开文件,实际上,系统内部将这个过程分为三步:
1)系统找到这个文件名对应的inode号码;
2) 通过inode号码,获取inode信息;
3) 根据inode信息,找到文件数据所在的block,并读出数据。
其实系统还要根据inode信息,看用户是否具有访问的权限,有就指向对应的数据block,没有就返回权限拒绝。
参考: