
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
|