Sudo: Lokale Root-Attacke möglich

Eine Format-String-Schwachstelle im Tool “sudo” hat zur Folge, dass ein lokaler Angreifer Root-Rechte erlangen kann.

Der Programmierfehler tritt in der Funktion “sudo_debug()” in der Quelltextdatei “src/sudo.c” auf:

void sudo_debug(int level, const char *fmt, ...)
{ va_list ap; char *fmt2; if (level > debug_level) return; /* Backet fmt with program name and a newline to make it a single write */ easprintf(&fmt2, "%s: %s\n", getprogname(), fmt); va_start(ap, fmt); vfprintf(stderr, fmt2, ap); va_end(ap); efree(fmt2);
}

Die Funktion “getprogname()” liefert einfach “argv[0]” zurück und lässt sich damit vom Benutzer kontrollieren. Hiermit kann er auch Formatierungszeichen in den “fmt2”-String kopieren. Das ist zunächst nicht dramatisch.

Im Anschluss wird allerdings “vfprintf() “aufgerufen und “fmt2” auf Stderr ausgegeben. Und dabei tritt der Format-String-Fehler auf, da “fmt2” nicht via “%s”, sondern direkt ausgegeben wird. Damit erlangt ein Angreifer Zugriff auf Speicherbereiche des Set-UID-Root-Programms Sudo und kann so beliebigen Code mit Root-Berechtigung ausführen.

Selbst wenn kein spezifischer Schadcode eingeschleust wird, lässt sich folgendermaßen sehr einfach ein Segmentation Fault hervorrufen:

$ ln -s /usr/bin/sudo %n
$ ./%n -D9
*** %n in writable segment detected *** Aborted
$

Wie im obigen Beispiel gezeigt erlangt der Angreifer Kontrolle über “argv[0]” einfach durch einen symbolischen Link.

Betroffen sind die Sudo-Versionen 1.8.0 bis 1.8.3p1. Das offizielle Advisory findet sich hier.

Nach oben