Qual è la logica per chiamare setgroup in un elenco di lunghezza uno?

1

Il Ricettario di programmazione sicura per C e C ++ dice che:

"Ancillary groups are inherited by a process from its parent process, and they can only be altered by a process with superuser privileges. Therefore, if a process with superuser privileges is dropping these privileges, it must also be sure to drop any ancillary groups it may have. This is achieved by calling setgroups( ) with a single group, which is the real group ID for the process." [1.3, emphasis mine]

Qual è la logica per fare quanto sopra e non solo setgroups(0, NULL) ; cioè, en lista vuota?

C'è qualche problema di portabilità con l'inserimento di una lista vuota di gruppi supplementari?

In caso contrario, cosa si ottiene installando il GID reale di un processo come gruppo ausiliario? Il problema è che se il GID reale non è tra gli ausiliari e qualche altro GID è efficace, allora il processo non è efficace un membro di quel gruppo? Questo non sembra un problema di sicurezza ed è in realtà una caratteristica. In ogni caso, questo è nel contesto del dropping dei privilegi, in modo che il GID reale stia per diventare quello efficace in ogni caso. Se stiamo per finire con la situazione getresgid() == < 1, 1, 1 > , a cosa serve arrangiare per getgroups() == { 1 } contro getgroups() == { } ?

    
posta Kaz 03.05.2016 - 00:12
fonte

1 risposta

1

Sembra una portabilità. Ad esempio questo post sulla mailing list di Samba con una patch inclusa, riga dell'oggetto, "setgroups richiede almeno un gruppo ":

"On some operating systems (in this case BSD/OS 4.2) setgroups must be given at least one group. When no other groups are wanted, it is given the same group as the desired effective group (as seen in sendmail)."

Questo genere di cose è degno di nota quando si effettua una raccomandazione su una pratica.

    
risposta data 03.05.2016 - 00:38
fonte

Leggi altre domande sui tag