将另一个用户标识设置为当前进程

时间:2014-11-15 03:10:18

标签: c linux setuid

我想将当前进程的有效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

然而,似乎它们都没有改变。我查阅了手册,其中解释了用户需要特权或我不太了解的内容。谁能给我一些如何实现我的目标的提示?非常感谢。

2 个答案:

答案 0 :(得分:0)

通常,只有根进程可以将其uid更改为另一个uid。

Userids是POSIX安全模型的基本构建块。如果常规进程可以更改其用户标识,那么首先就没有用户标识。任何进程都可以更改其uid,并覆盖另一个用户标识所拥有的任何文件或目录。

答案 1 :(得分:0)

除了您拥有的代码之外,您还需要设置文件权限以指示可执行文件具有setuid权限。这可以用;

完成
chmod +s exec

这允许任何随机用户使用可执行文件所有者的权限来执行程序。如果可执行文件的所有者是root用户,则可以绕过许多安全功能,从而产生危险的结果。

这是指向setuid和setgid文件权限的more details页面的链接。