繁体   English   中英

setuid() 当指定的用户 ID 与有效用户 ID 相同时返回 -1

[英]setuid() return -1 when specified user ID is the same as the effective user ID

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

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

我用 root 权限运行它

须藤 ./授权

所以一开始,我的进程的uid(真实uid)euid(有效uid)

用户名:0用户名:0

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

用户名:0用户名:501

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

用户名:501用户名:501

根据手册的setuid ()

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

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

这是我的代码

#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;
}

您可以尝试使用经典的错误解释来弄清楚。 为此,您可以向该部分添加一些代码:

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

不要忘记添加这些标题:

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

祝你好运!

我在我的 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()函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM