4

我目前正试图弄清楚 SUID 位和相应的函数 seteuid 和 geteuid 是如何工作的。所以我写了这个小程序:

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

int main(int argc, char **argv) {

    printf("oldid %d\n", geteuid());
    if(seteuid(0) == -1)
        perror("seteuid faied");
    printf("newid %d\n", geteuid());

    return 0;

}

编译它,将其所有者更改为 root,并将文件所有者的 s 位更改为:

[chris@myhost Test]$ ls -l test
-rwsr-xr-x 1 root root 4830 Apr  5 07:56 test

但随后产生的输出如下所示:

[chris@myhost Test]$ ./test
oldid 0
newid 0

这是我不明白的。根据我的发现,第一次调用 geteuid 实际上应该返回该程序调用者的用户 ID(即 chris - 我的 ID 为 1000),但程序将 root 显示为有效用户 ID。谁能解释我为什么会这样?

4

1 回答 1

7

geteuid()我的 Mac (OS X 10.6.7) 的手册页中:

真正的用户 ID 是调用该程序的用户的 ID。由于有效用户 ID 在执行“set-user-ID”模式进程期间为进程提供了额外的权限,因此 getuid() 用于确定调用进程的真实用户 ID。

由于您设置了 suid 位,因此程序的有效用户 id 是从执行开始的文件所有者(root)。

于 2011-04-05T08:15:58.980 回答