Menü

Root-Exploit für Linux-Kernel veröffentlicht

Lesezeit: 1 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 629 Beiträge
Von

Der Entwickler des Grsecurity-Projekts, Brad Spengler, hat einen Exploit für eine Lücke im Tun-Interface des Linux-Kernel 2.6.30 und des in der Beta-Version von RHEL5.4 verwendeten Kernels 2.6.18 (mit Backports) veröffentlicht, über die Angreifer an Root-Rechte gelangen können. Das besondere daran ist, dass der Exploit offenbar sogar Sicherheitserweiterungen wie SELinux aushebeln kann. Die Lücke ist dem Bericht von Spengler zufolge nur in diesen Kernel-Versionen zu finden. Kern des Problems ist offenbar eine normalerweise nicht ausnutzbare Null-Pointer-Dereference, die im Zusammenspiel mit den Optimierfunktionen des GCC doch ausnutzbar wird.

Das Zusammenspiel der Lücke und der Tricks, um SELinux zu umgehen, ist relativ knifflig. Das Internet Storm Center hat einen ersten Blick auf die Schwachstelle geworfen. So ist folgender Codeschnipsel für das Problem verantwortlich:

static unsigned int tun_chr_poll(struct file *file, poll_table * wait)

struct sock *sk = tun->sk;

if (!tun)
return POLLERR;

Demnach soll zwar if (!tun) bei 0 (NULL) einen Fehler zurückliefern, jedoch optimiert der Compiler den if-Block einfach weg, da die Variable ja bereits zugewiesen respektive dereferenziert wurde. In der Folge kann der Kernel unter Umständen doch auf die Adresse x00000000 zugreifen, was ein Angreifer auf eigenen Code umbiegen kann. Marcus Meissner von Suse bestätigte gegenüber heise Security das prinzipielle Problem.

Damit der Exploit funktioniere, seien aber zwei weitere Bedingungen nötig, erklärt Meissner. Der Code müsse des Device /dev/net/tun öffnen können, wozu der Exploit ladbare Module von pulseaudio benutze, die in einigen Distributionen SUID gesetzt sind. Zudem müsse der Code die Exploit-Schutzfunktionen "mmap_min_addr" ausschalten können, was Spengler offenbar über einen Fehler in der Implementierung von sogenannten Personalities erreiche.

Die Lösung des Problem ist nach einhelliger Meinung sehr einfach: Man muss im betroffenen Code die Prüfung vor die Zuweisung setzen, um die Wegoptimierung zu verhindern. Im Kernel 2.6.30.2 soll der Fehler behoben sein.

Künftige Kernelversionen sollen zudem mit der Option "fno-delete-null-pointer-checks" übersetzt werden, womit der Compiler keine Prüfungen für Null-Pointer-Prüfungen mehr eliminiert. Auf lwn.net gehen derweil die Meinungen auseinander, ob es sich um eine Kaputtoptimierung des GCC oder einen Programmierfehler handelt.

Siehe dazu auch:

(Daniel Bachfeld) / (dab)