
Эксплойт-доказательство концепции для CVE-2017-1000367, уязвимости локального повышения привилегий в get_process_ttyname() Sudo в Linux, позволяющей перезапись любого файла через манипуляцию номером tty-устройства.
Мы обнаружили уязвимость в функции get_process_ttyname() из Sudo для Linux: эта функция открывает «/proc/[pid]/stat» (man proc) и читает номер устройства tty из поля 7 (tty_nr). К сожалению, эти поля разделены пробелами, и поле 2 (comm, имя файла команды) может содержать пробелы (CVE-2017-1000367).
Например, если мы выполняем Sudo через симлинк «./ 1 », get_process_ttyname() вызывает sudo_ttyname_dev() для поиска несуществующего номера устройства tty «1» во встроенном search_devs[].
Затем sudo_ttyname_dev() вызывает функцию sudo_ttyname_scan() для поиска этого несуществующего номера устройства tty «1» при обходе «/dev» в ширину.
Наконец, мы эксплуатируем эту функцию во время её обхода доступного для записи всем каталога «/dev/shm»: через эту уязвимость локальный пользователь может притвориться, что его tty — любое символьное устройство в файловой системе, и после двух состояний гонки — что его tty — любой файл в файловой системе.
В системе с включённым SELinux, если пользователь является Sudoer для команды, которая не даёт ему полных root-привилегий, он может перезаписать любой файл в файловой системе (включая файлы, принадлежащие root) выводом своей команды, поскольку relabel_tty() (в src/selinux.c) вызывает open(O_RDWR|O_NONBLOCK) на его tty и с помощью dup2() подключает его к stdin, stdout и stderr команды. Это позволяет любому пользователю Sudoer получить полные root-привилегии.