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() == { }
?