Android 安全机制(1)uid 、 gid 与 pid

1、概述 

      Android 安全机制来源于Linux,并且以Linux权限管理为基础,要了解Android的安全机制,需要从linux中的安全机制了解开始,而用户的权限管理又是linux安全机制的最基本的一个组成. Android的创新之处是在linux用户权限管理的基础之上创建了Android 进程的沙箱隔离机制.

 

2、linux中的用户(UID)、组(GID)、进程(PID)

      在 Linux 中,一个用户 UID 标示一个给定用户。Linux系统中的用户(UID)分为3类,即普通用户、根用户、系统用户。

      普通用户是指所有使用Linux系统的真实用户,这类用户可以使用用户名及密码登录系统。Linux有着极为详细的权限设置,所以一般来说普通用户只能在其家目录、系统临时目录或其他经过授权的目录中操作,以及操作属于该用户的文件。通常普通用户的UID大于500,因为在添加普通用户时,系统默认用户ID从500开始编号。
      根用户也就是root用户,它的ID是0,也被称为超级用户,root账户拥有对系统的完全控制权:可以修改、删除任何文件,运行任何命令。所以root用户也是系统里面最具危险性的用户,root用户甚至可以在系统正常运行时删除所有文件系统,造成无法挽回的灾难。所以一般情况下,使用root用户登录系统时需要十分小心。
      系统用户是指系统运行时必须有的用户,但并不是指真实的使用者。比如在RedHat或CentOS下运行网站服务时,需要使用系统用户apache来运行httpd进程,而运行MySQL数据库服务时,需要使用系统用户mysql来运行mysqld进程。在RedHat或CentOS下,系统用户的ID范围是1~499。下面给出的示例显示的是目前系统运行的进程,第一列是运行该进程的用户。

       组(GID)又是什么呢?事实上,在Linux下每个用户都至少属于一个组。举个例子:每个学生在学校使用学号来作为标识,而每个学生又都属于某一个班级,这里的学号就相当于UID,而班级就相当于GID。当然了,每个学生可能还会同时参加一些兴趣班,而每个兴趣班也是不同的组。也就是说,每个学生至少属于一个组,也可以同时属于多个组。在Linux下也是一样的道理。

 

3、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)是依据进程的有效用户来判断的,(在linux系统中(内核2.4以上)又引入了一个新的进程权限管理模型process capabilities,通过process capabilities来确定进程所允许的各种操作[可参看《深入理解linux内核》table 20-3])。通过geteuid来获得进程的有效用户,修改进程的有效用户可以通过setuid、seteuid、setresuid、setreuid、seteuid。

      (3)文件系统的用户、组(fsuid、fsgid):用于进行文件访问的用户、组,这是linux系统中新引入的一类用户、组,对于unix系统文件的访问是通过euid来判断,没有函数获得进程的fsuid,用于修改有效用户的函数都会同时修改fsuid,如果要单独修改fsuid,而不修改euid,可以调用setfsuid。

      (4)保存的设置用户、组(suid、sgid):保存的设置用户、组。进程中该类型的用户、组主要的用处是用于还原有效用户,观察到对于非超级用户用于修改有效用户的各个函数setuid、seteuid、setresuid、setreuid、seteuid普遍有一个前提条件就是如果修改后的有效用户是原先的suid则允许修改,利用这一点,进程可以修改有效用户到一个新用户,然后还原到原来的值(原来的值保存在保存设置的用户)。通过getresuid来获得进程的真实用户、有效用户、保存的设置用户。

 

4、Android 系统中的UID、GID、GIDS与PID

        在 Android 上,一个用户 UID 标示一个应用程序。应用程序在安装时被分配用户 UID,应用程序在设备上的存续期间内,用户 UID 保持不变。对于普通的应用程序,GID即等于UID。

        GIDS 是由框架在 Application 安装过程中生成,与 Application 申请的具体权限相关。 如果 Application 申请的相应的 permission 被 granted ,而且有对应的GIDS, 那么 这个Application 的 gids 中将 包含这个 gids。记住权限(GIDS)是关于允许或限制应用程序(而不是用户)访问设备资源。

        Android 使用沙箱的概念来实现应用程序之间的分离和权限,以允许或拒绝一个应用程序访问设备的资源,比如说文件和目录、网络、传感器和 API。为此,Android 使用一些 Linux 实用工具(比如说进程级别的安全性、与应用程序相关的用户和组 ID,以及权限),来实现应用程序被允许执行的操作。

