Network Manager in Fedora und Red Hat Enterprise Linux: Lokaler Root-Angriff möglich
Gnomes Network Manager erleichtert Linux-Anwendern, eine Vielzahl von Netzwerkverbindungen zu verwalten. Die Software unterstützt unter anderem Ethernet, Wifi, 3G und Bluetooth. Im März wurde ein harmloser Programmierfehler im Plugin "ifcfg-rh" entdeckt, der sich aber vor Kurzem durch Updates in Fedora und Red Hat Enterprise Linux (RHEL) zu einer ernsten Sicherheitslücke ausgewachsen hat, die es einem lokalen Angreifer erlaubt, Befehle mit Root-Rechten auszuführen.
Die Konfiguration des Network Managers (NM) kann sowohl systemweit als auch benutzerspezifisch erfolgen. Die Systemkonfiguration steht in "/etc/NetworkManager/nm-system-settings.conf" (NM 0.7 und 0.8.0) oder "/etc/NetworkManager/NetworkManager.conf" (NM 0.8.1 und neuer). In dieser Konfigurationsdatei ist im Abschnitt "[main]" festgelegt, welche Plugins geladen werden sollen:
[main] plugins=ifupdown,keyfile
Das hier aufgelistete "keyfile" ist das allgemeinste Plugin, das alle Verbindungstypen unterstützt und dazu dient, eine globale Konfiguration für alle Benutzer bereitzustellen. Dieses Plugin schreibt die Konfiguration einzelner globaler Verbindungen in Dateien im Verzeichnis "/etc/NetworkManager/system-connections/". Für die einzelnen Verbindungen finden sich hier INI-Dateien, die folgenden Aufbau haben:
[connection] id=Auto eth0 uuid=27afa607-ee36-43f0-b8c3-9d245cdc4bb3 type=802-3-ethernet autoconnect=true timestamp=0 [ipv4] method=auto [802-3-ethernet] mac-address=0:23:5a:47:1f:71
Fedora und Red Hat Enterprise Linux (RHEL) stellen noch ein zusätzliches Plugin namens "ifcfg-rh" bereit. Dieses erlaubt es dem Network Manager die Standard-Netzwerkkonfigurationsdateien "/etc/sysconfig/network-scripts/ifcfg-*" zu lesen und zu schreiben.
Neben diesen globalen Systemeinstellungen kann jeder Benutzer auch seine eigene Konfiguration mit NM aufsetzen. Diese individuellen Benutzereinstellungen werden über den Dienst D-Bus per "org.freedesktop.NetworkManagerUserSettings" gesetzt und systemabhängig gespeichert. Kommt beispielsweise das Gnome-Applet "nm-applet" für NM zum Einsatz, so landen die Einstellungen im GConf-Speicher, wo man sie beispielsweise mit "gconf-editor" unter "system/networking/connections" findet. Im Gegensatz zu den Systemeinstellungen sind die so abgelegten Daten nur für den jeweiligen Benutzer sichtbar.
Ein Update von Fedora 14 auf Version 15 brachte eine NM-Änderung mit sich, die es nun auch nicht privilegierten Benutzer erlaubt, via "ifcfg-rh" persönliche und globale Systemverbindungen zu speichern. Dies macht aus einem weitgehend unbeachteten, im März diesen Jahres entdeckten Programmierfehler in diesem Plugin ein Sicherheitsproblem, das ein lokaler Angreifer ausnutzen kann, um Root-Befehle auszuführen. Dieser Programmierfehler besteht darin, dass das "ifcfg-rh" Plugin beim Schreiben des Verbindungsnamens die Zeichenkette nicht ordentlich auf Sonderzeichen prüft. Während die meisten dieser Sonderzeichen korrekt gefiltert werden, hat sich beim Behandeln von Newline-Zeichen ein Fehler engeschlichen.
Die Dateien unter "/etc/sysconfig/network-scripts/ifcfg-*" haben im Allgemeinen das folgende Format:
DEVICE=eth0 ONBOOT=yes BOOTPROTO=DHCP
Dabei spezifiziert "ONBOOT", ob das Gerät beim Booten aktiviert werden soll, und "BOOTPROTO=DHCP" zeigt in diesem Beispiel an, dass eth0 per DHCP initialisiert wird. Es gibt noch einige weitere mögliche Einträge wie beispielsweise die Option "USERCTL", die entweder auf "yes" oder "no" gesetzt werden kann. Sie regelt, ob ein Nicht-Root-Anwender das Gerät kontrollieren darf ("yes") oder nicht ("no"). Typischerweise fügt NM noch einige weitere Einträge hinzu, zum Beispiel:
NAME=my_network UUID=a69d030d-46ce-4eb2-af79-f18eb13478db LAST_CONNECT=1315589539
"NAME" ist hierbei der Verbindungsname und nicht zu verwechseln mit dem in "DEVICE" abgelegten Namen des physikalischen Gerätes. Geräte, die nicht über NM verwaltet werden sollen, müssen den Eintrag "NM_CONTROLLED=no" in ihrer "ifcfg"-Datei enthalten. Das fehlerhafte Verarbeiten von Newline-Zeichen in Verbindungsnamen hat nun zur Folge, dass ein Angreifer unberechtigt weitere Zeilen in die "ifcfg"-Datei einfügen kann, indem er nach dem Verbindungsnamen ein Newline-Zeichen schreibt. Der darauffolgende String wird dann als neue Zeile und damit als neuer Eintrag in der Datei abgelegt. Genauso lassen sich auch Shell-Befehle einschleusen. Ursprünglich wurde dieses Problem als nicht kritisch angesehen, da ein Schreiben in die "ifcfg"-Dateien Root-Rechte benötigte. Dies änderte sich jedoch in der Fedora-Version 15, womit ein lokaler Angreifer dies für eine Root-Attacke ausnutzen kann. Hierzu muss er lediglich eine neue Verbindung mit der NM-GUI anlegen, wobei er für den Namen einen String folgender Bauart verwendet:
my_network[CTRL+SHIFT+U, A]USERCTL=true[CTRL+SHIFT+U, A]touch /I_AM_ROOT
In der GUI müssen die Newline-Zeichen mit Unicode eingegeben werden, was durch die Tasten [CTRL+SHIFT+U, A] geschieht. Der Eintrag "USERCTL=true" wird daraufhin in der "ifcfg"-Datei nach dem "NAME"-Eintrag hinzugefügt, wodurch der Angreifer als Nicht-Root-Anwender das Gerät kontrollieren darf. Der letzte Teil des Namens ist ein "touch"-Befehl, der im Wurzelverzeichnis eine Datei namens "I_AM_ROOT" anlegt. Nachdem dieses Gerät mit der NM-GUI eingerichtet ist, reicht das Kommando
usernetctl my_network up
um den "touch"-Befehl mit Root-Rechten auszuführen. Natürlich kann der Angreifer hier beliebige Befehle einsetzen.
Das Patch für diese Sicherheitslücke besteht darin, Newline-Zeichen korrekt zu filtern. Der für das Problem verantwortliche Programmierfehler befindet sich in der Datei "plugins/ifcfg-rh/shvar.c". Dort ist die Funktion "svEscape()" dafür zuständig, Strings zu verarbeiten, wobei das Patch nur einige wenige Code-Änderungen umfasst:
static const char escapees[] = "\"'\\$~`"; /* must be escaped */
static const char spaces[] = " \t|&;()<>"; /* only require "" */
+static const char newlines[] = "\n\r"; /* only require "" */
char *
svEscape(const char *s) {
...
- int i, j, mangle = 0, space = 0;
+ int i, j, mangle = 0, space = 0, newline = 0;
...
for (i = 0; i < slen; i++) {
if (strchr(escapees, s[i])) mangle++;
if (strchr(spaces, s[i])) space++;
+ if (strchr(newlines, s[i])) newline++;
}
- if (!mangle && !space) return strdup(s);
+ if (!mangle && !space && !newline) return strdup(s);
- newlen = slen + mangle + 3; /* 3 is extra ""\0 */
+ newlen = slen + mangle - newline + 3; /* 3 is extra ""\0 */
...
j = 0;
new[j++] = '"';
for (i = 0; i < slen; i++) {
+ if (strchr(newlines, s[i]))
+ continue;
...
}
new[j++] = '"';
- g_assert(j == slen + mangle + 2); /* j is the index of the '\0' */
+ g_assert(j == slen + mangle - newline + 2); /* j is the index of the '\0' */
return new;
}
Die mit + markierten Zeilen fügt das Patch hinzu, die mit - markierten Zeilen entfernt es. Wie schon in der dritten Zeile zu sehen ist, wurde in der Escape-Funktion "svEscape()" einfach "newlines[]" als zusätzliches herauszufilterndes Zeichen hinzugefügt, womit die Attacke nicht mehr möglich ist.
Betroffen sind die Fedora-Versionen 15 und neuer sowie RHEL in Version 6. RHEL ist allerdings nur dann angreifbar, falls das PolicyKit so konfiguriert ist, dass es lokalen Anwendern erlaubt, neue Netzwerkverbindungen anzulegen.
Unicode-Eingabe
Unicode wird ständig um weitere Zeichen erweitert. Die aktuelle Version 6 wurde im Oktober 2010 verabschiedet. Die Eingabe von Unicode-Zeichen unter Linux ist einfach durch die Tastenkombination [CTRL+SHIFT+U, HEXCODE] möglich. Der Hexcode "A" etwa steht für "linefeed" und wurde für obigen Exploit ausgenutzt. Genauso lassen sich aber auch beliebige andere Unicode-Zeichen über ihren hexadezimalen Code eingeben. Eine Liste aller aktuell verfügbaren Unicode-Zeichen und deren Hexcodes findetsich auf der Seite des Unicode Consortium.
Alle Rezensionen aus dem Linux-Magazin
- Buecher/07 Bücher über 3-D-Programmierung sowie die Sprache Dart
- Buecher/06 Bücher über Map-Reduce und über die Sprache Erlang
- Buecher/05 Bücher über Scala und über Suchmaschinen-Optimierung
- Buecher/04 Bücher über Metasploit sowie über Erlang/OTP
- Buecher/03 Bücher über die LPI-Level-2-Zertifizierung
- Buecher/02 Bücher über Node.js und über nebenläufige Programmierung
- Buecher/01 Bücher über Linux-HA sowie über PHP-Webprogrammierung
- Buecher/12 Bücher über HTML-5-Apps sowie Computer Vision mit Python
- Buecher/11 Bücher über Statistik sowie über C++-Metaprogrammierung
- Buecher/10 Bücher zu PHP-Webbots sowie zur Emacs-Programmierung
Insecurity Bulletin
Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...


