内核版本(4.15)
运行一个可执行程序,一般分为两步, fork 和 execve 过程,内核中涉及的权限设置如下:
1. fork 过程
SYSCALL_DEFINE0(fork)
_do_fork
copy_process
copy_creds
new = prepare_creds();
p->cred = p->real_cred = get_cred(new);
在 prepare_creds 里,会得到当前进程的 cred, 然后将其内容赋值给新的 cred, 该新的cred为新的进程所用。
在 struct cred 中,包含了各种ID: uid,gid, suid, sgid , euid, egid, fsuid, fsgid 以及能力集 cap_inheritable, cap_permitted, cap_effective, cap_bset, cap_ambient,还有group的信息 group_info。 这些信息标志着进程的权限。
2. execve 过程 (文件的 set-user-ID 和 set-group-ID 使用)
(1)当一个进程执行某个文件时,会调用到
do_execve