一. 漏洞描述
2019年10月14日,Sudo官方发布了Sudo 1.8.28版本,其中包含sudo root权限绕过漏洞的补丁修复。
此漏洞编号是CVE-2019-14287,当sudo配置为允许用户以任意方式运行命令时用户通过Runas规范中的ALL关键字,可以通过指定用户ID -1或4294967295以root用户身份运行命令。
具有足够sudo权限的用户可以使用它来运行Runas规范明确禁止使用的root命令,以这种方式运行的命令的日志条目将列出目标用户为4294967295而不是root。
Sudo 的全称是“superuserdo”,它是Linux系统管理指令,允许用户在不需要切换环境的前提下以其它用户的权限运行应用程序或命令,通常是以 root 用户身份运行命令,以减少 root 用户的登录和管理时间,同时提高安全性。
二. 漏洞分析
先看网上POC
这个poc的意思说得就是 在linux中 /etc/sudoers配置文件中如果管理员配置了 myhost bob = (ALL, !root) /usr/bin/vi 这一条配置,就代表着bob这个用户可以以任何用户的身份除开root去执行vi这条命令,但是我在redhat 7.3中测试的时候,只能像下图这样去写配置才能绕过限制。(ps:这里可能不同环境需要不同的配置的原因,具体不太清楚)
那么为了测试,我试着用test用户去修改/etc/passwd文件,正常情况下这个文件除了root用户是不可写的。
但是关键就来了,利用这个漏洞,可以实现绕过限制。成功进入到vi视图去修改文件
我在上图中为了证明能够修改,随便在某个用户后面加了一个1然后退出保存。
那么关键就是 命令 sudo -u#-1 vi /etc/passwd 了。
我的理解是,-u#后面指定一个用户的uid ,那么当这个uid 不存在或者为4294967295的时候,将用户ID转换为用户名的函数将-1或其无符号等效4294967295误认为是0。而uid为0刚好就是root用户的uid了,从而达到了绕过。
那么问题又来了,如果想提权到root ,那么关键还是看sudoer文件时如何去配置,如果配置的是vi,那么可以利用绕过修改/etc/passwd文件达到提权。如果配置文件中写的时 允许执行全部命令,那么就可以直接 sudo -u#-1 /bin/bash 从而达到提权。我这里也尝试能不能像suid那样使用, sudo -u#-1 vi /etc/passwd -exec whoami ; 不过不行,与suid提权原理不同,哈哈。。
那么再来修改一些配置文件达到提权。修改如下
这里的配置也时跟上面配置意思差不多,只不过允许的范围就广了,所以能提权。
提权方式:
利用的条件比较苛刻,只用当管理员去配置了如上的配置的时候才能去利用该漏洞达到提权的目的。但这属实是个高危漏洞。
三. 修复方式:
1.8.28之前的Sudo版本都会受到影响,Sudo 1.8.28 版本已修复该漏洞,建议 Linux用户将 sudo包手动更新至最新版本。