「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実行可能ファイルの実行の影響を受けないため)。

おすすめ記事