setuid not changing uid
问题描述:
我正在Linux上工作,并试图在Linux上执行一个C程序setuid
。这里是我的代码:setuid not changing uid
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
int main()
{
int ret;
fprintf (stderr, "Orig: %d Effective: %d\n", getuid(), geteuid());
ret = setuid (122);
if (ret < 0)
{
perror ("Problem in setuid ");
return (1);
}
fprintf (stderr, "UID : %d Effective: %d\n", getuid(), geteuid());
execlp ("/bin/id", "/bin/id", NULL);
fprintf (stderr, "Problem executing execlp\n");
return (0);
}
一旦执行,UID不会改变。输出是:
[[email protected] ~]$ ~sanjiv/bin/a.out
Orig: 155 Effective: 122
UID : 155 Effective: 122
uid=155(hauschild) gid=100(users) euid=122(sanjiv) groups=100(users)
[[email protected] ~]$
我在SO却无力地看着其他问题推测这一个。可执行文件的权限为rwsr-sr-x
。请注意代码如何运行以完成,退出状态报告为0
。但是,当我通过strace
运行它时,它在setuid
上给我一个错误,并且存在一个1
。如下:
geteuid() = 155
getuid() = 155
write(2, "Orig: 155 Effective: 155\n", 27Orig: 155 Effective: 155
) = 27
setuid(122) = -1 EPERM (Operation not permitted)
write(2, "Problem in setuid : Operation n"..., 45Problem in setuid : Operation not permitted
) = 45
exit_group(1) = ?
+++ exited with 1 +++
任何人都可以看到我可能做错了什么?
答
在POSIX和Linux中,setuid()
只设置进程的有效UID,除非有效UID是root,在这种情况下,它还设置真实UID和保存的set-user-ID。要设置真实的UID,请使用setreuid()
。 BSD setuid
将它们全部设置为无论过程的有效UID如何。
要设置真正的UID,使用setreuid
:
ret = setreuid(122, 122);
你的setuid调用没有任何效果。 [setuid的manpage](http://man7.org/linux/man-pages/man2/setuid.2.html)表示它设置* effective * uid。你的'a.out'是'rwsr-sr-x',所以它可以用'setuid'(使用文件所有者)自动执行,并且在你的'Orig:'行上打印有效的uid 122。 – Kenney
如果您尝试对setuid程序进行strace,它将在没有setuid的情况下运行。原因在于strace通过使用系统的进程跟踪工具来工作,这些工具是用于调试的并允许“调试器”(在这种情况下是strace)任意修改目标进程的内存。如果没有特权的用户可以对使用root权限运行的程序这样做,那将是一个坏消息。 –