我在运行以下C程序时遇到了问题:
#include<unistd.h>
void main()
{
if (access("/root/main.c",R_OK)==0)
{
printf("/root/main.c can be read\n");
}
else
{
printf("can't be read\n");
}
}当我以root身份运行可执行文件时,我可以获得输出:
/root/main.c can be read但是,当我将可执行文件的权限设置为4755,并以普通用户的身份运行它时,我只获得输出:
can't be read我的协议有什么错误吗?
发布于 2018-03-12 15:58:08
access忽略setuid/setgid位。这是故意的。
引用Linux上的man 2 access:
检查是使用调用进程的实际UID和GID完成的,而不是在实际尝试文件上的操作(例如
open(2))时执行的有效UID。类似地,对于根用户,检查使用一组允许的功能,而不是一组有效的功能;对于非根用户,该检查使用一组空的功能集。 这允许设置用户ID程序和具有能力的程序轻松地确定调用用户的权限.换句话说,access()不回答“我可以读/写/执行这个文件吗?”有个问题。它回答了一个稍微不同的问题:“(假设我是一个setuid二进制文件)调用我的用户能读取/写/执行这个文件吗?”,这给了设置用户ID程序防止恶意用户读取用户不应该读取的文件的可能性。
如果您想知道您的进程是否真的可以打开一个文件进行读取,只需将其open()并处理错误(如果有的话)。(这也避免了比赛条件。)
https://stackoverflow.com/questions/49237516
复制相似问题