El Libro de cocina de programación segura para C y C ++ dice que:
"Los grupos auxiliares son heredados por un proceso de su proceso principal, y solo pueden ser modificados por un proceso con privilegios de superusuario. Por lo tanto, si un proceso con privilegios de superusuario está eliminando estos privilegios, también debe asegurarse de eliminar cualquier grupos auxiliares que puede tener. Esto se logra llamando a
setgroups( )
con un solo grupo , que es el ID de grupo real para el proceso ". [1.3, énfasis mío]
¿Cuál es la razón para hacer lo anterior en lugar de solo setgroups(0, NULL)
; es decir, ¿en lista vacía?
¿Hay algún problema de portabilidad al empujar una lista vacía de grupos suplementarios?
Si no, ¿qué se logra al instalar el GID real de un proceso como un grupo auxiliar? ¿El problema es que si el GID real no está entre los elementos auxiliares y algún otro GID es efectivo, entonces el proceso no es efectivamente un miembro de ese grupo? Eso no parece ser un problema de seguridad y en realidad es una característica. En cualquier caso, esto es en el contexto de la eliminación de privilegios, por lo que el GID real está a punto de convertirse en el efectivo de todos modos. Si estamos a punto de terminar con la situación getresgid() == < 1, 1, 1 >
, ¿de qué sirve organizar getgroups() == { 1 }
versus getgroups() == { }
?