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?

StackOverflow https://stackoverflow.com/questions/2275241

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top