Symlink-Schwachstelle
# Symlink-Schwachstelle

Eine Symlink-Schwachstelle (aus engl. symlink bug; auch symlink vulnerability genannt, zu dt. Verwundbarkeit [durch] symbolische Verknüpfungen) ist eine Sicherheitslücke, die es einem Angreifer erlaubt, beliebige Dateien mit den Rechten des ausgeführten Programmes zu schreiben.

## Weitere Einzelheiten

Die oft symlink bug genannte Sicherheitslü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 an, die er mangels Berechtigungen normalerweise nicht schreiben kann. 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

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 ist 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 schreiben. In Wirklichkeit erstellt es dabei allerdings die Datei /root/.rhosts. Nachdem 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.

### Unzureichende Gegenmaßnahmen

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 Programm im Debugger ausführt oder das System anderweitig überlastet.

### Gegenmaßnahmen

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