Es gibt zwei Fälle,
- Sie möchten das Root-Privileg vorübergehend aufheben, während Sie das Programm setuid ausführen
- Sie möchten das Root-Privileg dauerhaft aufheben, während Sie das setuid-Programm ausführen...
- Sie können dies vorübergehend tun, indem Sie die euid auf die echte Benutzer-ID setzen und dann die uid auf einen beliebigen Wert ändern. Und später, wenn Sie das Root-Privileg wieder benötigen, können Sie die uid auf root setzen und die effektive Benutzer-ID wird wieder auf root geändert . Dies liegt daran, dass die gespeicherte Benutzer-ID nicht geändert wird.
- Sie können die Berechtigung dauerhaft aufheben, indem Sie die uid sofort in eine weniger privilegierte Benutzer-ID ändern. Danach können Sie das Root-Privileg auf keinen Fall zurückerhalten.
Fall 1:
Nachdem ein setuid-Programm ausgeführt wird
1.seteuid(600);
2.setuid(1000);
3.setuid(0);
Für diesen Fall kann das Root-Privileg wieder zurückerlangt werden.
+----+------+------------+
| uid|euid |saved-uid |
|----|------|------------|
1.|1000| 0 | 0 |
2.|1000| 600 | 0 |
3.|1000| 1000 | 0 |
4.|1000| 0 | 0 |
| | | |
+------------------------+
Fall 2:
Nachdem ein setuid-Programm ausgeführt wird ,
1.setuid(1000);
2.setuid(0);
+----+------+------------+
| uid|euid |saved-uid |
|----|------|------------|
1.|1000|0 | 0 |
2.|1000|1000 | 1000 |
| | | |
+------------------------+
In diesem Fall können Sie das Root-Privileg nicht zurückerhalten. Dies kann mit dem folgenden Befehl überprüft werden,
cat /proc/PROCID/task/PROCID/status | weniger
Uid: 1000 0 0 0
Gid: 1000 0 0 0
Dieser Befehl zeigt eine Uid und Gid an und hat 4 Felder (die ersten drei Felder sind die, mit denen wir uns befassen). Etwas wie oben
Die drei Felder repräsentieren uid, euid und gespeicherte Benutzer-ID. Sie können eine Pause (eine Benutzereingabe) in Ihr setuid-Programm einfügen und für jeden Schritt den cat /proc/PROCID/task/PROCID/status | less
überprüfen Befehl. Bei jedem Schritt können Sie überprüfen, ob sich die gespeicherte UID wie erwähnt ändert.
Wenn Ihre euid root ist und Sie die uid ändern, werden die Privilegien dauerhaft gelöscht. Wenn die effektive Benutzer-ID nicht root ist, wird die gespeicherte Benutzer-ID nie berührt und Sie können die Root-Berechtigung jederzeit wiedererlangen in deinem Programm.
BESCHREIBUNG setuid() setzt die effektive Benutzer-ID des aufrufenden Prozesses. Wenn die effektive UID des Aufrufers root ist, werden die echte UID und die gespeicherte Set-User-ID ebenfalls gesetzt.
Unter Linux ist setuid() wie die POSIX-Version mit dem Feature _POSIX_SAVED_IDS implementiert. Dadurch kann ein Set-User-ID-Programm (außer Root) alle seine Benutzerrechte aufgeben, einige nicht privilegierte Arbeiten ausführen und dann die ursprüngliche effektive Benutzer-ID auf sichere Weise wieder aktivieren.
Wenn der Benutzer root ist oder das Programm set-user-ID-root ist, ist besondere Vorsicht geboten. Die Funktion setuid() prüft die effektive Benutzerkennung des Aufrufers und wenn es sich um den Superuser handelt, werden alle prozessbezogenen Benutzerkennungen auf uid gesetzt. Nachdem dies geschehen ist, ist es für das Programm unmöglich, Root-Privilegien wiederzuerlangen.
Daher kann ein set-user-ID-root-Programm, das Root-Privilegien vorübergehend aufgeben, die Identität eines unprivilegierten Benutzers annehmen und anschließend Root-Privilegien wiedererlangen möchte, setuid() nicht verwenden. Sie können dies mit seteuid(2) erreichen.
(aus dem Linux Programmers' Manual, 2014-09-21, Seite setuid.2
)
Ö! Diese Funktionen sind schwierig richtig zu verwenden.
Die Manpage besagt, dass setuid die reale, gespeicherte und effektive UID ändert. Nach dem Aufruf von setuid(1000) ändern sich also alle drei auf 1000.
Das ist genau dann der Fall, wenn Sie euid 0 sind. Zum Zeitpunkt, an dem Sie setuid(0)
aufrufen , aber Sie sind euid 1000 und gespeichert uid 0 (prüfen Sie getresuid(2)
, zum Beispiel). Deshalb können Sie Privilegien wiedererlangen.