Procesos que reducen los privilegios a través de setuid()
y setgid()
no parecen heredar las pertenencias a grupos del uid / gid que establecen.
Tengo un proceso de servidor que debe ejecutarse como root para abrir un puerto privilegiado; después de eso se reduce a un uid / gid no privilegiado específico, 1 , por ejemplo, el del usuario foo
(UID 73). El usuario foo
es miembro del grupo bar
:
> cat /etc/group | grep bar
bar:x:54:foo
Por lo tanto, si inicio sesión como foo
, puedo leer un archivo /test.txt
con estas características:
> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar 8 16:22 /test.txt
Sin embargo, el siguiente programa C (compilar std=gnu99
), cuando se ejecuta root:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main (void) {
setgid(73);
setuid(73);
int fd = open("/test.txt", O_RDONLY);
fprintf(stderr,"%d\n", fd);
return 0;
}
Siempre informa Permiso denegado . Me imagino que esto tiene que ver con que es un proceso que no es de inicio de sesión, pero de alguna manera afecta a la forma en que se supone que funcionan los permisos.
1. Lo que a menudo es SOP para servidores, y creo que debe haber una forma de evitarlo, ya que encontré un informe de alguien haciéndolo con apache. Apache se ha agregado al grupo de audio y aparentemente puede usar el sistema de sonido. Por supuesto, esto probablemente ocurre en una bifurcación y no en el proceso original, pero de hecho, el caso es el mismo en mi contexto (es un proceso secundario bifurcado después de la llamada setuid).
setgid(54)
lugar de setgid(73)
(como en /etc/groups
, el grupo bar
tiene gid 54), ¿funciona?
setuid()
volver después de hacerlo ... pero, hmmm ... creo que se puede con seteuid()
...
setuid()
/setgid()
.