私が理解したのは、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にありますが、補足グループリストにはありません。私はまたのメンバーなので、bin
setgidbin
実行可能ファイルを作成できます。
$ 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)
私は使用しますperl
(setgid()
)$( = $)
。その後、chazelas
グループメンバーシップを失いました。だから:
$ ./env perl -U -le '$( = $); exec qw(cat file)'
secret
補足リストにグループを追加してlogin
終了できないことを確認してください(ルートのみリストを変更でき、setgid実行可能ファイルの実行の影響を受けないため)。