图 1. 两个 Android 应用程序,各自在其自己的基本沙箱或进程上

图:两个 Android 应用程序,各自在其自己的基本沙箱或进程上(具有不同的用户 ID)

 

        Android 应用程序运行在它们自己的 Linux 进程上,并被分配一个惟一的用户 ID。默认情况下,运行在基本沙箱进程中的应用程序没有被分配权限,因而此类应用程序访问系统或资源受到限制,Android 应用程序只能通过应用程序的 manifest 文件请求权限。

        不同的应用程序可以运行在相同的进程中。对于此方法,首先必须使用相同的私钥签署这些应用程序,然后必须使用 manifest 文件给它们分配相同的 Linux 用户 ID,这通过用相同的值/名定义 manifest 属性 android:sharedUserId 来做到,从而共享对其数据和代码的访问,如图2所示

图 2. 两个 Android 应用程序,运行在同一进程上

图:两个 Android 应用程序,运行在同一进程上(具有相同的数字签名和相同的 Linux 用户 ID)

 

 

5、总结

在 Android 上,一个应用程序只有一个UID,当然多个应用程序也可以共享一个UID。

对 于普通应用程序来说, gid 等于 uid 。由于每个应用程序的 uid 和 gid 都不相同, 因此不管是 native 层还是 java 层都能够达到保护私有数据的作用 。

一个GIDS相当于一个权限的集合,一个UID可以关联GIDS,表明该UID拥有多种权限

一个进程就是host应用程序的沙箱,里面一般有一个UID和多个GIDS,每个进程只能访问UID的权限范围内的文件和GIDs所允许访问的接口,构成了Android最基本的安全基础。

后续还会介绍 Android Permission权限控制机制、Android APK签名机制、Selinux Android 。

 

6、参考文献

1、http://blog.csdn.net/nuoline/article/details/8610811

2、http://book.51cto.com/art/201401/427710.htm

3、http://www.educity.cn/wenda/174474.html

4、http://www.cnblogs.com/zhiyinjixu/articles/2252371.html

 

我的微博 黄舒颖-人工智能爱好者

GITHUB shuyinghuang 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1620650.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

UID、EUID、GID和EGID

UID、EUID、GID和EGID Linux中id真是太多了进程有pid,然后用户还有UID这种,真是有点绕。 在Linux当中一个进程(程序)拥有四个ID:真实用户UID、有效用户EUID、真实组GID和有效组EGID。 这里以真实用户UID和有效用户EUID为例&…

用户和用户组-UID和GID

用户和用户组-UID和GID Linux用户和用户组用户UID用户组GID/etc/passwd 文件结构/etc/shadow 文件结构 Linux用户和用户组 Linux采用一个32位的整数记录和区分不同的用户。这个区分不同用户的数字被称为User ID,简称UID。Linux系统中用户分为3类,即普通…

linux uid gid 作用,Linux uid和gid

Linux uid和gid教程 我们在登陆 Linux 系统时,虽然输入的是自己的用户名和密码,但其实 Linux 并不认识你的用户名称,它只认识用户名对应的 ID 号(也就是一串数字)。Linux 系统将所有用户的名称与 ID 的对应关系都存储在 /etc/passwd 文件中。…

GiD 自定义 简介

目录 Blog Links一、前言二、GiD的程序架构三、问题类型系统四、主配置文件/.spd文件4.1 单位制4.2 截面属性4.3 局部轴 五、Tcl文件5.1 GiD程序调用GiD-Tcl5.2 执行程序的命名空间 六、参考文献 Blog Links DalNur | 博客总目录 GiD 实用教程 GiD 前处理 实例 GiD 自定义 简…

GiD 实用教程

目录 Blog Links一、前言二、用户界面2.1 界面组成2.2 快捷键2.3 模式切换2.4 图层功能2.5 删除功能2.6 视图切换2.7 渲染视图 三、帮助与实例3.1 帮助文档3.2 官方实例 四、GiD Basics五、几何模型5.1 点的定义5.2 线的创建5.3 面的创建5.4 体的创建 六、网格划分6.1 布设种子…

python 双向链表

双向链表基本介绍 双向链表增删改查操作思路分析 双向链表增删改查操作代码实现 """ 双向链表的增删改查 """# 英雄类 class HeroNode:next None # 指向下一个节点,默认为空pre None # 指向前一个节点,默认为空def …

