「bash」のセカンダリグループにプライマリグループが含まれているのはなぜですか?

「bash」のセカンダリグループにプライマリグループが含まれているのはなぜですか?

私が理解したのは、bash(または意図的にこの動作を変更しない限り、すべてのプロセスが)実行されたときにログインしたユーザーの追加グループのリスト(他の情報のうち)を持つことです。

psサプリメントグループの結果は次のとおりですbash

PID    COMMAND    SUPGRP
1409   bash       adm dialout cdrom plugdev lpadmin admin sambashare chris

chrisログインしたユーザーのプライマリグループですが、セカンダリグループの一部としてリストされているのはなぜですか?

答え1

initgroup()、通常呼び出されるlibc関数ログインユーザーに代わって実行されるプロセスのグループの追加リストを設定するアプリケーションは、デフォルトのグループ ID をリストに追加します。

それ以外の場合、これはセキュリティの問題になる可能性があります。これは、他のグループの1つと一緒にsetgid実行可能ファイルを作成してグループへのアクセスを放棄し、そのファイルを実行してデフォルトのgidを失う方法を提供するためです。setgid()実際のgidも変更するように依頼してください。これにより、デフォルトグループへのアクセスが明示的に拒否されたリソースにアクセスできるようになります。

例:

$ ls -l file
-rw----r-- 1 root chazelas 7 Dec 12 15:33 file

私のデフォルトのGIDへのアクセスが拒否されました。

$ cat file
cat: file: Permission denied

次に、補足グループIDにグループが含まれていない私のようなシェルを起動し、login補足グループIDリストにグループを追加しなくても何ができるかを見てみましょう。

$ sudo perl -le '$( = $) =  "1000 2"; $< = $> = 1000; exec zsh'
$ ps -o rgroup,egroup,supgrp -p $$
RGROUP   EGROUP   SUPGRP
chazelas chazelas bin
$ id -a
uid=1000(chazelas) gid=1000(chazelas) groups=1000(chazelas),2(bin)

1000はgid、egidにありますが、補足グループリストにはありません。私はまたのメンバーなので、binsetgidbin実行可能ファイルを作成できます。

$ cp -f /usr/bin/env .
$ chgrp bin env
$ chmod g+s env
$ ./env perl -U -le '$( = $); exec qw(/usr/bin/id -a)'
uid=1000(chazelas) gid=2(bin) groups=2(bin)

私は使用しますperlsetgid()$( = $)。その後、chazelasグループメンバーシップを失いました。だから:

$ ./env perl -U -le '$( = $); exec qw(cat file)'
secret

補足リストにグループを追加してlogin終了できないことを確認してください(ルートのみリストを変更でき、setgid実行可能ファイルの実行の影響を受けないため)。

答え2

何かがそこに入れたんですよ。 (知っていますが、それほど満足ではありません。)

POSIX は次のように仮定します。getgroups()システムコールそれだけです。

実装は定義されていますか?グループのインポート()また、有効なグループIDを返します。グループ一覧大量に。

Linux(4.9)では、getgroups()有効なGIDは戻り値に含まれません/proc/$pid/statuspsDebianでは、表示されたときに追加されないように見えますが、id追加されます。

を使用して同じGIDを明示的に追加すると、setgroups()リストされます。

答え3

説明する:

説明を探している場合は、マンページから始めることをお勧めします。バラよりman ps

sugrp補足グループのSUPGRPグループ名(存在する場合)。 getgroups(2) を参照してください。

それから自然に[man getgroups][1]

getgroups()リスト内の呼び出しプロセスの補足グループIDを返します。引数のサイズは、リストが指すバッファに格納できるエントリの最大数に設定する必要があります。呼び出しプロセスがサイズを超える補足グループのメンバーである場合、エラーが生成されます。 呼び出しプロセスの有効グループIDが返されたリストに含まれるかどうかは指定されません。 (したがって、また、アプリケーションは getegid(2) を呼び出し、結果の値を追加または削除する必要があります。)

アプリケーション:

したがって、列の値から列の値を減算する必要があり、おそらくそうかもしれませんps -eo pid,user,args,sgroup,supgrp。補足セットを取得する方法は次のとおりです。SGROUPSUPGRP

メモ:

実際にコメントで指摘したようにps呼び出されません。getgroups()バラよりイルカチョ'砂スティーブン・チャジェラス答えはすべて技術的に正確でよく説明されています。この答えはただの補足グループです可能主なグループが含まれています。

関連情報