Sudo 的全称是“superuserdo”,它是Linux系统管理指令,允许用户在不需要切换环境的前提下以其它用户的权限运行应用程序或命令,通常是以 root 用户身份运行命令,以减少 root 用户的登录和管理时间,同时提高安全性。 该漏洞是 sudo安全策略绕过问题,可导致恶意用户或程序在目标 Linux 系统上以 root 身份执行任意命令,即使 “sudoers configuration” 明确禁止该 root访问权限也不例外。

漏洞详情


这个漏洞的 CVE 编号是CVE-2019-14287,是由苹果信息安全部门的研究员 Joe Vennix 发现并分析的。 与其说让人恐慌,不如说让人兴趣盎然:它要求系统具有非标准配置。换句话说,在默认情况下,Linux 计算机并不易受攻击。 然而,如果你的配置是这样的:让用户以 root 权限以外的其他用户权限运行命令,那么可能就需要注意了:因为用户可以通过命令行上的  –u#-1 绕过这个非 root限制。 如果将 sudo配置为允许用户通过Runas 规范中的 ALL 关键字以任意用户身份运行命令,则可以通过指定用户 ID为-1 或4294967295 以 root 用户身份运行命令。 只要Runas 规范中最先列出 ALL 关键字,即使Runas 规范明确禁止 root访问权限,那么具有足够的 sudo 权限的而用户即可以 root 身份运行命令。 以这种方式运行的命令的日志条目会把目标用户列为 4294967295而非 root。另外,将不会为该命令运行 PAM 会话模块。 具体而言: 利用该漏洞要求用户具有 sudo 权限,从而以任意用户 ID 运行命令。一般而言,这意味着用户的 sudoers 条目在 Runas 规范中具有特殊值  ALL。 Sudo 支持在 sudoers 策略允许的情况下,以用户指定的名称或用户 ID 运行命令。例如,如下 sudoers 条目允许 id 命令以任意用户身份运行,因为它包含 Runas 规范中的关键字  ALL。

myhost alice = (ALL) /usr/bin/id


用户不仅能够以其它合法用户身份运行该 id 命令,还能使用 #uid 语法以任意用户 ID 运行该命令,例如:


sudo -u#1234 id -u


将返回1234,然而,sudo 在运行命令前用户修改用户 ID 的setresuid(2) 和 setreuid(2) 系统调用将特殊对待用户 ID为-1(或其未签名的等同值 4294967295)而且并不会修改该值的用户 ID。因此,

sudo -u#-1 id -u



sudo -u#4294967295 id -u


实际上会返回 0。这是因为 sudo命令本身就已经以用户 ID 为0 运行,因此当 sudo 试图将用户 ID 修改成 -1时,不会发生任何变化。这就导致 sudo 日志条目将该命令报告为以用户 ID 为 4294967295而非 root (或者用户ID为 0)运行命令。此外,由于通过–u 选项指定的用户 ID 并不存在于密码数据库中,因此不会运行任何 PAM 会话模块。 如果sudoers 条目被写入允许用户以除 root 身份以外的用户身份运行命令,则可利用该 bug 绕过该限制。例如,给定如下 sudoers 条目:

myhost bob = (ALL, !root) /usr/bin/vi


用户 bob 被允许以除了 root以外的其它用户身份运行 vi。然而,由于存在该漏洞,bob 实际上能够通过运行 sudo –u#-1 ui 的方式以 root 身份运行 vi,从而违反了安全策略。 只有Runas 规范中存在关键字 ALL 的sudoers 条目受影响。例如,如下sudoers 条目并不受影响:

myhost alice = /usr/bin/id


在这个例子中,alice仅被允许以 root身份运行 id 命令。任何以其它用户身份运行该命令的尝试都将遭拒绝。

影响版本


1.8.28之前的所有 Sudo 版本均受影响,但是不必过于惊慌,一般默认的/etc/sudoers 不会存在这种配置!

修复方案


Sudo 1.8.28 版本已修复该漏洞。 强烈建议 Linux用户将 sudo包手动更新至最新版本。