Eu encontrei este Q ainda sem resposta; G-Man e Bratchley apontaram o erro; getuid()
retorna o "ID do usuário real do processo de chamada", enquanto geteuid()
retorna o "ID do usuário efetivo do processo de chamada".
Você pode ver a diferença com este programa:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main (void) {
printf ("getuid=%d, geteuid=%d\n", getuid(), geteuid());
setuid(geteuid());
printf ("getuid=%d, geteuid=%d\n", getuid(), geteuid());
}
$ gcc -o getuid getuid.c
$ sudo chown root getuid
$ sudo chmod u+s getuid
$ su nobody -c ./getuid
getuid=60001, geteuid=0
getuid=0, geteuid=0