setgid 在可执行文件中的含义

setgid 在可执行文件中的含义

我发现setuid二进制可执行文件允许进程获取二进制所有者的有效 uid。我无法理解的是,如果特定可执行文件的setuid位关闭但setgid位打开会怎样。在这种情况下会发生什么?

示例:假设我们有以下权限

ls -l my_bin
r-xr-s--- root wheel my_bin

现在假设用户userA是组的成员wheel。当userA尝试运行这个程序时会发生什么?

我认为该进程的有效用户 ID 将与uidname 的用户相同wheel。这是一个人为的例子,但我对团体权利如何改变有效 uid 或它们是否对有效 uid 有任何影响感到困惑。

答案1

setgid 位的工作方式与 setuid 位相同,但用于组 ID。因此该过程将以有效的方式运行团体车轮 ID。有效的(和真实的)用户ID 仍然是启动该程序的用户的 ID。

无论哪种方式,您的用户在该组中的成员资格并不重要。

编辑:示例 C 程序,以便您可以尝试它的工作原理。不可移植,但对于其他系统来说很容易采用:

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

int main() {
    int ruid, euid, suid;
    int rgid, egid, sgid;

    if (0 != getresuid(&ruid, &euid, &suid)) {
        perror("getresuid");
        return 1;
    }
    if (0 != getresgid(&rgid, &egid, &sgid)) {
        perror("getresgid");
        return 1;
    }
    printf("ruid = %i, euid = %i, suid = %i\nrgid = %i, egid = %i, sgid = %i\n",
            ruid, euid, suid, rgid, egid, sgid);
    return 0;
}

答案2

setgid 位也可用于目录。如果目录具有 setgid 位并且是组可写的,则如果具有不同主组的用户(不是目录所有者)在该目录中写入文件,但在拥有该目录的组中具有补充成员身份,则新文件将获得与目录相同的组所有权。不是写入文件的用户的主要组。在某些情况下非常方便。

例如,我们有两个用户,foo 和 bar。 foo 的主要组也是 foo. bar 的主要组是 bar,但也是 foo 的补充成员。

foo@valhalla:~$ id
uid=1002(foo) gid=1002(foo) groups=1002(foo)

bar@valhalla:~$ id
uid=1003(bar) gid=1003(bar) groups=1003(bar),1002(foo)

foo@valhalla:~$ grep foo /etc/group
foo:x:1002:bar
foo@valhalla:~$ grep bar /etc/group
foo:x:1002:bar
bar:x:1003:

我将创建一个目录 /tmp/foodir 并使其 setgid 和组可写。

foo@valhalla:~$ mkdir /tmp/foodir
foo@valhalla:~$ chmod g+ws /tmp/foodir
foo@valhalla:~$ ls -ld /tmp/foodir
drwxrwsr-x 2 foo foo 4096 Jun  6 19:30 /tmp/foodir

我现在将触摸 /tmp/foodir 中的一个文件作为用户栏。

bar@valhalla:~$ touch /tmp/foodir/barfile
bar@valhalla:~$ ls -l /tmp/foodir/barfile 
-rw-r--r-- 1 bar foo 0 Jun  6 19:32 /tmp/foodir/barfile

请注意 /tmp/foodir/barfile 的组所有权是 foo,而不是用户 bar 的主要组 bar。

现在我们尝试相反的方法,但 foo 不是 bar 组的成员。

bar@valhalla:~$ mkdir /tmp/bardir
bar@valhalla:~$ chmod g+ws /tmp/bardir
bar@valhalla:~$ ls -ld /tmp/bardir
drwxrwsr-x 2 bar bar 4096 Jun  6 19:34 /tmp/bardir

看看当我们尝试以 foo 的形式触摸文件时会发生什么。这是您应该预料到的,权限错误。

foo@valhalla:~$ touch /tmp/bardir/foofile
touch: cannot touch '/tmp/bardir/foofile': Permission denied

最后一步。我们将 /tmp(bar 可以写入的未设置 gid 的目录)中的一个文件作为 bar。

 bar@valhalla:~$ ls -ld /tmp/barfile
-rw-r--r-- 1 bar bar 0 Jun  6 19:36 /tmp/barfile

老板和团体都是酒吧。

相关内容