0

为什么可执行文件设置root suid,但访问(路径,W_OK)仍然返回-1?

代码:

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

int main()
{
    printf("privilege => %d\n", access("/usr/local/etc/t.conf", W_OK));
    return 0;
}

测试运行:

[www@mypy access]$ ll
总用量 12
-rwsrwxr-x. 1 root root 6600 1月  22 10:05 access
-rw-rw-r--. 1 www  www   135 1月  22 10:05 access.c

[www@mypy access]$ ./access 
privilege => -1

[root@mypy access]# ./access 
privilege => 0
4

2 回答 2

3

access函数故意检查真实用户的访问权限,忽略可执行文件具有不同的有效 UID/GID 的事实。

如果您只想知道是否可以进行读取或写入访问,您可以打开文件并查看是否有错误。但是,仔细的 setuid 可执行文件通常想知道真实用户是否能够对文件执行操作。要找出答案,他们可以使用access库函数。

这在中解释man 2 access

检查是使用调用进程的真实 UID 和 GID 完成的,而不是像实际尝试对文件进行操作(例如,open(2))时所做的有效 ID。...</p>

这允许 set-user-ID 程序和具有能力的程序轻松确定调用用户的权限。换句话说,access() 没有回答“我可以读/写/执行这个文件吗?” 问题。它回答了一个稍微不同的问题:“(假设我是 setuid 二进制文件)调用我的用户可以读/写/执行此文件吗?”,这使 set-user-ID 程序有可能防止恶意用户导致它们读取用户不应该读取的文件。

于 2016-01-22T02:32:58.020 回答
1

谢谢rici的回答!我完成如下

int accesswriteable(char const *path)
{
    if(access(path, F_OK))
    {
        return 1;
    }
    FILE *fp = fopen(path, "a");
    if(fp == NULL)
    {
        return 1;
    }
    fclose(fp);
    return 0;
}

#define PATH_WRITE_ABLE(path) (accesswriteable(path) == 0)
于 2016-01-22T03:15:29.620 回答