Por que os grupos suplementares de “bash” também contêm o grupo primário?

1

Com base em meu entendimento, quando bash (ou qualquer processo, desde que não altere intencionalmente esse comportamento) for executado, ele terá (juntamente com outras informações) uma lista dos grupos suplementares para o usuário conectado .

A seguir, o resultado ps para os grupos suplementares de bash :

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

chris é o grupo principal do usuário logado, então por que ele está listado como parte dos grupos suplementares?

    
por user7681202 12.12.2017 / 14:33

3 respostas

2

Porque algo colocou lá. (Não muito satisfatório, eu sei.)

POSIX assume a getgroups() chamada do sistema é que

It is implementation-defined whether getgroups() also returns the effective group ID in the grouplist array.

No Linux (4.9), getgroups() não inclui o GID efetivo no retornado e nem /proc/$pid/status . ps no Debian também não parece adicioná-lo durante a exibição, mas id faz.

Se o mesmo GID for explicitamente adicionado com setgroups() , ele será listado.

    
por 12.12.2017 / 15:15
2

initgroup() , a função libc normalmente chamada pelos aplicativos login para definir a lista de grupos suplementares do processo executado em seu nome, adiciona o ID do grupo primário a essa lista.

Caso contrário, isso seria um problema de segurança, pois isso permitiria a você abandonar o acesso a esse grupo criando um executável setgid com um de seus outros grupos e executaria isso para perder seu gid primário ( esse executável teria que chamar setgid() para o gid real também mudar), o que lhe daria acesso a recursos que foram explicitamente negados acesso ao seu grupo primário, por exemplo.

Exemplo:

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

O acesso foi negado ao meu principal gID:

$ cat file
cat: file: Permission denied

Agora, vamos começar um shell como eu, onde os IDs de grupo suplementares não incluem esse grupo para ver o que poderíamos fazer se login não adicionasse esse grupo à nossa lista de ID de grupo suplementar:

$ 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 está em gid, egid, mas não na lista de grupos suplementares. Como também sou membro de bin , posso criar um executável setgid 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)

Estou usando perl para chamar setgid() ( $( = $) ). E então perdi a associação do grupo chazelas . Então:

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

Ao adicionar o grupo à lista suplementar, login garante que você não pode sair dele (pois somente o root pode alterar essa lista e não é afetado pela execução de executáveis do setgid).

    
por 12.12.2017 / 16:43
0

Explicação:

Se você está procurando uma explicação, as man pages são sempre um bom lugar para começar. Veja man ps :

supgrp SUPGRP group names of supplementary groups, if any. See getgroups(2).

e, em seguida, naturalmente, [man getgroups][1] :

getgroups() returns the supplementary group IDs of the calling process in list. The argument size should be set to the maximum number of items that can be stored in the buffer pointed to by list. If the calling process is a member of more than size supplementary groups, then an error results. It is unspecified whether the effective group ID of the calling process is included in the returned list. (Thus, an application should also call getegid(2) and add or remove the resulting value.)

Aplicação:

Portanto, você deve ps -eo pid,user,args,sgroup,supgrp e possivelmente subtrair o valor na coluna SGROUP daqueles na coluna SUPGRP . Esta é a maneira de obter apenas grupos suplementares.

Nota:

De fato, ps não chama getgroups() , como apontado nos comentários. Veja ilkkachu e são tecnicamente corretas e bem explicadas. Esta resposta apenas quer dizer que se espera que grupos suplementares possam conter o grupo primário.

    
por 12.12.2017 / 15:12