Open Source im professionellen Einsatz
Linux-Magazin 05/2016

Ausgenutzt: Double-Free-Fehler im Kernel

Doppelfehler

Eine Schwachstelle im Linux-Kernel führt dazu, dass ein lokaler Angreifer unter Umständen Befehle mit Kernelrechten ausführen kann.

472

Die Sicherheitslücke lässt sich nur ausnutzen, wenn der USB-MIDI-Treiber des Kernels geladen ist. Zusätzlich braucht der Angreifer einen lokalen Account und physischen Zugriff auf den Rechner. Konkret: Er muss in der Lage sein, einen speziell präparierten USB-Stick einzustecken. Anfällig für diese Attacke sind offenbar alle aktuellen Kernelversionen. Ursache ist ein Programmierfehler in dem Code des Midiman-USB-Geräts. Hier kommt es zu einem Double-Free-Fehler beim Verarbeiten eines »snd_usb_midi« -Objekts.

Der Fehler [1] kommt dann zum Tragen, wenn der Stick als das vorgebliche Midiman-USB-Gerät mit einer falschen Anzahl von USB-Endpoints initialisiert wird. Ausgelöst wird er durch das Einstecken des USB-Sticks. Danach führt der Kernel einige Standardroutinen aus.

Zunächst ruft er die »probe()« -Funktion auf, um herauszufinden, welcher Treiber für den Stick verantwortlich ist. Innerhalb des »probe()« -Vorgangs wiederum laufen verschiedene Initialisierungen ab, die problemlos funktionieren – bis zu dem Aufruf der »snd_usbmidi_create()« -Funktion (Listing 1).

Listing 1

snd_usbmidi_create()

01 if (quirk && quirk->type == QUIRK_MIDI_MIDIMAN)
02         err = snd_usbmidi_create_endpoints_midiman(umidi, &endpoints[0]);
03 else
04         err = snd_usbmidi_create_endpoints (umidi, endpoints);
05 if (err < 0) {
06         snd_usbmidi_free(umidi);
07         return err;
08 }

Da sich der Stick als Midiman-Gerät ausgibt, wird hier der erste If-Zweig ausgeführt. Der ruft die Funktion »snd_usbmidi_create_endpoints_midiman()« auf, die die USB-Endpoints für diesen Gerätetyp einrichtet. Für die Attacke wird nun aber eine inkorrekte Anzahl von Endpoints spezifiziert (etwa null).

Das Problem besteht darin, dass das Fehlschlagen des Probe-Prozesses in der Folge weitere Aufräumfunktionen anstößt, die unter anderem abermals die »snd_usbmidi_free()« -Funktion für das »snd_usb_midi« -Objekt bemühen. Darin liegt ein ziemlich typischer Double-Free-Fehler, der dem Angreifer in die Hand spielt. Allgemein treten Double-Free-Fehler immer dann auf, wenn das Programm allozierte Objekte des Speichers doppelt freigibt. Die interne Speicherverwaltung kommt dann durcheinander, sodass ein Angreifer Zugriff auch auf andere allozierte Objekte im Speicher erlangt.

Diesen Effekt ausnutzend haben die Angreifer einen Exploit-USB-Stick mit Hilfe der Facedancer21-Hardware [2] erzeugt. Der Exploit nutzt die Double-Free-Schwachstelle, um Teile des Kernelspeichers zu überschreiben. Konkret überschreibt der Exploit nach einigen Schritten einen Funktionszeiger in der »ubuf_info« -Struktur und lenkt diesen Zeiger auf eine von ihm bereitgestellte Funktion um, die dann den Schadcode des Angreifers enthält.

Das Patch für diese recht kritische Sicherheitslücke ist sehr einfach: In der »snd_usbmidi_create()« -Funktion muss lediglich der »snd_usbmidi_free()« -Aufruf entfernt werden. Dann kehrt die »snd_usbmidi_create()« -Funktion mit einem Fehlercode zurück, gibt aber nicht zusätzlich das Objekt frei.(jcb)

Für Kommentare

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 1 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

comments powered by Disqus

Ausgabe 11/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.