¿Siempre configura grupos antes de setuid?

5

En los sistemas GNU / Linux que se crean utilizando paquetes RPM, la utilidad rpmlint se queja de los programas que no llaman a setgroups antes de setuid .

La idea es que antes de eliminar los privilegios, un proceso también debe eliminar la lista de ID de grupo suplementarios con setgroups(0, NULL) .

Sin embargo, ¿esto es algo que siempre debe hacerse?

Supongamos que estamos ejecutando setuid root y tenemos una lista de ID de grupo suplementarios de nuestro contexto de seguridad original: los grupos asociados con el ID de usuario real.

Cuando regresamos a esa ID de usuario real, no necesariamente queremos perder esos grupos: el código que se ejecuta como el usuario original puede depender de que esas membresías suplementarias estén en su lugar, ¿no?

¿No deberíamos omitir setgroups(0, NULL) en el código setuid antes de quitarle privilegios al usuario original?

(Por cierto, por supuesto, no eliminamos los privilegios con setuid en Linux porque eso no funciona con el código que ejecuta setuid no root).

    
pregunta Kaz 02.05.2016 - 20:47
fuente

1 respuesta

4

Esto depende casi totalmente de si está eliminando privilegios temporal o permanentemente.

En el caso de la eliminación temporal de privilegios, no es aconsejable llamar a setgroups con un solo grupo, ya que borrará la lista de grupos auxiliares, lo que posiblemente haga imposible (sin intervención externa) restaurar el proceso. volver a su nivel de privilegio original.

En el caso de la eliminación permanente de privilegios, es importante borrar la lista de grupos auxiliares para que sea más difícil que un exploit vuelva a crear privilegios después de que se eliminen. El problema surge cuando intentas hacer esto al revés: si primero aplicas setuid a un valor distinto de cero (lo que significa que ya no eres root), entonces llamas a setgroups , el uid efectivo del proceso es ahora ya no es root, lo que significa que la llamada interna setgid falla. Hacerlo al revés no tiene este problema porque llamar primero a setgid no altera el uid efectivo del proceso, lo que permite que se llame a setuid .

Más información se puede encontrar aquí:

respondido por el Polynomial 02.05.2016 - 21:07
fuente

Lea otras preguntas en las etiquetas