
Exploit proof-of-concept per CVE-2017-1000367, una vulnerabilità di escalation locale dei privilegi in get_process_ttyname() di Sudo su Linux, che consente la sovrascrittura di qualsiasi file tramite manipolazione del numero del dispositivo tty.
Abbiamo scoperto una vulnerabilità in get_process_ttyname() di sudo per Linux: questa funzione apre “/proc/[pid]/stat” (man proc) e legge il numero di dispositivo della tty dal campo 7 (tty_nr). Sfortunatamente, questi campi sono separati da spazi e il campo 2 (comm, il nome del file del comando) può contenere spazi (CVE-2017-1000367).
Ad esempio, se eseguiamo sudo tramite il symlink “./ 1 ”, get_process_ttyname() chiama sudo_ttyname_dev() per cercare l’inesistente numero di dispositivo tty “1” nell'array integrato search_devs[].
Successivamente, sudo_ttyname_dev() chiama la funzione sudo_ttyname_scan() per cercare questo inesistente numero di dispositivo tty “1” in una ricerca in ampiezza di “/dev”.
Infine, sfruttiamo questa funzione durante la sua traversata di “/dev/shm” scrivibile da tutti: attraverso questa vulnerabilità, un utente locale può fingere che la sua tty sia qualsiasi dispositivo a caratteri sul filesystem e dopo due race condition, può fingere che la sua tty sia qualsiasi file sul filesystem.
Su un sistema con SELinux abilitato, se un utente è Sudoer per un comando che non gli garantisce pieni privilegi di root, può sovrascrivere qualsiasi file sul filesystem (inclusi i file di proprietà di root) con l’output del suo comando, perché relabel_tty() (in src/selinux.c) chiama open(O_RDWR|O_NONBLOCK) sulla sua tty e la duplica con dup2() su stdin, stdout e stderr del comando. Questo consente a qualsiasi utente Sudoer di ottenere pieni privilegi di root.