刚起床就看到如此劲爆的 0day……
这个漏洞是个 Sudo 安全策略绕过问题,即使 sudoers
明确配置为不允许 root 用户访问,该漏洞也允许恶意用户或程序在目标 Linux 系统提权上以 root 用户身份执行任意命令。
因此,即使用户被限制只能以 root 用户身份运行特定命令,该漏洞也允许用户绕过安全策略并完全控制系统。
影响范围
这次漏洞影响所有 Sudo 1.8.28之前的所有版本,而 1.8.28 在几个小时前才发布,属实算得上是 0day。
所以,如果你使用 Linux,则强烈建议立即将 sudo 软件包更新为最新版本 1.8.28。
这个漏洞不会影响以下场景的系统:
- 用户无法使用
sudo
- 用户可以直接
sudo root
的(这种情况还需要用漏洞?) - 用户只能 Sudo 到不是 root 的身份执行不可能产生破坏的程序
利用方法
利用方法异常简单。
Just Sudo User ID -1 or 4294967295
sudo -u#-1 whoami
或者 sudo -u#4294967295 whoami
即可使用 root 权限执行 whoami
命令
你也可以通过替换 whoami
实现任意命令执行。
漏洞细节
利用这个漏洞的前提是有权 sudo
到别的用户执行命令,换句话说 sudoers
配置里的 Runas
项为 ALL
。
Sudo 支持使用用户指定的用户名或者 ID (如果 sudoers
策略允许)运行命令。例如,以下 sudoers
条目允许 id
命令以任何用户身份被执行,因为它在 Runas
说明符中包含 ALL
关键字。
myhost anankke = (ALL) /usr/bin/id
不仅 anankke
作为任意(即 ALL
)合法用户可以执行 id
命令,anankke
也可以以通过 #uid
语法以任意用户或者 ID 执行这个命令,举个栗子:sudo -u#114514 id -u
会返回 114514
。
然鹅,Sudo 会在运行命令之前使用 setresuid(2)
和 setreuid(2)
这两个系统调用来改变用户 ID。所以当你运行 sudo -u#-1 id -u
或者 sudo -u#4294967295 id -u
的时候,其实会返回 0
。是不是很迷惑!
这是因为 Sudo 本来就已经在以用户ID 0
在运行了,再试图改变到 -1
不会产生任何结果,也导致了 sudo log 里会记录用户 ID 4294967295
运行了什么什么命令,而不是 root 用户运行。不仅如此,因为使用 -u
选项传入的用户 ID 4294967295
并不存在于密码数据库中,任何 PAM session 模块都不会运行。这样一来,sudoers
条目中只允许了非 root 执行的某个命令可以被这个漏洞直接绕过。再举个栗子:
myhost anankke = (ALL, !root) /usr/bin/vi
用户 anankke
可以使用任意用户身份执行 vi
,但是 root 除外。这个时候聪明机智的 Anankke 就可以通过 sudo -u#-1 vi
来绕过这个限制。
只有在 sudoers
条目中指定了用户才能限制别的用户执行命令。栗子:
myhost anankke = /usr/bin/id
这样只有 anankke
才能执行 id
命令,其他任意用户都会被拒绝,sudo -u#-1 id
也就失去效果啦。