Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C setgid()失败-不允许操作_C_Linux_Permissions_Setuid - Fatal编程技术网

C setgid()失败-不允许操作

C setgid()失败-不允许操作,c,linux,permissions,setuid,C,Linux,Permissions,Setuid,我用C创建了一个setuid程序。可执行文件如下所示: -r-s-r-s--- 1 root users 13073 Jun 15 21:56 server 我以userA/users的身份执行程序,并尝试将uid/gid设置为userB/otherUserssetgid()失败,不允许操作userA不属于otherUsers如何更改有效gid [编辑]以下是我所做工作的小结。我的C程序作为userA执行,将uid和gid设置为userB并创建一个文件。由于setgid()失败,因此该文件不

我用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并创建一个文件。由于
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
[userA@nodeuid]$id
uid=11945(用户A)gid=544(用户)组=544(用户)
[userA@nodeuid]$id userB
uid=11946(用户B)gid=10792(其他用户)组=10792(其他用户)
[userA@nodeuid]$cat uid.c
#包括
#包括
int main(){
setuid(11946);
setgid(10792);
FILE*f=fopen(“userB_文件”,“w”);
fclose(f);
返回0;
}
[userA@nodeuid]$ls-l uid
-r-sr-sr-x 1根根根7130 Jun 17 14:16 uid
[userA@nodeuid]$。/uid
[userA@nodeuid]$ls-l用户b_文件
-rw-r--r--1 userB root 0 Jun 17 14:19 userB_文件

我怀疑您在
setgid
之前调用了
setuid
。只要调用
setuid
将uid更改为root以外的其他值,您就失去了将gid更改为任意值的权限。您必须先调用
setgid
,然后调用
setuid

您确定
setgid()
正在以
users
组中的用户权限运行吗?这将导致它以“不允许操作”失败,因为read和exec/setuid priv没有扩展到world/other。我不明白这一点。我必须以root用户身份运行程序吗?我认为将所有者设置为root就足以更改uid/gid。我无法以root用户身份运行该程序。Unix权限为owner/group/{world,other}。您已经为所有者(root)和组(users)读取并执行了exec+setuid。您没有发布代码,但如果调用setgid()的对象不是root用户或用户组中的用户,则会出现您报告的错误。我只是使用userB/otherUsers的id调用setuid()和setgid()。程序本身由userA执行。我应该添加一些示例代码吗?这很简单!该死,你说得太对了。我改变了顺序,当然,它起作用了!谢谢顺便说一句:我在问题中添加了我原来的C程序。它实际上并不那么明显。setgid的手册页和setuid的手册页中都没有报告它。@Bemipefe:权限模型的结果应该是,当您是一个普通的无特权用户时,您不能将组id更改为任何您想要的内容。@R。。我指的是setgid函数必须在setuid函数之前调用。此规则也适用于以root用户身份运行的进程。@Bemipefe:此“规则”只是因为只有root用户才能将gid更改为任意组。调用
setuid
后,您不再是root用户。