Cómo usar setuid () desde la raíz hasta convertirse en usuario, con la posibilidad de convertirse en la raíz de nuevo más tarde?
Pregunta
Estoy tratando de hacer lo que es seguro, y tener un programa que tiene que se ejecuta como root para dejar sus privilegios cuando no los necesita. Esto funciona bien si chmod
mi binario con el bit SUID, y hacer que pertenecen a la raíz, ya que ahora tengo UID = algún usuario, y EUID = raíz, por lo que puede utilizar seteuid(0)
y seteuid(getuid())
para elevar respectivamente y soltar derechos de administrador.
Pero si uso sudo
en lugar de establecer la SUID, entonces UID == == 0 EUID, y así seteuid(getuid())
llamando no tendrá ningún efecto. Y no puedo simplemente cambiar UID
a algún valor de algún usuario aleatorio, como la página de manual setuid()
establece claramente que si se llama desde un programa en ejecución como root, uno pierde los privilegios para siempre, sin esperanza de recuperarlas.
Así que, ¿cómo puedo hacer mi programa pierde temporalmente sus privilegios cuando se ejecuta utilizando sudo
?
Solución
seteuid(some random uid)
sin los privilegios, seteuid(0)
para recuperarlos, cuando se ejecuta como root
.
Otros consejos
Parece que seteuid (x) debe trabajar a bajar y volver a subir privs ...
$ cat > t12.c
#include <stdio.h>
#include <unistd.h>
void p(void) { printf("euid=%4d uid=%4d\n", geteuid(), getuid()); }
int main(void) { p(); seteuid(100); p(); seteuid(0); p(); return 0; }
$ cc -Wall t12.c
$ sudo chown root a.out && sudo chmod 4555 a.out
$ sudo ./a.out
euid= 0 uid= 0
euid= 100 uid= 0
euid= 0 uid= 0
$ ./a.out
euid= 0 uid= 501
euid= 100 uid= 501
euid= 0 uid= 501
$
No es una respuesta directa, simplemente le gustaría señalarle a la idea de separación de privilegios . Aquí está una gran la presentación por el fundador de OpenBSD Theo de Raadt.
Tenedor () antes de caer privilegios. Esperar en la tarea padre hasta que el niño con privilegios reducidos se hace, entonces reanudar en el padre con raíz.
seteuid no es portátil para todos los sistemas Unix y tiene otras desventajas también.