私は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
所有者とグループの両方がバーです。