gpt4 book ai didi

c - setgid 不允许操作

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

我有一个 C 程序,它使用组“agrp”的组 id 调用 setgid(),当我尝试运行它时,它显示“不允许操作”。

该程序有以下 ls -la list :

-r-xr-s--x 1 root      agrp      7508 Nov 18 18:48 setgidprogram

我想要的是 setgidprogram 能够访问具有所有者 otheruser 和组 agrp 以及权限集的文件to u+rw,g+rw(用户和组可读写)

我做错了什么? setgidprogram 是否也必须设置 setuid 位? (当我尝试它时,它起作用了。)

我正在运行 Fedora 19,并且我禁用了 SELinux。

编辑

下面是一些示例代码:wrap.c:

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <grp.h>
int main(void)
{
struct group *grp = getgrnam("agrp");
printf("%d\n",grp->gr_gid);
if(setgid(grp->gr_gid) != 0)
{
printf("%s.\n", strerror(errno));
return 1;
}
execl("/tmp/whoami_script.sh", NULL);
printf("%s.\n", strerror(errno));
return 0;
}

/tmp/whoami_script.sh:

#!/usr/bin/bash
id


$ ls -la /tmp/whoami_script.sh wrap
-r-xr-xr-x 1 root agrp 19 Nov 18 19:53 /tmp/whoami_script.sh
$ ./wrap
1234
uid=1000(auser) gid=1000(auser) groups=1000(auser),0(root),10(wheel)
---x--s--x 1 root agrp 7500 Nov 18 19:55 wrap

现在这些信息足够了吗?

最佳答案

这段代码终于奏效了:

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <grp.h>
int main(void)
{
gid_t g = getegid();
if(setregid(g, g) != 0)
{
printf("Error setting GID: %s.\n", strerror(errno));
}
execl("/tmp/whoami_script.sh", "/tmp/whoami_script.sh", NULL);
printf("Error: %s.\n", strerror(errno));
return 0;
}

问题是我只设置了我的有效 GID,而不是我的真实 GID。因此,当我执行时,子进程以将 EGID 设置为 RGID 的方式启动。所以,在我的代码中,我使用了 setregid 效果很好。

关于c - setgid 不允许操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20061473/

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