MENU

CVE-2019-14287: Sudo 提权零日漏洞

2019 年 10 月 15 日 • 默认分类阅读设置

刚起床就看到如此劲爆的 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 实现任意命令执行。

2019-10-15T00:27:34.png

漏洞细节

利用这个漏洞的前提是有权 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 也就失去效果啦。

添加新评论