
Proof-of-Concept-Exploit für CVE-2017-1000367, eine lokale Privilegieneskalations-Sicherheitslücke in Sudos get_process_ttyname() unter Linux, die das Überschreiben beliebiger Dateien durch tty device number manipulation ermöglicht.
Wir haben eine Sicherheitslücke in Sudos get_process_ttyname() für Linux entdeckt: Diese Funktion öffnet „/proc/[pid]/stat“ (man proc) und liest die Gerätenummer des TTY aus Feld 7 (tty_nr). Unglücklicherweise sind diese Felder durch Leerzeichen getrennt und Feld 2 (comm, der Dateiname des Befehls) kann Leerzeichen enthalten (CVE-2017-1000367).
Wenn wir Sudo beispielsweise durch den Symlink „./ 1 “ ausführen, ruft get_process_ttyname() sudo_ttyname_dev() auf, um im integrierten search_devs[] nach der nicht existierenden TTY-Gerätenummer „1“ zu suchen.
Als Nächstes ruft sudo_ttyname_dev() die Funktion sudo_ttyname_scan() auf, um diese nicht existierende TTY-Gerätenummer „1“ in einer Breitensuche von „/dev“ zu suchen.
Schließlich nutzen wir diese Funktion während ihrer Durchquerung des weltweit beschreibbaren „/dev/shm“ aus: Durch diese Schwachstelle kann ein lokaler Benutzer vorgeben, dass sein TTY ein beliebiges Zeichengerät im Dateisystem ist, und nach zwei Race-Conditions kann er vorgeben, dass sein TTY eine beliebige Datei im Dateisystem ist.
Auf einem SELinux-aktivierten System kann ein Benutzer, der Sudoer für einen Befehl ist, der ihm keine vollständigen Root-Rechte gewährt, jede Datei im Dateisystem (einschließlich Root-eigener Dateien) mit der Ausgabe seines Befehls überschreiben, da relabel_tty() (in src/selinux.c) open(O_RDWR|O_NONBLOCK) auf seinem TTY aufruft und es mit dup2() an die Standardeingabe, -ausgabe und -fehlerausgabe des Befehls bindet. Dies ermöglicht es jedem Sudoer-Benutzer, vollständige Root-Rechte zu erlangen.