【发布时间】:2013-11-19 01:33:04
【问题描述】:
我有一个 C 程序,它使用组“agrp”的组 ID 调用 setgid(),当我尝试运行它时,它显示“不允许操作”。
该程序有以下ls -la列表:
-r-xr-s--x 1 root agrp 7508 Nov 18 18:48 setgidprogram
我想要的是setgidprogram 能够访问拥有者otheruser 和组agrp 的文件,并且权限设置为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
现在这些信息足够了吗?
【问题讨论】:
-
文件系统是否在没有
nosuid的情况下挂载? -
我不这么认为。其他 suid 程序运行良好。另外,这个程序是 sgid 而不是 suid。
-
更新有点混乱。它显示了一个任何人都可以运行的程序
/tmp/whoami_script.sh;更有效的测试会给它 550 个权限。但是,代码运行时的输出显示包装程序的 SGID-ness 没有生效;egid没有任何条目,agrp也没有任何条目(即使使用不同的名称 - 不要笑;我已经看到这种情况发生了,/etc/group中有两个条目用于 GID 1234,名称不同,两者都“工作” ',但ls和id等只报告两个名称之一)。因此,SGID 显然不适合您。 -
请注意,Mac OS X 上的
mount文档说“nosuid– 不允许 set-user-identifier 或 set-group-identifier 位生效”。在 Linux 上可能是一样的;没有单独的nosgid选项。
标签: c linux permissions