【发布时间】: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;
}
【问题讨论】: