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.