SELinux曝新安全漏洞:用户执行sudo命令可获取root权限

2017-06-02 649135人围观 ,发现 36 个不明物体 漏洞系统安全

来自 Qualys Security 的安全专家,最近发现了运用 SELinux 机制的系统漏洞。他们发现,利用该漏洞可以实现用户权限的提升,并可以覆盖文件系统中的文件。

屏幕快照 2017-06-01 下午3.34.55.png

该高危漏洞 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用户就可以用命令行输出覆盖文件系统中的任意文件。

屏幕快照 2017-06-01 下午3.35.43.png

Linux 系统问题

屏幕快照 2017-06-01 下午3.34.00.png

这个文件是用在命令行的标准输入/输出/错误文件之中。如果 “/dev/shm” 之下的符号链接在被使用sudo命令打开之前,已经替换成另一个文件的连接,就可以通过写入标准输出或者错误来覆盖任意文件。这可以通过重写可信文件(例如etc/shadow或/etc/sudoers)来升级到完全根访问模式。

该Linux漏洞会影响所有从1.8.6p7到1.8.20的版本,Sudo1.8.20p1版本修复了这个问题。目前,该漏洞根据CVSS3评级标准记为7.8分。

*参考来源:securityaffairs,Elaine编译,转载请注明FreeBuf.Com

这些评论亮了

  • c9t9h5 (1级) 这家伙太懒了,还未填写个人描述! 回复
    在运用 SELinux 机制的Linux系统上,漏洞才能执行
    )10( 亮了
  • lu4nx (1级) 知道创宇数据分析员 回复
    > 用户执行sudo命令可获取root权限
    看到标题很纳闷点进来了。用户执行sudo当然是为了获得root权限:)
    这个漏洞其实核心是在有SELinux的情况下,sudo可能获得的不是完整的root权限,那么利用这个漏洞可能获得完整的权限:
    On an SELinux-enabled system, if a user is Sudoer for a command that does not grant him full root privileges, he can overwrite any file on the filesystem (including root-owned files) with his command's output, because relabel_tty() (in src/selinux.c) calls open(O_RDWR|O_NONBLOCK) on his tty and dup2()s it to the command's stdin, stdout, and stderr. This allows any Sudoer user to obtain full root privileges.
    )6( 亮了
发表评论

已有 36 条评论

取消
Loading...
css.php