0
我正在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 +++
任何人都可以看到我可能做錯了什麼?
你的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權限運行的程序這樣做,那將是一個壞消息。 –