![](/img/trans.png)
[英]Executable with set-user-ID-on-execution option doesn't set effective uid
[英]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.