linux内核安全随记
以3.14-rc4内核版本为主,代码在线阅读地址:https://elixir.bootlin.com/linux/v3.14-rc4/source
主体标记与进程凭证
进程凭证
主要以uid与gid为主,进程的控制结构中有两个凭证,一个为real_cred,另一个叫cred
其中read_cred被称为客体凭证,而cred被称为主体凭证
比如A->B发信息,A就是主体,而B是客体
凭证的数据结构如下:
1 |
|
下面对uid和gid做一个简单的解释:
uid和gid
uid
uid
是最早的user id,有时被称为Real id,简写为(r)uid- 在资源统计和资源分配中使用(比如限制某用户拥有的进程数量时使用)
euid
euid即有效uid- 在内核做特权判断时使用
- 与提升权限有关
- 内核在做ipc(进程间通信)和key(密钥)的访问控制时也使用uid
suid
saved set user id- 用于存储euid的值
euid与特权有关,当euid为0时获得所有权限,因此为了让进程不要总有所有权限,引入了suid,在进程执行完euid=0的操作后,将euid恢复至其他值,将0赋给suid,直到下一次需要特权时才将suid的值传给euid
- fsuid
file system user id,是linux系统独有的- 用于在文件系统相关的访问控制中判断操作许可
gid
gid与uid类似,除了(r)gid,egid,sgid和fgid以外,多了一个补充组id:Supplementray Group IDs,他是一个数组,也有一组group id,因为一个用户可以属于多个组
在涉及权限检查中,要判断每一个egid和补充组中的每一个gid,涉及文件还需要fsgid,只要有一个允许访问就可以访问
但也有区别
group id与特权无关,euid==0时进程具有所有权限,而egid或者别的gid为0时,进程不会因此而具备特权
系统调用
与设置uid(泛指)有关的系统调用
- setuid(uid_t uid):用于设置euid,如果调用进程具有setuid特权,此调用会同时修改(r)uid和suid,调用后三个值相同
- seteuid(uid_t euid):用于设置euid,但不会设置(r)uid和suid
- setreuid(uid_t ruid,uid_t euid):可以同时修改(r)uid和euid,若”-1”为参数,则表示维持原有值不变,如果以下两个条件成立则会修改suid
- 修改了(r)uid
- 修改了euid且其新值不等于系统调用前的(r)uid
- setresuid(uid_t ruid,uid_t euid,uid_t suid)同时修改ruid,euid和suid
- setfsuid(uid_t fsuid),其修改进程的fsuid
- 设置euid的系统调用中,其也会设置euid的同时设施fsuid,让其值相同
在上述的系统调用中,都会遵循以下几个原则
- 具备setuid特权的进程可以将(r)uid,euid,suid,fsuid设置为任意值
- 不具setuid特权的进程只能将上述值设为现有的值(除fsuid)
- 不具备setuid特权的进程只能将fsuid设置为现有的值之一
而组的相关set调用与uid的类似,只需要简单替换即可,除了下属的例子:
- setgroups(size_t size,const gid_t *list)
- 此调用用于一次性赋值进程凭证中的补充组id,该调用需要特权setgid
与get uid(泛指)值相关的函数调用
- getuid(void):取出调用进程的(r)uid
- geteuid(void):取出调用进程的euid
- getresuid(uid_t ruid,uid_t euid,uid_t *suid):取出进程的(r)uid,euid和suid
proc文件接口
可以通过/proc/[pid]/status来反映进程凭证,如1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21root@zhishi:~# cat /proc/8/status
Name: init
State: S (sleeping)
Tgid: 8
Pid: 8
PPid: 1
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 11
Groups:
VmPeak: 0 kB
VmSize: 8944 kB
VmLck: 0 kB
VmHWM: 0 kB
VmRSS: 228 kB
VmData: 0 kB
VmStk: 0 kB
VmExe: 444 kB
VmLib: 0 kB
VmPTE: 0 kB
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!