首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于setuid的问题

关于setuid的问题
EN

Stack Overflow用户
提问于 2018-03-12 14:19:41
回答 1查看 200关注 0票数 0

我在运行以下C程序时遇到了问题:

代码语言:javascript
复制
#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身份运行可执行文件时,我可以获得输出:

代码语言:javascript
复制
/root/main.c can be read

但是,当我将可执行文件的权限设置为4755,并以普通用户的身份运行它时,我只获得输出:

代码语言:javascript
复制
can't be read

我的协议有什么错误吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-12 15:58:08

access忽略setuid/setgid位。这是故意的。

引用Linux上的man 2 access

检查是使用调用进程的实际UID和GID完成的,而不是在实际尝试文件上的操作(例如open(2))时执行的有效UID。类似地,对于根用户,检查使用一组允许的功能,而不是一组有效的功能;对于非根用户,该检查使用一组空的功能集。 这允许设置用户ID程序和具有能力的程序轻松地确定调用用户的权限.换句话说,access()不回答“我可以读/写/执行这个文件吗?”有个问题。它回答了一个稍微不同的问题:“(假设我是一个setuid二进制文件)调用我的用户能读取/写/执行这个文件吗?”,这给了设置用户ID程序防止恶意用户读取用户不应该读取的文件的可能性。

如果您想知道您的进程是否真的可以打开一个文件进行读取,只需将其open()并处理错误(如果有的话)。(这也避免了比赛条件。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49237516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档