CVE-2017-1000367
我们在 Sudo 的 get_process_ttyname() 函数中发现了一个针对 Linux 的漏洞:
该函数会打开 “/proc/[pid]/stat” (man proc) 并读取 tty 的设备号(字段 7,即 tty_nr)。然而,这些字段是以空格分隔的,而字段 2(comm,命令的文件名)可以包含空格(CVE-2017-1000367)。
例如,如果我们通过符号链接 “./ 1 “ 来执行 Sudo,get_process_ttyname() 会调用 sudo_ttyname_dev() 在内置的 search_devs[] 中搜索不存在的 tty 设备号 “1”。
接着,sudo_ttyname_dev() 调用函数 sudo_ttyname_scan(),在 “/dev” 的广度优先遍历中搜索这个不存在的 tty 设备号 “1”。
最后,我们在该函数遍历全局可写的 “/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 权限。
Red Hat Enterprise Linux 6 (sudo) | ✅ |
Red Hat Enterprise Linux 7 (sudo) | ✅ |
Red Hat Enterprise Linux Server (v. 5 ELS) (sudo) | ✅ |
Oracle Enterprise Linux 6 | ✅ |
Oracle Enterprise Linux 7 | ✅ |
Oracle Enterprise Linux Server 5 | ✅ |
CentOS Linux 6 (sudo) | ✅ |
CentOS Linux 7 (sudo) | ✅ |
Debian wheezy | ✅ |
Debian jessie | ✅ |
Debian stretch | ✅ |
Debian sid | ✅ |
Ubuntu 17.04 | ✅ |
Ubuntu 16.10 | ✅ |
Ubuntu 16.04 LTS | ✅ |
Ubuntu 14.04 LTS | ✅ |
SUSE Linux Enterprise Software Development Kit 12-SP2 | ✅ |
SUSE Linux Enterprise Server for Raspberry Pi 12-SP2 | ✅ |
SUSE Linux Enterprise Server 12-SP2 | ✅ |
SUSE Linux Enterprise Desktop 12-SP2 | ✅ |
OpenSuse, Slackware, and Gentoo Linux | ✅ |
如何在 CentOS/RHEL/Scientific/Oracle Linux 服务器上修补 sudo?✅ |
终端:> sudo yum update
如何在 Fedora Linux 服务器上修补 sudo?
终端:> sudo dnf update
如何在 Suse/OpenSUSE Linux 服务器上修补 sudo?✅ |
终端:> sudo zypper update
如何在 Arch Linux 服务器上修补 sudo?✅ |
终端:> sudo pacman -Syu
如何在 Alpine Linux 服务器上修补 sudo?✅ |
终端:> apk update && apk upgrade
如何在 Slackware Linux 服务器上修补 sudo?✅ |
upgradepkg sudo-1.8.20p1-i586-1_slack14.2.txz
如何在 Gentoo Linux 服务器上修补 sudo?✅ |
终端:> emerge --sync
终端:> emerge --ask --oneshot --verbose ">=app-admin/sudo-1.8.20_p1"