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?
setuid(getuid())
setuid(getuid())
rot: Moderator wanne spricht, default: User wanne spricht.
- Livingston
- Beiträge: 1816
- Registriert: 04.02.2007 22:52:25
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: 127.0.0.1
Re: setuid(getuid())
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:
U.U solltest Du die Sache mit setgid abrunden. Dabei erst setgid und dann setuid aufrufen.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.
Re: setuid(getuid())
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
- Livingston
- Beiträge: 1816
- Registriert: 04.02.2007 22:52:25
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: 127.0.0.1
Re: setuid(getuid())
Hopfen und Hoffnung scheinen sehr eng miteinander verwandt zu sein.
Nastarowje
Nastarowje
Re: setuid(getuid())
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: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.
Das programm soll eigentlich kein set-gid bit bekommen insofern sollte die ja weiterhin stimmen. Oder sehe ich da was falsch?Livingston hat geschrieben:U.U solltest Du die Sache mit setgid abrunden. Dabei erst setgid und dann setuid aufrufen.
Zuerst richtig programmieren und dann auch noch richtig schreiben...dass hopfuly zwar lustig, aber kein Wort ist.
Irgend wo hörts dann aber mal auf. Sehe ich aus wie Superman?
rot: Moderator wanne spricht, default: User wanne spricht.
- Livingston
- Beiträge: 1816
- Registriert: 04.02.2007 22:52:25
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: 127.0.0.1
Re: setuid(getuid())
Der Knackpunkt ist, dass 3 UIDs vermerkt werden.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.
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.
Es sollte eigentlich nix passieren, aber wenn Du schon defensiv programmierst, kannste ja mit setgid() auf Nummer sicher gehen.wanne hat geschrieben:Das programm soll eigentlich kein set-gid bit bekommen insofern sollte die ja weiterhin stimmen. Oder sehe ich da was falsch?