
Preuve de concept pour CVE-2017-1000367, une vulnérabilité d'escalade de privilèges locale dans get_process_ttyname() de Sudo sur Linux, permettant l'écrasement de n'importe quel fichier via la manipulation du numéro de périphérique tty.
Nous avons découvert une vulnérabilité dans la fonction get_process_ttyname() de Sudo pour Linux : elle ouvre « /proc/[pid]/stat » (man proc) et lit le numéro de périphérique du tty dans le champ 7 (tty_nr). Malheureusement, ces champs sont séparés par des espaces et le champ 2 (comm, le nom de fichier de la commande) peut contenir des espaces (CVE-2017-1000367).
Par exemple, si nous exécutons Sudo via le lien symbolique « ./ 1 », get_process_ttyname() appelle sudo_ttyname_dev() pour rechercher le numéro de périphérique tty inexistant « 1 » dans le tableau search_devs[] intégré.
Ensuite, sudo_ttyname_dev() appelle la fonction sudo_ttyname_scan() pour rechercher ce numéro de périphérique tty inexistant « 1 » dans un parcours en largeur de « /dev ».
Enfin, nous exploitons cette fonction lors de son parcours du répertoire mondialement accessible en écriture « /dev/shm » : grâce à cette vulnérabilité, un utilisateur local peut prétendre que son tty est n'importe quel périphérique caractère du système de fichiers, et après deux conditions de concurrence (race conditions), il peut prétendre que son tty est n'importe quel fichier du système de fichiers.
Sur un système avec SELinux activé, si un utilisateur est Sudoer pour une commande qui ne lui accorde pas les privilèges root complets, il peut écraser n'importe quel fichier du système de fichiers (y compris les fichiers appartenant à root) avec la sortie de sa commande, car relabel_tty() (dans src/selinux.c) appelle open(O_RDWR|O_NONBLOCK) sur son tty et effectue un dup2() sur stdin, stdout et stderr de la commande. Cela permet à tout utilisateur Sudoer d'obtenir tous les privilèges root.