Sudo: Programmlogik fehlerhaft

Eine Sicherheitslücke im Tool Sudo hat zur Folge, dass ein lokaler Angreifer Befehle mit höheren Berechtigungen ausführen kann (CVE-2014-0106).

Die meisten Systeme haben die Option “env_reset” für Sudo gesetzt. Dies bedeutet, dass Sudo eine neue minimale Umgebung
bereitstellt. Diese besitzt nur einen sehr kleinen Satz von Umgebungsvariablen: TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME, SUDO_COMMAND, SUDO_USER, SUDO_UID und SUDO_GID. Zusätzlich erbt die Umgebung noch Variablen des aktuellen Prozesses geerbt, falls die “env_check”- und “env_keep”-Optionen erlauben. In diesem Setup dienen die “env_check”- und “env_keep”-Einträge als Whitelist für Umgebungsvariablen.

Anders stellt sich die Situation dar, falls “env_reset” nicht gesetzt ist. In diesem Fall werden die Einträge für “env_check” und “env_keep” als Blacklist verstanden und die dort genannten Umgebungsvariablen werden nicht übernommen. Es ist deshalb im Allgemeinen sicherer, “env_reset” gesetzt zu lassen.

Seit Version 1.6.9. kann der Anwender zusätzliche Umgebungsvariablen über die Kommandozeile spezifizieren. Diese unterliegen ebenfalls den oben genannten Restriktionen. Allerdings hat sich in in die Programmlogik der Funktion “validate_env_vars()” ein folgenschwerer Fehler eingeschlichen, der auftritt, wenn die “env_reset”-Option deaktiviert ist. Der Bug erlaubt Umgebungsvariablen, wenn sie eigentlich verboten sein sollten und umgekehrt. Dadurch kann ein Angreifer praktisch beliebige Umgebungsvariablen laden. Eine klassische Attacke bestünde dann zum Beispiel darin, die Umgebungsvariable “LD_PRELOAD” zu manipulieren und damit vom Angreifer programmierte dynamische Objekte zu laden, um damit beliebige Befehle auszuführen.

Der triviale Programmierfehler befindet sich in der Quelltextdatei “env.c”

...
okvar = matches_env_delete(var->value) == FALSE;
if (okvar == FALSE)
...

Korrekt sollte dies heissen:

...
okvar = matches_env_delete(var->value) == FALSE;
if (okvar == TRUE)
...

Betroffen hiervon sind alle Sudo-Versionen von 1.6.9 bis 1.8.4p5. Die Linux-Distributionen haben ihre Pakete aktualisiert.

Nach oben