Wie zu verwenden setuid () von Root-Benutzer zu werden, mit der Möglichkeit, es später noch einmal Wurzel zu werden?

StackOverflow https://stackoverflow.com/questions/2275241

Frage

Ich versuche, die sichere Sache zu tun, und haben ein Programm, dass Bedürfnisse läuft als root seine Privilegien fallen zu lassen, wenn sie sie nicht benötigen. Das funktioniert gut, wenn ich meine binär mit dem SUID-Bit chmod, und machen es zu root gehören, wie jetzt habe ich UID = einige Benutzer und EUID = root, so dass ich seteuid(0) und seteuid(getuid()) um jeweils zu erhöhen und Drop-Admin-Rechte nutzen können.

Aber wenn ich sudo verwenden, anstatt die SUID der Einstellung, dann UID == EUID == 0, und so ruft seteuid(getuid()) keine Auswirkungen haben. Und ich kann nicht nur UID von einem zufälligen Benutzer bis zu einem gewissen Wert ändern, wie der setuid() Manpage klar die besagt, wenn es von einem Programm aufgerufen wird als root ausgeführt wird, man die Privilegien für gutes verliert, ohne Hoffnung auf sich zurück zu bekommen.

Also, wie kann ich mein Programm verliert vorübergehend seine Privilegien bei der Ausführung mit sudo?

War es hilfreich?

Lösung

seteuid(some random uid) Privilegien fallen, seteuid(0) sie zurück zu bekommen, wenn sie als root ausgeführt wird.

Andere Tipps

Es scheint, wie seteuid (x) sollte funktionieren fallen zu lassen und Reraise privs ...

$ cat > t12.c
#include <stdio.h>
#include <unistd.h>

void p(void) { printf("euid=%4d uid=%4d\n", geteuid(), getuid()); }

int main(void) { p(); seteuid(100); p(); seteuid(0); p(); return 0; }
$ cc -Wall t12.c
$ sudo chown root a.out && sudo chmod 4555 a.out
$ sudo ./a.out
euid=   0 uid=   0
euid= 100 uid=   0
euid=   0 uid=   0
$ ./a.out
euid=   0 uid= 501
euid= 100 uid= 501
euid=   0 uid= 501
$ 

keine direkte Antwort, möchte nur Sie auf die Idee Punkt von Privileg Trennung . Hier ist eine große Präsentation von OpenBSD-Gründer Theo de Raadt.

Fork (), bevor Sie Privilegien fallen. Warten Sie in der übergeordneten Aufgabe, bis das Kind mit reduziert Rechten ausgeführt wird, dann wieder in der Mutter mit Wurzel.

seteuid ist nicht tragbar für alle Unix-Varianten und hat auch andere Nachteile.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top