"bash"의 보조 그룹에 기본 그룹도 포함되어 있는 이유는 무엇입니까?

"bash"의 보조 그룹에 기본 그룹도 포함되어 있는 이유는 무엇입니까?

제가 이해한 바로는, bash(또는 의도적으로 이 동작을 변경하지 않는 한 모든 프로세스가) 실행될 때 로그인한 사용자에 대한 추가 그룹 목록이 (다른 정보 중에서) 갖게 됩니다.

ps보충제 그룹의 결과 는 다음과 같습니다 bash.

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

chris로그인한 사용자에 대한 기본 그룹인데 보조 그룹의 일부로 나열되는 이유는 무엇입니까?

답변1

initgroup(), 일반적으로 호출되는 libc 함수로그인사용자를 대신하여 실행되는 프로세스에 대한 추가 그룹 목록을 설정하는 애플리케이션은 기본 그룹 ID를 목록에 추가합니다.

그렇지 않은 경우 이는 보안 문제가 될 수 있습니다. 이는 다른 그룹 중 하나와 함께 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에 있지만 보충 그룹 목록에는 없습니다. 저는 또한 의 회원이므로 binsetgid bin실행 파일을 만들 수 있습니다.

$ 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 실행 파일 실행의 영향을 받지 않기 때문입니다).

답변2

뭔가가 거기에 넣었거든요. (알고 있지만 그다지 만족스럽지는 않습니다.)

POSIX는 다음과 같이 가정합니다.getgroups()시스템 호출그게 다야

구현이 정의되어 있습니까?그룹 가져오기()또한 유효한 그룹 ID를 반환합니다.그룹 목록대량으로.

Linux(4.9)에서는 getgroups()유효한 GID가 반환 값에 포함되지 않습니다 /proc/$pid/status. psDebian에서는 표시될 때 추가되지 않는 것처럼 보이지만 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()바라보다이르카초'모래스티븐 차제라스답변은 모두 기술적으로 정확하고 잘 설명되어 있습니다. 이 대답은 단지 보충 그룹이가능한주요 그룹이 포함되어 있습니다.

관련 정보