実行ファイル内のsetgidの意味

実行ファイル内のsetgidの意味

私はsetuidバイナリ実行可能ファイルを介してプロセスがバイナリ所有者の有効なuidを取得できることを発見しました。私が理解できないのは、特定の実行可能ファイルのビットがオフにsetuidなっていて、setgidビットがオンになっている場合に何が起こるのかです。この状況ではどうなりますか?

例: 次の権限があるとします。

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

ここで、ユーザーがuserAグループのメンバーであると仮定しますwheel。このプログラムを実行しようとするとuserAどうなりますか?

プロセスの有効なユーザーIDは、uid名前が指定されたユーザーと同じであると仮定します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という2人のユーザーがいます。 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 のグループ所有権は、ユーザー bar のデフォルトのグループ bar ではなく foo です。

今、私たちは反対のアプローチを試みますが、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

所有者とグループの両方がバーです。

関連情報