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.txt
con 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 bar
has gid 54), funziona?
setuid()
nuovo dopo averlo fatto ... ma, hmmm ... penso che puoi con seteuid()
...
setuid()
/setgid()
chiama.