![](/img/trans.png)
[英]How does the condition (type & ~(R_OK|W_OK|X_OK|F_OK)) work in C?
[英]Executable file set root suid, but access(path, W_OK) still return -1?
为什么可执行文件设置了root suid,但是access(path,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
access
库功能故意检查实际用户的访问权限,而忽略了可执行文件具有不同的有效UID / GID的事实。
如果仅想知道是否可以进行读取或写入访问,则可以打开文件并查看是否有错误。 但是,小心谨慎的setuid可执行文件通常想知道真实用户是否能够对文件执行操作。 为了找到答案,他们可以使用access
库功能。
这在man 2 access
解释:
检查是使用调用进程的实际UID和GID完成的,而不是像实际在文件上尝试执行操作(例如
open(2)
)时所执行的有效ID。…这允许设置用户ID程序和赋予功能的程序轻松确定调用用户的权限。 换句话说,access()无法回答“我可以读取/写入/执行此文件吗?” 题。 它回答了一个稍有不同的问题:“(假设我是setuid二进制文件)调用我的用户可以读取/写入/执行此文件吗?”,这使set-user-ID程序可以防止恶意用户导致它们出现。读取用户不应该读取的文件。
感谢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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.