
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 s
bedeutet 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 su
und 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 ping
Programm ü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 games
und die Score-Datei ist von der Gruppe beschreibbar, games
nicht 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 ping
Programm zum Analysieren von Optionen und Melden des Fortschritts und ein ping-backend
Dienst, 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. mount
ist ein perfektes Beispiel: Sie können jede Festplatte mounten, bei der die user
oder eine ähnliche Option gesetzt ist, /etc/fstab
aber zum Mounten sind root
Berechtigungen 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.
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.