2

这是我的问题。我需要从 FreeBSD 上的 C 代码检查特定文件和特定用户的读取权限。我写了一段代码:

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

int main(int argc, char *argv[]){
    int r_ok;

    if(setuid(1002)){
        printf("Cant's set uid\n");
        exit(1); 
    }

    r_ok = access("/tmp/dir", R_OK);
    printf("error: %d: %s\n", errno, strerror(errno));
    printf("%d\n", r_ok);
    return 0;
}

一般来说,它工作正常,但是当我像这样为 /tmp/dir 设置权限时:

d---r-x---  2 root  fruit1  512 Sep 10 18:20 /tmp/dir

程序输出

error: 13: Permission denied
-1

尽管 UID 为 1002 的用户是组 fruit1 的有效成员:

# groups 1002
orange fruit1

我会很高兴为您提供任何帮助。

4

1 回答 1

1

setuid()设置进程的真实有效用户ID,但不修改setgid()组访问列表,为此您必须调用initgroups()setgroups()

因此,您的程序使用使用的 ID 1002 和原始组 ID 和组访问列表运行,而不是使用用户 1002 的组访问列表运行。这解释了为什么该进程没有对该目录的读取权限。

请注意,这access()被认为是“安全漏洞”(例如参见access()安全漏洞)。通常最好尝试打开文件或目录,而不是事先检查读取权限。

于 2013-09-10T19:26:12.433 回答