Processi che riducono i privilegi tramite setuid()e setgid()non sembrano ereditare le appartenenze ai gruppi dell'uid / gid che hanno impostato.
Ho un processo server che deve essere eseguito come root per aprire una porta privilegiata; successivamente si riduce a uno specifico uid / gid non privato, 1 - ad esempio, quello dell'utente foo(UID 73). L'utente fooè un membro del gruppo bar:
> cat /etc/group | grep bar
bar:x:54:foo
Quindi, se accedo come foo, posso leggere un file /test.txtcon queste caratteristiche:
> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar 8 16:22 /test.txt
Tuttavia, il seguente programma C (compilare std=gnu99), quando si esegue 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;
}
Segnala sempre Autorizzazione negata . Immagino che ciò abbia a che fare con il fatto che si tratta di un processo senza accesso, ma in un certo senso ha i muscoli posteriori della coscia nel modo in cui dovrebbero funzionare le autorizzazioni.
1. Che è spesso SOP per i server, e penso che ci debba essere un modo per aggirare questo dato che ho trovato un rapporto di qualcuno che lo fa con apache - apache è stato aggiunto al gruppo audio e apparentemente può quindi utilizzare il sistema audio. Certo, questo probabilmente accade in un fork e non nel processo originale, ma in realtà il caso è lo stesso nel mio contesto (è un processo figlio biforcuto dopo la chiamata setuid).
setgid(54)invece di setgid(73)(come in /etc/groups, group barhas gid 54), funziona?
setuid()nuovo dopo averlo fatto ... ma, hmmm ... penso che puoi con seteuid()...
setuid()/setgid()chiama.