目录:
- 1.进程和进程边界
- 2.多用户和多用户边界
- 3.进程和文件的UID/GID (UserID/groupId)
- 3.1文件资源的权限力度:UID/GID
- 3.2文件的可操作权限
- 3.3进程的标识: PID , UID , GID , GIDs
- 3.4Name和ID的映射
- 3.5Chmod和chown命令介绍
- 3.5.1Chmod
- 3.5.2Chown
- 4.UID/GID的衔接
- 5.进程的RealUID和EffectiveUID
- 6.文件的setUID标识
- 7.Capability
- 7.1进程的Capability
- 7.2文件的Capability
- 7.3Capability BoundSet
- 7.4Spawn进程的Capability
进程和进程边界
进程和线程
可执行文件:不活动就是废物
进程:可执行文件的活动表现,一次生命的历练
线程:CPU(核)的调度单位,并发的执行序列,进程的多管齐下
资源和调度.
进程边界的安全围栏:
Crash的不可扩延性
全局数据和服务的不可访问性
多用户和多用户边界
需求背景:
资源缺乏
中央统一管理
多用户的边界:
独立的工作目录
可操作/访问的资源
资源分类
权限管理
可执行的操作
操作分类
权限管理
多用户特性标识(linux): UID 和GID
Name只是供看的
Identifier才是系统层面的标识
用户的行为是一系列进程的行为
特性标识其实是进程的UID/GID
进程和文件的UID/GID (UserID/groupId)
文件资源的权限力度:UID/GID
1.文件是一类资源
2.在Linux中,甚至一切皆是文件,Socket,Driver
3.文件资源对不同Target(用户)的不同操作权限的需求应运而生
4.某些场景下,允许多个不同的Target/用户(而不是一个)具有一致的操作权限,怎么办?
Id===> Gid===> 多个用户可以属于一个GID,一个用户可以属于多个GIDs
5.所以文件权限的管理力度区分3类群体:属于特定UID的用户,属于特定GID的用户(们),其他用户
6.一个上帝用户存在:ROOT, 其UID = 0 , 上帝用户永远满足属于任何UID
文件的可操作权限
1.文件/文件夹的可读 r
2.文件/文件夹的可写 w
3.文件/文件夹的可执行 x
|
|
drwxr-xr-x
d|rwx|r-x|r-x
0|123|456|789
文件夹与文件标识
0 : d文件夹 -文件
UID用户
1 : 可读
2 : 可写
3 : 可执行
GID用户
4 : 可读
5 : 不可写
6 : 可执行
其他用户
7 : 可读
8 : 不可写
9 : 可执行
进程的标识: PID , UID , GID , GIDs
PID : 进程的Unique Identifier(唯一标识) . 每次Running的PID可能相同,或者不同,由系统分配
UID : 进程的身份标识.每次运行,即便重启后默认都相同
GID : 进程的(组)身份标识.每次运行,即便重启后默认都相同.不同进程允许有相同的GID(组用户身份标识).
同一进程允许属于多个GID.
GIDs: 进程所属的全部GID
Name和ID的映射
Android原代码之Name和ID映射表
/system/core/include/private/android_filesystem_config.h
|
|
Android提供了dumpsys工具来dump出所有的服务信息,通过以下命令可以查看系统注册的所有服务:adb shell dumpsys
dumpsys 用来给出手机中所有应用程序的信息,并且也会给出现在手机的状态。
因为内容太多把dumpsys的内容存储到C盘文件中方便查看.如下
|
|
其中dumpsys.txt文件一段关于QQ配置的片段可查找到如下内容:
userId=10081 gids=[3003, 1028, 1015] <---gids可在android_filesystem_config.h查找到对应的映射关系
|
|
Chmod和chown命令介绍
Chmod
1.文件R/W/X的系统内部采用3Bit表示,R为最高位比特,置位为0x04,
W为中间比特,置位为0x02,X为最低比特,置位为0x01
4(读R) , 2(写W) , 1(执行X)
7=4+2+1 所有权限
6=4+2 读写
5=4+1 读执行
4 读
3=3+1 写执行
2
1
664表示给予UID,GID读写权限,给予其它只读权限
2.Shell中表示时,置位使用相应R/W/X表示,未置位使用-
3.操作文件面向群体的操作权限时,使用Chmod,可以直接使用数字,
也可使用助记符( a:all , u:owner user , g:group , +:add one premission , -:remove one permission)
|
|
Chown
通过chown改变文件的拥有者和群组。在更改文件的所有者UID或所属群组GID时,可以使用用户名称和用户识别码设置。
Shell命令中通常采用Name方式修改,而不是ID方式.普通用户不能将自己的文件改变成其他的拥有者。其操作权限一般为管理员。
一般格式: chown newUID:newGID FileName
|
|
UID/GID的衔接
1.Linux一切皆是文件
2.文件基于UID/GID来划分它的面向群体,对它的面向群体定义不同的操作权限
3.用户的行为映射为进程的运行
4.进程的运行使用进程的UID/GID来标识自己的身份
5.进程的UID/GID<=====>文件的UID/GID 完美衔接~~
6.进程的UID/GID除了被授予可操作文件的范畴外,非文件范畴的需要进行权限控制的操作
(如重启系统等特权操作)继续通过进程的UID/GID身份来进行控制和授权.
7.比如,对于Reboot这个API,其入口处可以check calling的Process的UID,如果不是Root,则Reject
进程的RealUID和EffectiveUID
linux下real uid被用于描述用户是谁,文件的拥有者,effective uid指程序执行时的用户组别,
用于判断程序是否有权去进行一些操作(例如读写文件),因此real uid是针对用户和文件(拥有者)而言,
而effective是针对运行的程序而言。一般来讲一个用户执行一个程序,
程序的effective uid会被设置为用户的real uid,这个effective uid与该程序的real uid(文件所有者)无关,只与执行者有关。
Real UID 是身份的标识 , 但没有"实权"
Effective UID 是权利的标识
文件,资源以及特权API操作时对进程是否有权限的识别的UID,即是指Effectivie UID
身份与权利的关系
一般情况下,身份和权利是一至的,即Real UID = Effective UID.
所以,默认ps cmd输出的UID指的是Effective UID , 而没有输出Real UID
Root用户的特权
ROOT可以调用SetXUID对自己的身份进行升降.
UID的世袭
子进程的Real UID = Effective UID = 父进程的Real UID (子嗣不能继承其特权Effective UID而仅能继承其Real UID)
文件的setUID标识
setUID可以让普通用户暂时获得文件权限的读写.
和基本的RWX设置类似,有助记符和直接数字设置.直接数字设置时,采用4位数字,第一位标志setUID
如下:
|
|
说明
chmod 4775 comtu.txt
4775 第一位4表示开启setUID, 第二位7表示UID获取读写执行权限,
第三位7表示Gid获取读写执行权限,最后5表示其它用户只有读与执行权限
chmod 0775 comtu.txt
0775 第一位0表示关闭setUID
chmod u+s comtu.txt
使用助记符,因为我使用的是Android的adb shell 是简化般linux对助记符不支持,如果使用ubuntu等则可进行操作.
Capability
Capability细粒度的权限控制
进程的Capability
permitted Capability Sets
当前进程的权利的围栏,最大权利的范围,是Effective Capability Sets的超集
Effectivte Capability Sets
当前进程的实际使用(支配)的权利集,该集内的Capability必须从属于Permitted Capability Sets .
该集合与Effective UID类似,是实际的权利标识.
Inheritable Capability Sets
子进程唯一可以直接继承的Capability Sets. 在Capability模式下,
只有子进程的Inheritable Capability Sets = 父进程的Inheritable Capability Sets . 其他的皆是NO
文件的Capability
Permitted Capability Sets
该可执行文件可以为进程带来的Permitted Capability Sets
Effective Capability Set
仅1bit,Enable or disable , 标识该可执行文件running所在的进程的
Permitted Capability Sets是否自动全部Assign到其Effective Capability Sets.
通常用于与传统的Root-setUID可执行文件向下兼容.
Inheritable Capability Sets
与进程的Inheritable Capability Sets 一起作用(位与)以决定新的进程的Permitted capability Sets
Capability BoundSet
Capability BoundSet是进程的属性
是进程自己为自己设定的安全围栏(Capability Sets) ,
限制可执行文件的Permitted Capability Sets仅有局部能转化的Permitted Capability Sets
Capability BoundSet能被子进程继承
Init进程默认Capability BoundSet为全1
Spawn进程的Capability
P'子进程 P父进程 F子进程运行起来的执行文件
P'(permitted) = (P(inheritable)&F(inheritable))|(F(permitted)&cap_bset)
P'(effective) = F(effective)?P'(permitted):0
P'(inheritable) = P(inheritable)