Unter welchen Umständen möchte ich ein SUID-Bit setzen?

Unter welchen Umständen möchte ich ein SUID-Bit setzen?

Ich habe Schwierigkeiten, das Konzept der SUID-Bits und ihre Nützlichkeit zu verstehen.

Nehmen wir zum Beispiel an, ich habe ein Programm:

-rwsr-xr-x 1 root root 12364 Jan 12 2013 /usr/bin/foo

Nach meinem Verständnis sbedeutet das Execut-Bit für den Benutzereigentümer im Wesentlichen, dass die Datei von anderen Benutzern mit der Berechtigung des Dateieigentümers ausgeführt werden kann.

Warum sollte ich so etwas wollen? Warum ändere ich nicht einfach die Gruppe für die Datei, sodass sie für eine Gruppe funktioniert, zu der alle Benutzer gehören?

Antwort1

Setuid und Setgid (und Setcap, sofern vorhanden) sind die einzigen Möglichkeiten, Privilegien zu erhöhen. Außer über diesen Mechanismus kann ein Prozess Privilegien abgeben, aber nie erlangen. Daher könnten Sie nichts tun, was zusätzliche Privilegien erfordert.

Beispielsweise müssen die Programme suund Befehle als beliebiger Benutzer ausführen können. Daher müssen sie als Root ausgeführt werden, unabhängig davon, welcher Benutzer sie aufgerufen hat.sudo

Ein weiteres Beispiel ist ping. TCP- und UDP-Sockets sind für jeden Benutzer zugänglich, da diese Protokolle ein Konzept von Ports haben und ein Prozess die Kontrolle über einen Port übernehmen kann (was als Bindung bezeichnet wird), sodass der Kernel weiß, wohin die Pakete gesendet werden sollen. ICMP hat kein solches Konzept, daher dürfen nur Programme, die als Root (oder mit der entsprechenden Berechtigung) ausgeführt werden, anfordern, dass ICMP-Pakete an sie gesendet werden. Damit ein Benutzer ausführen kann ping, muss das pingProgramm über ein zusätzliches Privileg verfügen, also Setuid Root (oder Setcap).

Als Beispiel für Gruppenberechtigungen betrachten wir ein Spiel, das lokale Highscores in einer Datei speichert. Da in der Score-Datei nur die von Benutzern tatsächlich erreichten Highscores gespeichert werden sollen, darf die Score-Datei nicht von Spielern beschreibbar sein. Nur das Spielprogramm muss in die Score-Datei schreiben dürfen. Daher wird das Spielprogramm auf setgid gesetzt gamesund die Score-Datei ist von der Gruppe beschreibbar, gamesnicht jedoch von Spielern.

Es gibt einen alternativen Ansatz zur Erhöhung von Berechtigungen, der darin besteht, Programme, die zusätzliche Berechtigungen erfordern, von einem privilegierten Startprogramm aus zu starten. Wenn ein Benutzer eine Aufgabe ausführen möchte, die zusätzliche Berechtigungen erfordert, führt er ein Front-End-Programm aus, das eine Art Interprozesskommunikation verwendet, um die privilegierte Aktion auszuführen. Dies funktioniert gut für einige Anwendungsfälle, wie z. B. ping(ein pingProgramm zum Analysieren von Optionen und Melden des Fortschritts und ein ping-backendDienst, der Pakete sendet und empfängt), aber nicht für andere Anwendungsfälle wie die Highscore-Datei eines Spiels.

Antwort2

Der häufigste Grund ist, dass eine ausführbare Datei als Root ausgeführt werden soll. Beispiel:

find /bin/ -type f \( -perm -4000 -o -perm -2000 \) -ls  | awk '{print $3,$NF}'
-rwsr-xr-x /bin/su
-rwsr-xr-x /bin/mount
-rwsr-xr-- /bin/fusermount
-rwsr-xr-x /bin/ping6
-rwsr-xr-x /bin/ping
-rwsr-xr-x /bin/umount

Dies sind alles Befehle, die von normalen Benutzern ausgeführt werden können, aber erhöhte Berechtigungen erfordern. mountist ein perfektes Beispiel: Sie können jede Festplatte mounten, bei der die useroder eine ähnliche Option gesetzt ist, /etc/fstababer zum Mounten sind rootBerechtigungen erforderlich, sodass das SUID-Bit gesetzt ist.

Antwort3

Das Suid- (oder SGID-)Bit bewirkt, dass eine ausführbare Datei als ein anderer Benutzer/eine andere Gruppe ausgeführt wird als der Benutzer, der sie aufruft.

Wenn der einzige Grund dafür der Zugriff auf eine bestimmte Datei ist, können Sie andere Mechanismen verwenden, um diese Datei beschreibbar zu machen. Der Benutzer könnte dann jedochirgendetwaszur Datei – und nicht nur zu den Dingen, die Ihr Programm zulässt.

Sie könnten Ihr Programm beispielsweise so einstellen, dass nur das Anhängen einer Zeile an eine Datei und nur in einem bestimmten Format erlaubt ist. Wenn Sie jedoch nur Dateisystemberechtigungen verwenden, könnte der Benutzer auch Zeilen aus der Datei löschen. Oder schlecht formatierte Zeilen einfügen.

Grundsätzlich kann ein Suid-Programm beliebige Richtlinien durchsetzen. Dateisystemberechtigungen können das nicht. Nehmen wir beispielsweise an, Ihr System verfügt über ein Suid-Programm /bin/su. Es gibt Ihnen eine Root-Shell (zum Beispiel), aber nur, wenn Sie zuerst eine Richtlinie erfüllen – normalerweise müssen Sie das Root-Passwort eingeben. Mit Berechtigungen allein ist das nicht möglich.

Antwort4

Das für mich einfachste Beispiel ist der passwd-Befehl. Dieser ermöglicht es jedem Benutzer, sein eigenes Passwort zu ändern, ohne dass er dafür Root-Rechte benötigt. Die Datei, in der alle Passwörter gespeichert sind, ist allerdings nur für Root beschreibbar.

passwd & shadow

Wir könnten die Rechte für Shadow einfach auf 666 setzen, sodass jeder den Inhalt ändern kann, aber das wäre eine schreckliche Sicherheitslücke. Daher ist SUID erforderlich. Dadurch ist es möglich, jedem Benutzer auf kontrollierte Weise erhöhte Rechte zu erteilen, da er die Shadow-Datei nur über das Passwd-Skript ändern kann. Das Skript selbst stellt sicher, dass der Benutzer das Passwort einer anderen Person nicht ändern kann.

Natürlich muss passwd schreibgeschützt sein. Andernfalls könnte der Benutzer diese Datei ändern und sie verwenden, um Skripte mit Root-Rechten auszuführen.

verwandte Informationen