小马哥的CSS驿站

目录 第一章 CSS概述 1.1语法 1.2注释 1.3CSS的创建 第二章 CSS选择器 1.id选择器 2.class选择器 3.标签选择器 4.子代选择器 5.后代选择器 6.相邻兄弟选择器 7.后续兄弟选择器 8.交集选择器 9.并集选择器 第三章 CSS样式 1.文本与文字样式 (1&…

35 岁财务自由的小马哥,我想跟他学学!

如果说 Java 工程师,有什么一定要“死磕”拿下的东西,那一定是 Spring 无疑了。 众所周知,Spring 无论在 Java 生态系统,还是在就业市场,是绝对的王者。Spring AOP 作为 Spring 框架的核心内容之一,其重要性…

计算机网络(速率、宽带、吞吐量、时延、发送时延)

速率: 最重要的一个性能指标。 指的是数据的传送速率,也称为数据率 (data rate) 或比特率 (bit rate)。 单位:bit/s,或 kbit/s、Mbit/s、 Gbit/s 等。 例如 4 1010 bit/s 的数据率就记为 40 Gbit/s。 速率往往是指额定速率或…

什么盒模型

一、盒模型 1.什么是盒模型 在我们HTML页面中,每一个元素都可以被看作一个盒子,而这个盒子由:内容区(content)、填充区(padding)、边框区(border)、外边界区&#xff0…

1.1 编辑楼层标高

在任意视图内批量编辑楼层。点击 按钮,弹出楼层管理器界面,可以对模型中已有的楼层高度进行修改、批量修改楼层名称。在创建楼层时,可以设定起始楼层序号,后续楼层将自动排序,当前文件中的新建楼层在“确定”完成前允许自由删除操…

2.3 轴生墙

按照已创建的弧形/ 直线轴生成墙。点击 按钮,弹出轴线生墙对话框,如图所示:在基本墙中选择需要添加的墙类型,在顶高和底高中选择楼层,并可以勾选是否按楼层切分墙。可在墙上定位线中选择墙的中心或者外边缘等为定位线…

3.5 连接管线

通过Revit管线建模功能,或是通过翻模软件创建的管线往往是不连接的,如果要把它们连接起来很费力,同时也不容易指定连接的角度。模盒提供的连接管线”功能可以很好地连接各种管线,并根据所选管线的空间位置,智能提示可以…

1.7 删轴线

点击 按钮,选择任意需要删除的轴线即可完成删除,与已删除轴线同组的后续众轴线编号会自动向前进位,以保持轴网编号的连续性。 先图AGI模盒下载地址: 先图官网:http://www.agicloud.com 安装下载(腾讯微云&a…

Retina时代的前端视觉优化

随着New iPad的发布,平板也将逐渐进入Retina时代,在高分辨率设备里图片的显示效果通常不尽人意,为了达到最佳的显示效果就需要对图片进行优化,这里介绍一些优化方法: 一、用CSS替代图片 这一点在任何时候都适用&#x…

3.4 分割管线

Revit中创建的管线为与实际施工结合,往往需要按指定的安装长度进行打断。按照传统手段进行打断,效率低下。可以通过模盒提供的批量分割打断管线功能,对机电的管线进行一次性打断。 可以打断的机电管线包括:风管、水管和桥架。 点击…

盒模型。。

css盒模型的概述: css盒模型(Box Model)规定了元素处理元素内容、内边距、边框、外边距、的方式 这个是盒模型的模型图 盒模型各部分说明: content:是盒子的内容 显示文本图像 padding:是盒子的内边距 …

2.4 标准柱

点击 按钮,弹出标准柱对话框,如图所示:在已创建的轴网角度处创建柱。可选择柱类型, 可同时创建跨多层柱子,并可选是否按照楼层切分柱。支持各种偏移,自定义偏心距离以及旋转角度的设置。可以点击最下方三个…

2.19 一键扣减

Revit建模后,各构件会存在互相重叠的情况,像结构柱与梁的重叠。由于实际施工不会出现重合的情况,因此模型的真实程序会降低,同时在后续的算量过程中会重复计算重合部分,计算结果不能精确。为此,模盒提供了“…

1.2 创建矩形轴网

点击 按钮,弹出矩形轴网对话框,如图所示:直接添加轴线间距生成轴网,轴网自动标注,轴网自动编号,自定义轴号编号原则(加前缀和后缀),自定义标注样式,可选择规…