来自 Qualys Security 的安全专家,最近发现了新的 Linux 系统漏洞。他们发现,利用该漏洞可以实现用户权限的提升,并可以覆盖文件系统中的文件。
该高危漏洞 CVE-2017-1000367 (High级别)发生在 Linux 的 Sudo 命令中的 get_process_ttyname() 函数中。攻击者可以利用这个漏洞,让普通用户在使用 Sudo 命令获得临时权限时执行一些操作,将他们的权限提升到root级别。在运用 SELinux 机制的系统上,Sudo 用户可以使用命令行的输出提升自己的用户权限,还可以在文件系统中覆盖文件系统中的文件(甚至覆盖由root用户所拥有的文件)。
漏洞解析研究员发现 Linux 系统中 Sudo 的 get_process_ttyname() 有这样的漏洞:
这个函数会打开 “ /proc/[pid]/stat ” (man proc)目录,并从 field 7 (tty_nr) 中读取设备的 tty 编号。但这些field 是以空格分开的,而 field 2中(comm,command的文件名)可以包含空格(CVE-2017-1000367)。
那么,当我们从符号链接 “./ 1 ” 中执行 Sudo 命令时,get_process_ttyname() 就会调用sudo_ttyname_dev() 来在内置的 search_devs[] 中努力寻找并不存在的“1”号 tty设备 。
然后,sudo_ttyname_dev() 开始调用 sudo_ttyname_scan() 方法,遍历“/dev”目录,并以广度优先方式寻找并不存在的 tty 设备“1”。
最后的这个遍历过程中,我们可以利用漏洞让当前的用户伪造自己的 tty 成为文件系统上任意的字符设备,然后在两个竞争条件下,该用户就可以将自己的tty伪造成文件系统上的任意文件。
在一个SELinux系统中,如果用户是通过 Sudo 命令获得临时权限的话,并没有完全取得该用户root权限。由于 relabel_tty() (在src/selinux.c中) 在用户的 tty 和 dup2() 中调用了 open(O_RDWR|O_NONBLOCK) ,并用在命令行标准输入输出中(stdin, stdout,和stderr),那么在这个情况下的 Sudo 用户就能够获取 root 权限了。
因此利用这个漏洞,sudo用户就可以用命令行输出覆盖文件系统中的任意文件。
Linux 系统问题这个文件是用在命令行的标准输入/输出/错误文件之中。如果 “/dev/shm” 之下的符号链接在被使用sudo命令打开之前,已经替换成另一个文件的连接,就可以通过写入标准输出或者错误来覆盖任意文件。这可以通过重写可信文件(例如etc/shadow或/etc/sudoers)来升级到完全根访问模式。
该Linux漏洞会影响所有从1.8.6p7到1.8.20的版本,Sudo1.8.20p1版本修复了这个问题。目前,该漏洞根据CVSS3评级标准记为7.8分。