今日,研究发现如果将sudo配置为允许用户通过Runas规范中的ALL关键字以任意用户身份运行命令,则可以通过指定用户ID -1或4294967295以root用户身份运行命令。只要Runas规范明确禁止root访问,只要Runas规范中首先列出ALL关键字,具有足够sudo特权的用户就可以使用它来以root身份运行命令。以这种方式运行的命令的日志条目将列出目标用户为4294967295,而不是root。此外,将不会为该命令运行PAM会话模块。
受影响的Sudo版本:
1.8.28之前的Sudo版本会受到影响。
CVE ID:
在“ 常见漏洞和披露”数据库中, 此漏洞已分配为CVE-2019-14287。
细节:
利用该漏洞需要用户具有sudo特权,该特权使他们能够使用任意用户ID运行命令。通常,这意味着用户的sudoers条目在Runas说明符中具有特殊值 ALL。
如果sudoers策略允许,Sudo支持使用用户指定的用户名或用户ID运行命令。例如,以下sudoers条目允许id命令以任何用户身份运行,因为它在Runas说明符中包含ALL关键字。
myhost alice = (ALL) /usr/bin/id
不仅是用户 能够以任何有效用户身份运行id命令,她还能够使用#uid语法以任意用户ID身份运行它,例如:
sudo -u#1234 id -u
将返回1234。但是,setresuid(2)和setreuid(2)系统调用(sudo在运行命令之前用来更改用户ID)特别对待用户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以外的任何用户身份运行命令,则可以使用该错误来避免此限制。例如,给定以下sudoers条目:
myhost bob =(ALL,!root)/ usr / bin / vi
允许用户bob以root身份以外的任何用户身份运行vi。但是,由于该错误,bob实际上可以通过运行sudo -u#-1 vi来以root身份运行 vi,这违反了安全策略。
仅在Runas说明符中存在ALL关键字的sudoers条目会受到影响。例如,以下sudoers条目不受影响:
myhost alice = / usr / bin / id
在此示例中,只允许alice以root身份运行id命令。以其他用户身份运行命令的任何尝试都将被拒绝。
解决建议:
参考官方意见升级。