- 论坛徽章:
- 11
|
回复 1# chen_bo0302
real user/group ID 标识了进程的执行者/创建者,real ID 通常在用户登录系统时,由login(1)进程读取系统passwd/group 文件来设置
effective user/group ID 与supplementary group ID 共同决定了授予进程执行系统调用时的权限,effective ID 通常与real ID 具有相同的值,但可以通过一些系
统调用或执行set-user/group-ID 程序来更改
set-user/group-ID 是文件属性,而不是进程属性;当设置了set-user-ID 权限位的文件被执行时,内核会将进程的effective user ID 设置为可执行文件的属主(拥有了文件
属主的权限)
saved set-user/group-ID 用于set-user/group-ID 程序,在进程执行时保存effective user-user/group ID 当前值的副本,使得进程的effective ID 值可以在
real ID 与saved set ID 之间切换,实现临时提升与降低权限
file-system user/group ID 是Linux 进程的特有属性,当执行文件系统相关的操作时,使用file-system ID 和supplementary group ID 来决定授予进程的权限
file-system ID 通常与相应的effective ID 具有相同的值,且随effective ID 的变化而变化
supplementary group ID 是指进程的real user ID 所属的附加组的GID
程序验证:
root用户(id == 0)编辑程序pids.c并编译- #define _GNU_SOURCE
- #include <stdio.h>
- #include <unistd.h>
- int main(void)
- {
- uid_t ruid, rgid, euid, egid, suid, sgid;
- ruid = getuid();
- rgid = getgid();
- euid = geteuid();
- egid = getegid();
-
- getresuid(&ruid, &euid, &suid);
- getresgid(&rgid, &egid, &sgid);
- printf("Real User-ID: %d\n", ruid);
- printf("Real Group-ID: %d\n", rgid);
- printf("Effective User-ID: %d\n", euid);
- printf("Effective Group-ID: %d\n", egid);
- printf("Saved set-user-ID: %d\n", suid);
- printf("Saved set-group-ID: %d\n", sgid);
- return 0;
- }
复制代码- # gcc -m32 pids.c -o pids
复制代码 新建普通用户(id != 0)- # useradd user0 -m -s /bin/bash
复制代码 复制pids程序到普通用户的宿主目录,并添加set-user-ID权限位- # chmod u+s /home/user0/pids
复制代码 切换到普通用户普通用户运行程序- $ id
- uid=1000(user0) gid=1000(user0) groups=1000(user0)
- $ ./pids
- Real User-ID: 1000
- Real Group-ID: 1000
- Effective User-ID: 0
- Effective Group-ID: 1000
- Saved set-user-ID: 0
- Saved set-group-ID: 1000
复制代码 希望可以为你提供一些思路 |
|