【问题标题】:Set another userid to current process将另一个用户标识设置为当前进程
【发布时间】:2014-11-15 03:10:18
【问题描述】:

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

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

【问题讨论】:

    标签: c linux setuid


    【解决方案1】:

    一般情况下,只有根进程才能将其 uid 更改为另一个 uid。

    用户 ID 是 POSIX 安全模型的基本构建块。如果常规进程可以更改其用户 ID,那么一开始就没有用户 ID。任何进程都可以更改其 uid,并覆盖其他用户 ID 拥有的任何文件或目录。

    【讨论】:

    • 我要添加一条评论,即 OP 应该添加对系统调用的返回值的检查,例如 setresuid。这可能会为问题提供线索。
    • 谢谢。你的回答对我来说很有意义。据我所知,sudo 命令可以让一个用户做另一个用户做的事情,那么我该如何自己实现呢?
    • 正如我所说,用户 ID 分离是 Linux/Unix 安全设计的基本部分。非 root 进程本身无法切换用户标识。时期。没有例外。如果您需要这种功能,您将不得不设计一个更复杂的应用程序,它由多个进程组成,至少有一个进程以 root 身份运行,并且能够切换到其他用户 ID;然后有一个安全机制,另一个进程可以使用它在不同的用户ID下启动一个进程,并执行特定的操作......
    • ... 当然,您必须了解这种方法的安全隐患。您必须以某种方式设计您的整体应用程序,以确保其他一些随机进程无法控制整个应用程序的根特权部分,以便进行竞标;只有您的应用程序才能使用此功能。没有一个可以按下的神奇按钮,让这种应用程序突然出现。您必须弄清楚如何专门针对您的应用程序执行此操作,当然,这完全取决于您的应用程序在内部是如何工作的。
    【解决方案2】:

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

    chmod +s exec
    

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

    这里是指向带有 more details 的页面的链接,该页面具有 setuid 和 setgid 文件权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 2013-12-14
      • 2013-06-28
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多