我想将当前进程的有效uid设置为其他用户的uid(或任意值)。
struct passwd* pwHost = getpwnam(hostName);//hostName is another user's name
struct passwd* pwGuest = getpwnam(guestName);//guestName is the current log-in user's name
if(pwHost==NULL||pwGuest==NULL)
{
printf("User cannot be found\n");
exit(0);
}
//setresuid(pwGuest->pw_uid, pwHost->pw_uid, pwGuest->pw_uid);//change the effective uid of current process to the host uid
setresuid(1000, 1000, 1000);//change current process's uid to a arbitrary value
printf("Host uid: %u\n", pwHost->pw_uid);
printf("Guest uid: %u\n", pwGuest->pw_uid);
static uid_t euid, ruid, suid;
getresuid(&euid, &ruid, &suid);
printf("euid: %u\n", euid);
printf("ruid: %u\n", ruid);
printf("suid: %u\n", suid);
printf("Set permission complete\n");
结果:
Host uid: 35917
Guest uid: 35917
euid: 35917
ruid: 35917
suid: 35917
然而,似乎它们都没有改变。我查阅了手册,其中解释了用户需要特权或我不太了解的内容。谁能给我一些如何实现我的目标的提示?非常感谢。
答案 0 :(得分:0)
通常,只有根进程可以将其uid更改为另一个uid。
Userids是POSIX安全模型的基本构建块。如果常规进程可以更改其用户标识,那么首先就没有用户标识。任何进程都可以更改其uid,并覆盖另一个用户标识所拥有的任何文件或目录。
答案 1 :(得分:0)
除了您拥有的代码之外,您还需要设置文件权限以指示可执行文件具有setuid权限。这可以用;
完成chmod +s exec
这允许任何随机用户使用可执行文件所有者的权限来执行程序。如果可执行文件的所有者是root用户,则可以绕过许多安全功能,从而产生危险的结果。
这是指向setuid和setgid文件权限的more details页面的链接。