Kann ein Superuser-Prozess die tatsächliche Benutzer-ID und Gruppen-ID eines Prozesses ändern, die nicht mit denen in der Kennwortdatei übereinstimmen?

11

Von APUE

Die reale Benutzer-ID und die reale Gruppen-ID eines Prozesses identifizieren, wer wir wirklich sind. Diese beiden Felder werden bei der Anmeldung aus unserem Eintrag in der Kennwortdatei übernommen. Normalerweise ändern sich diese Werte während einer Anmeldesitzung nicht, obwohl es für einen Superuser-Prozess Möglichkeiten gibt , sie zu ändern

Kann ein Superuser-Prozess die reale Benutzer-ID und die reale Gruppen-ID eines Prozesses ändern, sodass die Beziehung zwischen der realen Benutzer-ID und der realen Gruppen-ID nicht mit denen in der Kennwortdatei übereinstimmt? Zum Beispiel, wenn der Benutzer Timkein Mitglied der Gruppe ist oceanper der Passwort - Datei, kann den realen Benutzer - ID und die realen Gruppen - ID eines Prozesses ein Superuser - Prozess sein ändern Timund oceanjeweils?

Tim
quelle
5
Eine wichtige Klarstellung hier: Ein Prozess, der mit Superuser-Berechtigungen ausgeführt wird, kann seine eigene UID und GID ändern , nicht die eines anderen Prozesses.
Filbranden
Die Benutzerinfo-Datenbank ist ein reines Benutzerland. Der Kernel kümmert sich nur um UID und GID, nicht um die Benutzer- oder Gruppendatenbank.
22 薯条 德里克

Antworten:

15

Ja, ein Superuser-Prozess kann seine reale Benutzer-ID und die reale Gruppen-ID in einen beliebigen Wert ändern. Die Werte in /etc/passwdund /etc/shadowsind die Konfiguration für die Werte, die festgelegt werden sollen, jedoch keine Einschränkung möglicher Werte.

Bearbeiten Sie # 1

Dies bedeutet, dass Programme wie logindie Werte aus den Dateien lesen, sodass die Dateien Konfigurationsdateien oder Eingabedateien sind. Sie sind keine Einschränkungen für die Leistung eines Programms. Ein Superuser-Prozess kann einen beliebigen Wert an den Kernel übergeben, und der Kernel überprüft keine Dateien.

Ein Programm könnte aufrufen

setgid (54321);
setuid (12345);

und dies würde funktionieren, selbst wenn keine der IDs in einer Datei erwähnt wird.

RalfFriedl
quelle
9

Die Kennwortdatei und die Gruppendatei werden nicht gelesen, sondern nur vom Anmeldevorgang, um die tatsächliche Benutzer-ID und die tatsächliche Gruppen-ID festzulegen.

Es gibt nichts im Kernel, was diese Dateien erwähnt. Login muss die Dateien öffnen, verarbeiten und die beiden IDs festlegen. Es könnte anders geschrieben werden, um diese IDs von einem anderen Ort zu erhalten. ZB aus einer vernetzten Datenbank.

Jeder Prozess mit der Funktion CAP_SETUID kann diese IDs festlegen. Root verfügt über diese Funktion.

Das Sicherheitsmodell in Unix ist teilweise im Kernel implementiert und teilweise in Prozessen implementiert, die mit erhöhten Funktionen ausgeführt werden (z. B. als Root).


Beachten Sie, dass /etc/passwdund /etc/groupauch von und jedem anderen Programm gelesen werden ls, psdas Benutzer- / Gruppennamen in / von Benutzer- / Gruppen-IDs übersetzen muss. (Sie können dies über eine Bibliothek tun, als über alternative Methoden zum Speichern dieser Details Bescheid weiß.)

Strg-Alt-Delor
quelle
1
Sie ( /etc/passwd, /etc/groups) werden auch von Prozessen gelesen, die Benutzernamen anstelle der internen numerischen IDs anzeigen oder verarbeiten möchten, z . B. psund ls.
Jonas Schäfer
3

Der Zweck von /etc/passwdbesteht unter anderem darin, den Namen eines Benutzers in die UID eines Benutzers zu übersetzen . Wenn es Ihnen egal ist, wie die UID von Bob lautet, benötigen Sie diese Datei nicht. Wenn Sie nur zu einer beliebigen UID / GID wechseln möchten, verwenden Sie die entsprechenden Systemaufrufe:

int setuid(uid_t uid);
int setgid(gid_t gid);

Beachten Sie, dass ein privilegierter Prozess mit den FunktionenCAP_SETUID und (über die ein Root-Prozess im Allgemeinen verfügt) nur seine eigene UID und GID ändern kann, nicht die eines anderen laufenden Prozesses.CAP_SETGID

Wald
quelle