本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux。
「运维之美」是一个有情怀、有态度,专注于 Linux 运维相关技术文章分享的公众号。公众号致力于为广大运维工作者分享各类技术文章和发布最前沿的科技信息。公众号的核心理念是:分享,我们认为只有分享才能使我们的团体更强大。如果你想第一时间获取最新技术文章,欢迎关注我们!
公众号作者 Mike,一个月薪 3000 的杂工。从事 IT 相关工作 15+ 年,热衷于互联网技术领域,认同开源文化,对运维相关技术有自己独特的见解。很愿意将自己积累的经验、心得、技能与大家分享交流,篇篇干货不要错过哟。如果你想联系到我,可关注公众号获取相关信息。
作为 Linux
中最常使用的重要实用程序之一,sudo
几乎安装在每一款 UNIX
和 Linux
发行版上的,以便用户调用和运行核心命令。然而近期这个命令曝出的一个严重的本地提权漏洞,即便配置中明确不允许 root 用户访问,该漏洞仍可允许恶意用户或程序,在目标 Linux 系统上以 root 用户身份执行任意命令。
sudo
作为一个系统命令,其允许普通用户以特殊权限来运行程序或命令,而无需切换使用环境。
漏洞详情
据悉,该漏洞由苹果信息安全部门的 Joe Vennix 追踪发现(漏洞的 CVE ID 为 CVE-2019-14287
)。
如果想要利用这个漏洞,只需按以下的方式运行即可。
$ sudo -u#-1 id -u
或者
$ sudo -u#4294967295 id -u
使用
sudo
命令时,你可以直接指定用户的 UID 来代替用户名。
之所以会产生这个漏洞,是因为将用户 ID 转换为用户名的函数会将 -1
(或无效等效的 4294967295)误认为是 0,而这正好是 root 用户 User ID
。此外,由于通过 -u
选项指定的 User ID
在密码数据库中不存在,因此不会运行任何 PAM 会话模块。
如何利用漏洞
CVE-2019-14287
是管理员在配置文件中用了 ALL 关键词后造成的。当 /etc/sudoers
文件中存在 *=(ALL, *)
形式的配置时,本地攻击者可以通过指定用户 ID 为 -1
或者 4294967295
,从而以 root 权限在服务器上执行命令。例如:
user_name ALL=(ALL, !root) /usr/bin/vim
当存在这种 ALL=(ALL, !root)
形式的配置时,表示对被切换到的用户进行了 ALL(所有用户) 和其他用户的剔除操作。例如上面的含义就是:允许 user_name
用户以非 root 权限之外的所有用户权限运行 vim
命令。
下面我们来看一个实例,首先配置一个允许 r7 用户以非 root 权限之外的所有用户权限运行 vim
命令的规则。
然后,直接以 r7 用户身份切换为 root 来运行 vim
命令。
我们可以看到,命令执行请求被拒绝了。
接着,我们利用漏洞中所描述的方式进行身份切换。
我们可以看到成功切换到为 root 用户,并打开了 /etc/shadow
文件。
/etc/shadow
文件只有具备 root 权限的用户才能进行访问。
因此,我们可以很轻易地利用该漏洞在 vim
命令下启动一个具有 root 权限的 Shell,然后执行任何命令。
# 在 vim 中执行外部命令,下面这个就表示执行一个带有 root 权限的 SHELL。
:!/bin/bash
漏洞修复建议
该漏洞影响最新版本 1.8.28 之前的所有 Sudo 版本,目前各大 Linux 发行版都已经向用户推送最新版本,请及时升级到
sudo 1.8.28
版本。检查
/etc/sudoers
是否存在 ALL 关键词的复合限制逻辑。