
Exploit de prova de conceito para CVE-2017-1000367, uma vulnerabilidade de escalonamento de privilégios local no get_process_ttyname() do Sudo no Linux, permitindo sobrescrever qualquer arquivo através da manipulação do número do dispositivo tty.
Descobrimos uma vulnerabilidade no get_process_ttyname() do Sudo para Linux: essa função abre "/proc/[pid]/stat" (man proc) e lê o número de dispositivo do tty do campo 7 (tty_nr). Infelizmente, esses campos são separados por espaços e o campo 2 (comm, o nome do arquivo do comando) pode conter espaços (CVE-2017-1000367).
Por exemplo, se executarmos o Sudo através do link simbólico "./ 1 ", o get_process_ttyname() chama sudo_ttyname_dev() para procurar o número de dispositivo tty inexistente "1" no search_devs[] embutido.
Em seguida, sudo_ttyname_dev() chama a função sudo_ttyname_scan() para procurar este número de dispositivo tty inexistente "1" em uma travessia em largura de "/dev".
Por último, exploramos essa função durante sua travessia do "/dev/shm" gravável por qualquer usuário: através desta vulnerabilidade, um usuário local pode fingir que seu tty é qualquer dispositivo de caractere no sistema de arquivos, e após duas condições de corrida, ele pode fingir que seu tty é qualquer arquivo no sistema de arquivos.
Em um sistema habilitado para SELinux, se um usuário é Sudoer para um comando que não lhe concede privilégios totais de root, ele pode sobrescrever qualquer arquivo no sistema de arquivos (incluindo arquivos pertencentes ao root) com a saída de seu comando, porque relabel_tty() (em src/selinux.c) chama open(O_RDWR|O_NONBLOCK) em seu tty e dup2() o para o stdin, stdout e stderr do comando. Isso permite que qualquer usuário Sudoer obtenha privilégios totais de root.