O problema é que setuid
e setgid
não são suficientes para fornecer ao seu processo todas as credenciais necessárias. As autorizações de um processo dependem de
- seu UID
- seu GID
- seus grupos suplementares
- suas capacidades.
Veja man 7 credentials
para obter uma visão geral mais detalhada. Portanto, no seu caso, o problema é que você configura corretamente o UID e o GID, mas não define os grupos suplementares do processo. E o grupo bar
tem GID 54, não 73, por isso não é reconhecido como um grupo em que seu processo está.
Você deve fazer
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <grp.h>
int main (void) {
gid_t supplementary_groups[] = {54};
setgroups(1, supplementary_groups);
setgid(73);
setuid(73);
int fd = open("/test.txt", O_RDONLY);
fprintf(stderr,"%d\n", fd);
return 0;
}