
Exploit de prueba de concepto para CVE-2017-1000367, una vulnerabilidad de escalada local de privilegios en get_process_ttyname() de Sudo en Linux, que permite sobrescribir cualquier archivo mediante la manipulación del número de dispositivo tty.
Descubrimos una vulnerabilidad en get_process_ttyname() de Sudo para Linux: esta función abre “/proc/[pid]/stat” (man proc) y lee el número de dispositivo del tty del campo 7 (tty_nr). Desafortunadamente, estos campos están separados por espacios y el campo 2 (comm, el nombre del comando) puede contener espacios (CVE-2017-1000367).
Por ejemplo, si ejecutamos Sudo a través del enlace simbólico “./ 1 ”, get_process_ttyname() llama a sudo_ttyname_dev() para buscar el número de dispositivo tty inexistente “1” en el search_devs[] incorporado.
Luego, sudo_ttyname_dev() llama a la función sudo_ttyname_scan() para buscar este número de dispositivo tty inexistente “1” en un recorrido en anchura de “/dev”.
Por último, explotamos esta función durante su recorrido del directorio “/dev/shm” escribible por todos: a través de esta vulnerabilidad, un usuario local puede pretender que su tty es cualquier dispositivo de caracteres en el sistema de archivos, y después de dos condiciones de carrera, puede pretender que su tty es cualquier archivo en el sistema de archivos.
En un sistema con SELinux habilitado, si un usuario es Sudoer para un comando que no le otorga privilegios completos de root, puede sobrescribir cualquier archivo en el sistema de archivos (incluyendo archivos propiedad de root) con la salida de su comando, porque relabel_tty() (en src/selinux.c) llama a open(O_RDWR|O_NONBLOCK) en su tty y lo duplica (dup2) a stdin, stdout y stderr del comando. Esto permite que cualquier usuario Sudoer obtenga privilegios completos de root.