c - 在linux中调用setgid和setuid后无法访问属于某个组的文件

标签 c linux file-permissions setuid

让我们添加一个新组和用户并将其添加到系统组video

$ sudo addgroup --system mydaemon
$ sudo adduser --system --no-create-home --ingroup mydaemon mydaemon
$ sudo adduser mydaemon video

创建一个文件并将其所有者更改为 root,并将组更改为 video

$ touch video0
$ sudo chown root:video video0
$ sudo chmod 0660 video0

现在考虑一个使用 setgid()setuid() 用 C 语言编写的简单应用程序

/* perms.c */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <pwd.h>
#include <grp.h>


int main(int argc, char const *argv[])
{
    int ret;
    int gid;
    int uid;
    struct passwd *pw;
    struct group  *gr;

    pw = getpwnam("mydaemon");
    if (pw) {
        ret = setgid(pw->pw_gid);
        if (ret < 0) {
            printf("error with setgid\n");
            exit(1);
        }

        ret = setuid(pw->pw_uid);       
        if (ret < 0) {
            printf("error with setuid\n");
            exit(1);
        }
    }

    pw = getpwuid(getuid());
    gr = getgrgid(getgid());

    printf("gid: %d gr_name: %s\n", gr->gr_gid, gr->gr_name);
    printf("uid: %d user_name: %s\n", pw->pw_uid, pw->pw_name);

    ret = open("video0", O_RDWR);

    printf("open status: %d (errno %d)\n", ret, errno);

    return 0;
}

编译后我们可以以普通用户身份运行它:

$ ./perms
error with setgid

失败是因为我们没有 setgid 的权限 因此直接作为 mydaemon 运行:

$ sudo -u mydaemon ./perms
gid: 126 gr_name: mydaemon
uid: 116 user_name: mydaemon
open status: 3 (errno 0)

很好,我可以执行 setgidsetuid (我是同一个用户),并且可以按预期打开文件

现在以 root 身份运行它:

$ sudo ./perms
gid: 126 gr_name: mydaemon
uid: 116 user_name: mydaemon
open status: -1 (errno 13)

我可以执行setgidsetuidgetgidgetuid表示我正在作为mydaemon运行< strong>但我无法打开该文件。 (错误号13是EACCES:权限被拒绝)

问题出在哪里?

最佳答案

您应该使用 initgroups() 调用根据组数据库初始化组。

关于c - 在linux中调用setgid和setuid后无法访问属于某个组的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12476288/

相关文章:

关于 PCA9555 扩展器上#interrupt-cells 配置的混淆

ASP.NET 无法读取文件 : "access to the path ... is denied"

Laravel 4 对带有 Puppet 的 Vagrant 框的权限

c - 如何使用函数和输出 C

c - 创建灵活(动态内存分配)数组的任务

c - 用两个指针搜索链表

php - 具有 laravel 4 应用程序的 Vagrant VM,新文件夹和子目录的 mkdir() 文件权限被拒绝

c - 需要数学/bignum 挑战的帮助

linux - 我如何在 bash 中一个接一个地运行 for 循环

c++ - QTransform::setRotation 与 Q_PROPERTY