setuid()返回0但没有效果

时间:2016-08-28 09:05:45

标签: c linux permissions operating-system setuid

我有以下代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

void main(int argc, char* argv[]) {
    printf("uid=%u euid=%u\n", getuid(), geteuid());
    printf("%d = setuid(euid)\n", setuid(geteuid()));
    printf("uid=%u euid=%u\n", getuid(), geteuid());
}

编译并以这种方式运行:

 val@particle:/tmp $ sudo gcc foo.c
 val@particle:/tmp $ sudo chown dev-misc:dev-misc a.out
 val@particle:/tmp $ sudo chmod u+s a.out
 val@particle:/tmp $ ./a.out
uid=1000 euid=1006
0 = setuid(euid)
uid=1000 euid=1006

为什么uid保持不变?为什么setuid报告成功? (根据手册页,0表示成功)

1 个答案:

答案 0 :(得分:1)

setuid()设置有效用户ID,而不是实际进程ID。来自manual

  

setuid()设置调用进程的有效用户ID。如果          调用者的有效UID是root(更确切地说:如果调用者          具有CAP_SETUID功能),真正的UID和保存的set-user-ID          也设定了。

为了能够更改真实用户ID,该流程必须将有效用户ID设置为0.因为,在您的示例中并非如此,它不会发生变化。 setuid()成功,因为您只是将其设置为流程已有的相同有效用户ID。