gpt4 book ai didi

c - 在 execvp 之前设置 gid,但 id 命令显示多个组

转载 作者:太空宇宙 更新时间:2023-11-04 10:17:28 25 4
gpt4 key购买 nike

我有一个项目,但我想使用 root 以普通用户身份执行程序。

首先我有一个普通用户 fgo,其 uid 和 gid 是 501。

id fgo
[root@cpera test]# id fgo
uid=501(fgo) gid=501(fgo) groups=501(fgo)

这是示例代码

#define _GNU_SOURCE
#include <sched.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/capability.h>
#include <sys/resource.h>
#include <unistd.h>
#include<stdlib.h>
#include <stdio.h>
#include <string.h>
int main( int argc,char *argv[]){
while(setgid(501)!=0) sleep(1);
while(setuid(501)!=0) sleep(1);
printf("start to exec\n");
execvp("/bin/sh",NULL);
}

编译执行

gcc a.c && ./a.out

输出是:

[root@cpera test]# ./a.out 
start to exec
[fgo@cpera test]$ id
uid=501(fgo) gid=501(fgo) groups=501(fgo),0(root)

我在谷歌上搜索了一下,发现 id 中的组称为 supplementary group从父进程继承。 GID, current, primary, supplementary, effective and real group IDs?

如何让 root 不在子进程的组中?

最佳答案

使用setgroups()重置补充组:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <grp.h>
#include <sys/types.h>

int main (int argc, char *argv[])
{
if (setgroups (0, NULL) != 0) {
perror ("setgroups");
exit (1);
}

if (setgid (501) != 0) {
perror ("setgid");
exit (1);
}

if (setuid (501) != 0) {
perror ("setuid");
exit (1);
}

printf ("start to exec\n");

if (execl ("/bin/sh", NULL) != 0) {
perror ("execl");
}

return 1;
}

关于c - 在 execvp 之前设置 gid,但 id 命令显示多个组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45437061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com