【问题标题】:setuid() return -1 when specified user ID is the same as the effective user IDsetuid() 当指定的用户 ID 与有效用户 ID 相同时返回 -1
【发布时间】:2018-04-08 00:13:39
【问题描述】:

我已经编译了一个二进制文件Authorization,这是它的许可

-rwsr-sr-x 1根轮18464 10 26 22:07 ./授权

我是用root权限运行的

sudo ./授权

所以一开始,我的进程的uid(real uid)euid(effective uid)

uid:0 euid:0

然后我的程序会调用 seteuid(501) 来更改 euid,现在是

uid:0 euid:501

最后,我的程序会调用 setuid(501),我预计结果是

uid:501 euid:501

根据setuid()

的手册

如果有效用户 ID 是超级用户 ID,则允许使用 setuid() 函数 用户,或者如果指定的用户 ID 与有效用户 ID 相同。

但是,setuid(501) 返回 -1,这不是预期的,也不是手册中描述的行为,WHY??

这是我的代码

#include <stdio.h>
#include <unistd.h>
int main(int argc, const char * argv[]) {
    printf("uid: %d euid: %d\n", getuid(), geteuid());

    if (seteuid(501) == -1) {
        printf("seteuid error\n");
    }
    printf("seteuid(501)> uid: %d euid: %d\n", getuid(), geteuid());

    if (setuid(501) == -1) {
        printf("setuid error\n");
    }
    printf("setuid(501)> uid: %d euid: %d\n", getuid(), geteuid());

    return 0;
}

【问题讨论】:

    标签: c macos unix


    【解决方案1】:

    您可以尝试使用经典的错误解释来解决这个问题。 为此,您可以在该部分添加一些代码:

     if (setuid(501) == -1) {
        printf("setuid error\n");
        printf ("Error while setting uid: %s\n", strerror(errno));
    }
    

    不要忘记添加这些标题:

    #include <string.h>
    #include <errno.h>
    

    祝你好运!

    【讨论】:

      【解决方案2】:

      我在我的 macOS (10.12.6) 上尝试了您的代码,错误为 EPERM(不允许操作)。

      不确定 macOS 的手册页是否已过时。在我的 macOS 上,setuid 的手册页仍然是 June 4, 1993


      在 Linux (Debian 8.9) 上,setuid 的手册页显示:

      setuid() 设置调用进程的有效用户ID如果调用者的有效UID为root,则同时设置真实UID和保存的set-user-ID。

      APUE(第 2 版)书 (8.11 Changing User IDs and Group IDs) 说:

      只有超级用户进程才能更改真实用户 ID。 通常情况下,真实用户 ID 在我们登录时由 login(1) 程序设置,并且永远不会更改。因为 login 是一个超级用户进程,所以它会在调用 setuid 时设置所有三个用户 ID。

      POSIX.1-2008 (SUSv4) 说:

      setuid()setgid() 函数在被非特权调用时的各种行为 过程反映了不同历史实现的行为。 为了便携性,它是 建议新的非特权应用程序改用seteuid()setegid() 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-30
        • 1970-01-01
        • 2023-03-08
        • 2018-11-22
        • 2017-10-10
        • 2019-03-30
        • 2012-12-13
        相关资源
        最近更新 更多