suid bit



Zur Wiederholung: jede Datei und jedes Verzeichnis gehören immer einem User und einer Gruppe.
Wer einer Gruppe angehört wird in der Datei /etc/group festgelegt.

Welche Berechtigungen der user und was Gruppe hat wird mit "permission bits" festgelegt die man mit dem Befehl chmod ändern kann. Zusätzlich kann man festlegen was ein alle anderen dürfen die nicht der user sind oder der Gruppe angehören. (Schreib-, Lese und Ausführungsrechte).

Ein user ist in so einer Art Käfig eingesperrt. Er kann nur auf Dateien zugreifen für die er (oder eine Gruppe der er angehört) Rechte hat. Auch wenn er Programme ausführt, dann haben die Programme genau die selben Rechte wie er.

Manchmal muss ein user allerdings Tätigkeiten erledigen die er eigentlich nicht darf. z.b: um mit dem passwd Befehl sein Passwort ändern zu können muss man Schreib- und Leserechte auf die files/etc/passwd bzw. /etc/shadow haben. Jeder user soll normalerweise sein Passwort ändern können, soll aber nicht generelle Schreib- und Leserechte auf diesen sensiblen Dateien haben.

Man braucht also einen Mechanismus wie ein user (bzw die Programme die ein user startet) eingeschränkt höhere Rechte bekommt. Dazu wären verschiedene Mechanismen denkbar. Der in Unix hautpsächlich verwendete ist das "set user id" bit, auch kurz suid bit (manchmal auch "sticky" bit) genannt. Ist dies bei einem ausführbaren Programm gesetzt so wird im Gegensatz zur normalen Ausführung das Programm nicht mit den selben Berechtigungen des users ausgeführt der das Programm ausgeführt sondern mit den Berechtigungen des Eigentümers der Datei (der der als "user" für die datei eingetragen ist.. -> siehe ls -l ). z.b:

ls -l /usr/bin/passwd

zeigt uns:

  -rwsr-xr-x    1 root     root        25692 Mar  8  2004   /usr/bin/passwd
     ^
     |
     \\_______ s .. das setuid bit.



das s an der Stelle an der normalerweise das x.. (für eXecutable - ausführbares Programm) stehen würde ist das suid bit. Es besagt in obigem Falle dass Jeder der das passwd Programm aufruft (und aufrufen dürfen es in obigem falle alle user auf diesem system) es mit den Berechtigungen des "root" users geschieht. Das Programm, wenn es also einmal läuft, hat "root" permissions und darf alles tun was auch root tun dürfte.

Dadurch erlangen diese Programme haben eine "hohe Verantwortung". Sie müssen so geschrieben sein dass sie nur die Funktionen ausführen für die sie gedacht sind und nicht für etwas anderes missbraucht werden dürfen. Im obigen Fall ist das passwd Programm so geschrieben dass es abprüft wer das Programm wirklich aufgerufen hat und jedem user ausser root nur das ändern des eigenen Passwortes erlaubt.

Analog funktioniert das mit dem "set groupid" bit. Ein Programm das dies gesetzt hat wird mit den Gruppenberechtigungen der Gruppe ausgeführt der es gehört und nicht mit den Berechtigungen der Gruppe der der Aufrufer angehört. z.B. das Programm wall:

ls -l /usr/bin/wall

(das wall Programm schreibt eine Nachricht auf die Konsolen aller eingeloggten Personen)

die permissions sind:

  
  -rwxr-sr-x    1 root     tty          9276 Mar  8  2004    /usr/bin/wall
        ^
        | 
        \__ s .. set groupid.


Das Programm darf wiederum von allen ausgeführt werden wird aber, sobald es gestartet wurde mit den Berechtigungen der Gruppe "tty" ausgeführt.

Dieser Gruppe gehören üblicherweise die /dev/pty* Geräte an. Mitglieder dieser Gruppe dürfen also von allen Terminals lesen und schreiben. Das Programm wall kann jetzt natürlich so programmiert sein dass es zusätzliche Einschränkungen hat, die festlegen wer wall benutzen darf und was er damit tun kann. Dennoch bleibt die Fähigkeit auf alle Terminals eine Meldung zu schreiben erhalten.

WICHTIG: Man sollte also niemals ein +s bit setzen ohne genau zu wissen was man tut. Nur ein Programm dass auch mit eingebauten Schierheiten geschrieben ist, sollte ein suid bit gesetzt haben. Das weiss normalerweise nur (hoffentlich) der Programmierer.

chmod u+s /usr/bin/irgendeinprogramm

würde das +s bit setzen. (wie gesagt: DO NOT TRY THIS AT HOME).

chmod u-s /usr/bin/irgendeinprogramm

würde das s bit wieder entfernen.

mit

find /usr -perm +6000 -type f

kann man. z.B. alle Programme auflisten die entweder das suid oder das set_grupeid gesetzt haben. (genaueres dazu ist in der man page oder dem info file zu finden)

EXERCISES:

* suche mit find Dateien die ein suid oder "set groupid" bit haben. Sieh Dir mit ls -l an wem die Dateien gehören. Überleg Dir warum die Dateien das s bit gesetzt haben.


REFERENCES:

man chmod

man find

info find