Login
Newsletter
Werbung

So, 19. Juli 2009, 19:14

Software::Security

Sicherheitslücke im tun-Modul von Linux

Eine Sicherheitslücke im tun-Modul von Linux 2.6.30 wurde ungewöhnlich intensiv diskutiert, da ihre Umstände außergewöhnlich sind.

Brad Spengler, der Autor von grsecurity, veröffentlichte einen Exploit, ein kurzes C-Programm mit Quellcode, mit dem ein Angreifer auf dem lokalen Rechner Root-Rechte erhalten kann. Das Programm nutzt einen ungewöhnlichen Fehler im tun-Modul des Kernels in Kombination mit einem Fehler in SELinux. Ohne SELinux funktioniert es jedoch ebenfalls, indem es einen mutmaßlichen Fehler in einer kaum bekannten Option, der »SVR4-Personality«, nutzt.

Die überhebliche und großsprecherische Art, in der Spengler zuerst Videos und später den Code veröffentlichte, dürfte kaum geeignet sein, ihm Sympathien einzubringen. Der Fehler im tun-Modul betrifft überwiegend Anwender, die virtuelle Maschinen als Server betreiben, da dies die hauptsächliche Verwendung des Moduls darstellt. Inwieweit die einzelnen Distributionen betroffen sind, ist noch nicht bekannt, Updates der betroffenen Distributionen dürften jedoch rasch erscheinen.

Das Problem wird durch fragwürdigen Code im tun-Modul verursacht. Es findet ein Zugriff über einen Zeiger statt, der erst später auf NULL geprüft wird. Was wie ein Anfängerfehler aussieht, ist aber tatsächlich nicht so einfach. Denn der Wert NULL (0) für den Zeiger ist an dieser Stelle erlaubt. Die Implementierung sorgt jedoch dafür, dass der C-Compiler GCC den späteren Test auf NULL als unnötig ansieht und wegfallen lässt. Es herrscht noch keine Einigkeit darüber, ob dieses Verhalten ein Fehler in GCC ist. Aufgrund dieses Verhaltens reklamiert Spengler für sich, eine Sicherheitslücke gefunden zu haben, die durch eine Analyse des Quellcodes nicht zu finden sei. Im Quellcode sehe es wie ein einfacher Fehler aus, der im Fall, dass der Zeiger NULL ist, zu einem »Segmentation Fault« führt. Aus diesem Grund optimiert GCC die spätere Abfrage auch weg: Es nimmt an, dass diese Stelle im Code nicht erreicht werden kann, falls ein NULL-Zeiger vorliegt.

Die Korrektur, die in Linux 2.6.30.2 verfügbar sein wird, besteht einfach darin, den Zeiger vor dem ersten Zugriff zu prüfen. Unabhängig davon, ob GCC einen Fehler hat, soll künftig auch die Option -fnodelete-null-pointer-checks für den Kernel verwendet werden, die solche Optimierungen verhindert.

Warum es mit SELinux einfacher ist, die Sicherheitslücke auszunutzen, ist durch einen Fehler in den Regeln von SELinux zu erklären. Eigentlich soll das Sicherheitssystem verhindern, dass NULL-Zeiger dereferenziert werden können, denn die Variable mmap_min_addr legt die kleinste gültige Adresse fest. SELinux erlaubt jedoch PulseAudio (das zudem setuid root läuft) und anderen Programmen, die Adresse 0 zu verwenden, und schwächt damit die Sicherheit des Systems.

Werbung
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung