setfsuid - Benutzeridentität für Dateisystemprüfungen
setzen
Standard-C-Bibliothek (
libc,
-lc)
#include <sys/fsuid.h>
int setfsuid(uid_t fsuid);
Unter Linux hat ein Prozess sowohl eine Dateisystembenutzerkennung als auch eine
effektive Benutzerkennung. Die (Linux-spezifische) Dateisystembenutzerkennung
wird für die Berechtigungsprüfung beim Zugriff auf
Dateisystemobjekte verwandt, während die effektive Benutzerkennung
für verschiedene andere Arten von Berechtigungsprüfungen
verwandt wird (siehe
credentials(7)).
Normalerweise ist der Wert der Dateisystembenutzerkennung des Prozesses
identisch zu dem Wert seiner effektiven Benutzerkennung. Dies kommt daher,
dass der Kernel auch die Dateisystembenutzerkennung zu dem gleichen Wert der
effektiven Benutzerkennung ändert, wenn sich die effektive
Benutzerkennung eines Prozesses ändert. Mittels
setfsuid() kann
ein Prozess veranlassen, dass sich der Wert seiner Dateisystembenutzerkennung
von dem Wert seiner effektiven Benutzerkennung unterscheidet, womit dieser den
Wert der Dateisystembenutzerkennung auf den in
fsuid angegeben Wert
ändert.
Explizite Aufrufe von
setfsuid() und
setfsgid(2) werden (wurden)
gewöhnlich nur von Programmen wie dem Linux-NFS-Server benutzt. Sie
müssen die für Dateizugriffe verwendete Benutzer- und
Gruppenkennung ändern, ohne die reale oder effektive Gruppenkennung zu
ändern. Eine Änderung der normalen Benutzerkennungen bei
Programmen wie dem NFS-Server ist (war) eine Sicherheitslücke, die es
unerwünschten Signalen aussetzen kann. (Allerdings ist dieses Problem
historischer Natur, lesen Sie Nachstehendes.)
setfsuid() wird nur erfolgreich sein, wenn der Aufrufende der Superuser
ist oder wenn
fsuid entweder der realen, effektiven Benutzerkennung,
der gesicherten SUID oder der aktuellen Dateisystembenutzerkennung entspricht.
Sowohl im Fehler- als auch im Erfolgsfall wird dieser Aufruf die vorherige
Dateisystembenutzerkennung des Aufrufenden zurückliefern.
Dieser Systemaufruf ist in Linux seit Version 1.2 vorhanden.
setfsuid ist Linux-spezifisch und sollte nicht in portierbaren Programmen
benutzt werden.
Zum Zeitpunkt, an dem dieser Systemaufruf erfolgte, konnte ein Prozess ein
Signal an einen anderen Prozess mit der selben effektiven Benutzerkennung
senden. Dies bedeutete, dass ein privilegierter Prozess, falls er zum
Prüfen von Dateizugriffsrechten seine effektive Benutzerkennung
änderte, in die Lage versetzt wurde, Signale von einem anderen (nicht
privilegierten) Prozess mit der selben Kennung zu empfangen. Daher wurde das
Benutzerkennungsatttribut des Dateisystems hinzugefügt, um einem
Prozess das Ändern seiner Benutzerkennung zum Prüfen der
Dateizugriffsrechte zu ermöglichen, ohne gleichzeitig sensibel
für den Empfang unerwünschter Signale zu werden. Seit Linux 2.0
ist der Umgang mit Signalrechten anders gelöst (siehe
kill(2)),
was dazu führt, dass ein Prozess seine effektive Benutzerkennung
ändern kann, ohne empfänglich für Signale von
unerwünschten Prozessen zu werden. Daher wird
setfsuid()
heutzutage nicht mehr benötigt und sollte in neuen Anwendungen
vermieden werden (ebenso
setfsgid(2)).
Der Original-Linux-Systemaufruf
setfsuid() unterstützte nur
16-Bit-Benutzerkennungen. Nachfolgend fügte Linux 2.4
setfsuid32() hinzu, das 32-Bit-Kennungen unterstützte. Die
Glibc-Wrapper-Funktion
setfsuid() stellt die Änderungen
transparent über Kernel-Versionen hinweg bereit.
Wenn der Wrapper für diesen Systemaufruf unter Glibc 2.15 und
älter feststellt, dass das Argument nicht ohne Ganzzahlschnitt an den
Kernel übergeben werden kann (weil der Kernel alt ist und keine
32-Bit-Benutzerkennungen unterstützt), wird -1 zurückgegeben und
errno auf
EINVAL gesetzt. Der Systemaufruf unterbleibt.
Es werden keine Anhaltspunkte für Fehler an den Aufrufenden
zurückgegeben und die Tatsache, dass sowohl erfolgreiche als auch nicht
erfolgreiche Aufrufe den selben Wert zurückgeben, macht es
unmöglich, direkt zu bestimmen, ob der Aufruf erfolgreich war oder
fehlschlug. Stattdessen musste der Aufrufende auf die Betrachtung des
Rückgabewerts eines weiteren Prozesses wie
setfsuid(-1)
zurückgreifen (der immer fehlschlägt), um zu bestimmen, ob ein
vorheriger Aufruf von
setfsuid() die Dateisystembenutzerkennung
geändert hat. Zumindest sollte
EPERM zurückgegeben
werden, wenn der Aufruf fehlschlägt (da dem Aufrufenden die
CAP_SETUID-Capability fehlt).
kill(2),
setfsgid(2),
capabilities(7),
credentials(7)
Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother
<
[email protected]>, Helge Kreutzmann <
[email protected]>, Chris
Leick <
[email protected]> und Mario Blättermann
<
[email protected]> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU
General Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an die
Mailingliste
der Übersetzer