setuid(getuid())

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
wanne
Moderator
Beiträge: 7448
Registriert: 24.05.2010 12:39:42

setuid(getuid())

Beitrag von wanne » 25.06.2014 13:38:48

Hi, kann mal da jemand drüber gucken?
ftp://balja.org/progs/suidsuspend/suspend.c
Das Programm soll ein suid-bit bekommen und jetzt wollte ich fragen ob das so sicher ist.
Ich denke mir nach setuid(user) bin ich auf der sicheren seite. User können ihre UID nicht ändern entsprechend wird alles was danach läuft wieder nur mit User-rechten ausgeführt und ich mich um nichts mehr kümmern. Stimmt das so?
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Livingston
Beiträge: 1367
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: setuid(getuid())

Beitrag von Livingston » 28.06.2014 22:52:34

Sieht ok aus. Da Du mit der effektiven UID 0 (root) startest, werden durch setuid die Werte der effektiven, realen und der saved UID geändert, d.h. der User kann keine root-Privilegien zurückerhalten:
man setuid hat geschrieben:Unter Linux ist setuid() wie die POSIX-Version mit dem Merkmal _POSIX_SAVED_IDS implementiert...
Wenn der Benutzer root oder das Programm setuid root ist, ist besondere Sorgfalt notwendig. Die Funktion setuid() überprüft die effektive Benutzer-ID (UID) des Aufrufenden. Falls es der Superuser ist, werden alle diesen Prozess betreffenden Benutzer-IDs auf uid gesetzt. Danach ist es für das Programm unmöglich, die root-Privilegien wiederzuerlangen.
U.U solltest Du die Sache mit setgid abrunden. Dabei erst setgid und dann setuid aufrufen.

Benutzeravatar
smutbert
Moderator
Beiträge: 8318
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: setuid(getuid())

Beitrag von smutbert » 28.06.2014 22:59:00

Nach dem ersten sinnvollen Post, erlaube ich mir auch die überaus überflüssige Feststellung, dass hopfuly zwar lustig, aber kein Wort ist.

Code: Alles auswählen

//hopfuly unreachable
:wink:

Benutzeravatar
Livingston
Beiträge: 1367
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: setuid(getuid())

Beitrag von Livingston » 28.06.2014 23:10:37

Hopfen und Hoffnung scheinen sehr eng miteinander verwandt zu sein.
Nastarowje

wanne
Moderator
Beiträge: 7448
Registriert: 24.05.2010 12:39:42

Re: setuid(getuid())

Beitrag von wanne » 29.06.2014 01:15:20

Livingston hat geschrieben:
man setuid hat geschrieben:Falls es der Superuser ist, werden alle diesen Prozess betreffenden Benutzer-IDs auf uid gesetzt. Danach ist es für das Programm unmöglich, die root-Privilegien wiederzuerlangen.
Soweit war mir das eigentlich klar. Die Frage war eher, ob es gegebnenfalls irgend wie möglich ist da die UID zu "faken" weil ich ja schlicht auf getuid() setze.
Livingston hat geschrieben:U.U solltest Du die Sache mit setgid abrunden. Dabei erst setgid und dann setuid aufrufen.
Das programm soll eigentlich kein set-gid bit bekommen insofern sollte die ja weiterhin stimmen. Oder sehe ich da was falsch?
dass hopfuly zwar lustig, aber kein Wort ist.
Zuerst richtig programmieren und dann auch noch richtig schreiben...
Irgend wo hörts dann aber mal auf. Sehe ich aus wie Superman? :mrgreen:
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Livingston
Beiträge: 1367
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: setuid(getuid())

Beitrag von Livingston » 29.06.2014 10:33:10

wanne hat geschrieben:Die Frage war eher, ob es gegebnenfalls irgend wie möglich ist da die UID zu "faken" weil ich ja schlicht auf getuid() setze.
Der Knackpunkt ist, dass 3 UIDs vermerkt werden.
1. Die UID des Users, der den Prozess startet, unabhängig davon, wem das Programm gehört. Abrufbar über getuid()
2. Die effektive UID: In der Regel ist das die eigene, aber durch das SUID-Bit wird hier die UID des wahren Besitzers eingetragen. Dieser Wert kann auch durch setuid() geändert werden. Zu kriegen über geteuid()
3. Die saved UID (oder wie die auch immer genau heißt): Sie beinhaltet die ursprüngliche effektive UID (siehe 2). Sie ermöglicht ein Hin- und Herspringen zwischen dem Aufrufer und dem Besitzer, sofern letzterer nicht root ist. Lässt sich bestimmt auch mit einer tollen Funktion abrufen.

Wenn - wie in deinem Fall wegen des SUID-Bits - die effektive UID 0 ist, dann macht setuid() kurzen Prozess und trägt für alle 3 Werte, die neue UID ein. Konkret heißt das: Wenn Du vorher getuid() aufrufst, erhältst Du die UID des Aufrufers, also z.B. Deine eigene, da Du den Prozess startest. Die Funktion geteuid() würde Dir root liefern, aber die nutzt Du ja nicht.
wanne hat geschrieben:Das programm soll eigentlich kein set-gid bit bekommen insofern sollte die ja weiterhin stimmen. Oder sehe ich da was falsch?
Es sollte eigentlich nix passieren, aber wenn Du schon defensiv programmierst, kannste ja mit setgid() auf Nummer sicher gehen.

Antworten