Prozesse, die Berechtigungen über de-eskalierensetuid()
und setgid()
die Gruppenmitgliedschaften der von ihnen festgelegten UID / GID nicht zu erben scheinen.
Ich habe einen Serverprozess, der als Root ausgeführt werden muss, um einen privilegierten Port zu öffnen. Danach deeskaliert es zu einer bestimmten nicht privilegierten UID / GID, 1 - z. B. der des Benutzers foo
(UID 73). Benutzer foo
ist Mitglied der Gruppe bar
:
> cat /etc/group | grep bar
bar:x:54:foo
Wenn ich mich als anmelde foo
, kann ich eine Datei /test.txt
mit folgenden Merkmalen lesen :
> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar 8 16:22 /test.txt
Allerdings das folgende C-Programm (kompilieren std=gnu99
), wenn root ausgeführt wird:
#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;
}
Meldet immer, dass die Berechtigung verweigert wurde . Ich stelle mir vor, dass dies damit zu tun hat, dass es sich nicht um einen Anmeldevorgang handelt, aber es behindert die Art und Weise, wie Berechtigungen funktionieren sollen.
1. Das ist oft SOP für Server, und ich denke, es muss einen Weg geben, dies zu umgehen, da ich einen Bericht von jemandem gefunden habe, der es mit Apache macht - Apache wurde der Audiogruppe hinzugefügt und kann anscheinend dann das Soundsystem verwenden. Natürlich geschieht dies wahrscheinlich in einem Fork und nicht im ursprünglichen Prozess, aber tatsächlich ist der Fall in meinem Kontext der gleiche (es ist ein untergeordneter Prozess, der nach dem Aufruf von setuid gegabelt wird).
setgid(54)
anstelle von setgid(73)
(wie in /etc/groups
, Gruppe bar
hat GID 54) verwenden, funktioniert es?
setuid()
wieder können, nachdem Sie es getan haben ... aber, hmmm ... ich denke, Sie können mit seteuid()
...
setuid()
/setgid()
Anrufe um.