Symlink-Schwachstelle

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Eine Symlink-Schwachstelle (auch symlink vulnerability) ist eine Sicherheitslücke, die es einem Angreifer erlaubt, beliebige Dateien mit den Rechten des ausgeführten Programmes zu schreiben.

Diese Lücke entsteht, wenn ein Programm mit erweiterten Rechten eine Datei in einem Verzeichnis, auf das der Angreifer Schreibzugriff hat, auf unsichere Art und Weise erstellt. Der Angreifer legt im Vorfeld einen Symlink mit dem gleichen Dateinamen auf eine Datei, die er mangels Berechtigungen normalerweise nicht schreiben kann an. Das anfällige Programm bemerkt den Symlink nicht und erstellt oder überschreibt die Zieldatei. Häufig hat der Angreifer eine Möglichkeit den Inhalt der Datei zu beeinflussen.

Beispiel[Bearbeiten]

Nehmen wir als Beispiel das fiktive Unix-Programm foo, das weiterführende Informationen über Benutzerkonten ermittelt und dazu setuid ist. Aus Performance-Gründen sortiert es zunächst die Benutzerliste in einer temporären Datei: /tmp/foo.

Das Verzeichnis /tmp is world-writable. Der Angreifer Alice erstellt dort vor Programmstart einen Symlink von /tmp/foo auf die Datei /root/.rhosts . Dann ruft er foo mit dem Parameter + + als Accountnamen auf. Das Programm foo versucht jetzt die Zeichenfolge + + in die temporäre Datei /tmp/foo zu zuschreiben. In Wirklichkeit erstellt es dabei allerdings die Datei /root/.rhosts. Nach dem es seine eigentliche Aufgabe erfüllt hat, löscht es den Symlink /tmp/foo, fasst aber /root/.rhosts nicht an.

Die Zeichenfolge + + wurde vom Angreifer in diesem Beispiel bewusst gewählt, weil dieser Eintrag in der Datei /root/.rhosts bedeutet, dass sich jeder mit Hilfe des Programmes rlogin als Root anmelden kann.

Wirkungslose Gegenmaßnahmen[Bearbeiten]

Es reicht nicht aus, vor der Erstellung der Datei zu prüfen, dass kein gleichnamiger Symlink existiert, weil zwischen der Prüfung und der Erstellung ein kleines Zeitfenster liegt (Race Condition). Der Angreifer kann dieses Zeitfenster vergrößern, indem er das anfällige Programme in Debugger ausführt oder das System anderweitig überlastet.

Gegenmaßnahmen[Bearbeiten]

Zum Erstellen von temporären Dateien sollte die stdlib-Funktion mkstemp(3) verwendet werden. Für Shell-Skripte gibt es das Programm mktemp. Wenn der Dateiname vom Programm vorgegeben werden soll, müssen beim Aufruf der stdlib-Funktion open die Flags O_CREAT|O_EXCL mitgegeben werden. Seit Linux 3.11 steht zusätzlich das Flag O_TMPFILE zur Verfügung.