A.10 chroot
Mit der Funktion chroot() können Sie das Wurzelverzeichnis (/) für ein Programm verändern. Das bedeutet aber auch, dass nach der Veränderung nicht mehr ohne Weiteres außerhalb des Baumes zugegriffen werden kann. Dieser Vorgang wird als chroot jail bezeichnet. Bspw. können Sie damit einen Befehl mit einem neuen Wurzelverzeichnis starten, wie dies etwa bei einer Rettungsdiskette gemacht werden kann, die mit einem gemounteten System arbeiten soll. Natürlich bleibt ein solcher Aufruf nur dem Benutzer root überlassen.
Mit chroot() können Sie praktisch ein kritisches Programm bei der Ausführung vom übrigen Filesystem isolieren (was übrigens auch gerne mit Dämonprozessen gemacht wird). Damit ließe sich praktisch ein Einbrecher ins System in einem Verzeichnis dingfest machen – wichtig dabei ist, dass sich in diesem Verzeichnis nur Programme befinden, die man benötigt.
Der Vorteil dieser chroot jail-Umgebung ist, dass im Falle eines Fehlers Ihrer Anwendung nur Schaden im chroot jail angerichtet werden kann und somit dem Angreifer alles andere außerhalb dieser Verzeichnisstruktur verwehrt bleibt.
Allerdings benötigen viele (Dämon-)Prozesse Konfigurationsdateien. Und da diesen ja bspw. das Verzeichnis /etc oder ähnliche Verzeichnisse nicht mehr zur Verfügung stehen, müssen diese Dateien ins chroot-Verzeichnis eingefügt werden. Hierbei gilt es darauf zu achten, keine Fehler zu machen. Hier einige der vielen möglichen Fehler mit chroot, die gerne gemacht werden:
|
Vermeiden Sie, sofern es möglich ist, Dateien in der chroot-Umgebung wie Passwortdateien oder ähnliche. Sie sollten nicht einfach die Datei /etc/passwd ins chroot-Verzeichnis kopieren, wenn Sie noch andere Möglichkeiten haben. |
|
Verwenden Sie nicht die Standardrechte einer Anwendung. Würden Sie bspw. den Apache-Webserver in einer chroot-Umgebung mit den ursprünglichen Rechten laufen lassen, würde das Programm mit vollen root-Rechten laufen. Somit steht dem Ausbruch aus der chroot-Umgebung nichts mehr im Wege. Passen Sie sinnvollerweise die Privilegien an. Es genügt nicht, im Falle eines Servers der UID und der GID das nobody zuzuweisen. Wenn andere Anwendungen diese IDs ebenso verwenden, kann der Angreifer andere Programme mit den Signalen steuern oder die Systemaufrufe mit ptrace mitprotokolieren, was auch das Mitlesen von Passwörtern beinhalten könnte. Details zum Chroot Jail: Man kann nur entkommen, wenn das aktuelle Arbeitsverzeichnis (welches durch chroot() selbst nicht geändert wird) höher liegt als das chroot-Verzeichnis. |
Neben diesen Löchern, die Sie mit chroot() aufmachen, gibt es noch eine Menge mehr zu beachten. Wenn Sie eine Anwendung erstellen, die eine eigene chroot()-Umgebung erstellt, müssen Sie eine Festung wie Fort Knox bauen und sich unbedingt intensiver mit diesem Thema befassen. Gerade in Zeiten, wo so genannte virtuelle Server (kurz VServer) Hochkonjunktur haben, sollten Sie diesbezüglich recht schnell fündig werden.
|