Würde das Speichern der effektiven Benutzer-ID in einer Variablen am Anfang des Programms die gespeicherte Benutzer-ID nicht überflüssig machen?
Es geht nicht darum, was sich das Userspace-Programm merkt, sondern welche Rechte der Kernel ihm zugesteht. Damit die Trennung zwischen Benutzern funktioniert, muss es ein System sein, das steuert, welche Benutzer-IDs ein Prozess verwenden kann. Andernfalls könnte jeder Prozess einfach darum bitten, root zu werden.
Wie kann ich die gespeicherte Benutzer-ID in einem C-Programm abrufen? Ich konnte keine Funktionen finden, die das tun.
Mit Standardfunktionen geht das nicht (es gibt nur getuid()
und geteuid()
). Zumindest Linux hat getresuid()
die jedoch alle drei Benutzer-IDs zurückgeben.
Wie auch immer, normalerweise müssten Sie es nicht lesen. Es ist da, um das Umschalten zwischen der echten Benutzer-ID und der effektiven Benutzer-ID im Falle eines setuid-Programms zu ermöglichen, sodass es als Kopie der effektiven Benutzer-ID startet.
In einem setuid-Programm ist die tatsächliche Benutzer-ID die des Benutzers, der es ausführt, und die effektive und die gespeicherte Benutzer-ID sind die des Benutzers, der das Programm besitzt. Die effektive Benutzer-ID ist diejenige, die für Berechtigungsprüfungen von Bedeutung ist. Wenn der Prozess also Berechtigungen vorübergehend aufheben möchte, ändert er die effektive Benutzer-ID zwischen der echten und der gespeicherten Benutzer-ID.
Auf welche Weise überprüft der Kernel anhand der gespeicherten Benutzerkennung, ob ein Prozess seine Benutzerkennung ändern kann oder nicht? Bedeutet dies, dass, wenn ein Prozess versucht, seine effektive Benutzer-ID zu ändern, der Kernel die gespeicherte Benutzer-ID überprüft, um sicherzustellen, dass der Prozess dazu berechtigt ist?
Ja. Die Linux-Manpage für setuid()
erwähnt dies, aber es ist etwas versteckt:
ERRORS
EPERM The user is not privileged and uid does not match the real
UID or saved set-user-ID of the calling process.
Mit anderen Worten, Sie können (die effektive) Benutzer-ID nur auf eine der echten oder gespeicherten IDs setzen.
Die Manpage für setreuid()
ist klarer:
Unprivileged processes may only set the effective user ID to the real
user ID, the effective user ID, or the saved set-user-ID.