¿Cuál es la razón para llamar a setgroups en una lista de longitud uno?

1

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

    
pregunta Kaz 03.05.2016 - 00:12
fuente

1 respuesta

1

Parece portabilidad. Por ejemplo, esta publicación en la lista de correo de Samba con un parche incluido, asunto, "setgroups requiere al menos un grupo ":

  

"En algunos sistemas operativos (en este caso BSD / OS 4.2), los grupos deben ser   dado al menos un grupo. Cuando no se quieren otros grupos, se da   el mismo grupo que el grupo efectivo deseado (como se ve en sendmail). "

Vale la pena mencionar este tipo de cosas al hacer una recomendación sobre una práctica.

    
respondido por el Kaz 03.05.2016 - 00:38
fuente

Lea otras preguntas en las etiquetas