【发布时间】:2012-06-19 03:14:06
【问题描述】:
我在 C 中创建了一个 setuid 程序。可执行文件如下所示:
-r-s-r-s--- 1 root users 13073 Jun 15 21:56 server
我以userA/users 执行程序并尝试将uid/gid 设置为userB/otherUsers。 setgid() 失败,不允许操作。 userA 不属于otherUsers 如何更改有效gid?
[编辑]这是我所做的一个小总结。我的 C 程序以 userA 身份执行,将 uid 和 gid 设置为 userB 并创建一个文件。与预期不同,该文件属于组 root,因为 setgid() 失败。
[userA@node uid]$ id
uid=11945(userA) gid=544(users) groups=544(users)
[userA@node uid]$ id userB
uid=11946(userB) gid=10792(otherUsers) groups=10792(otherUsers)
[userA@node uid]$ cat uid.c
#include <stdio.h>
#include <unistd.h>
int main() {
setuid(11946);
setgid(10792);
FILE *f = fopen("userB_file", "w");
fclose(f);
return 0;
}
[userA@node uid]$ ls -l uid
-r-sr-sr-x 1 root root 7130 Jun 17 14:16 uid
[userA@node uid]$ ./uid
[userA@node uid]$ ls -l userB_file
-rw-r--r-- 1 userB root 0 Jun 17 14:19 userB_file
【问题讨论】:
-
您确定
setgid()以users组中用户的权限运行吗?这将导致它因“不允许操作”而失败,因为读取和 exec/setuid privs 不会扩展到世界/其他。 -
我不明白。我必须以 root 身份运行我的程序吗?我认为将所有者设置为 root 就足以更改 uid/gid。我将无法以 root 身份运行该程序。
-
Unix 权限是所有者/组/{world,other}。您已经为所有者(root)和组(用户)阅读并执行了 exec+setuid。您没有发布代码,但如果调用 setgid() 的内容既不是 root 用户也不是在用户组中,则会给出您报告的错误。
-
我只是用 userB/otherUsers 的 id 调用 setuid() 和 setgid()。程序本身由用户 A 执行。我应该添加一些示例代码吗?
标签: c linux permissions setuid