CVE-2019-14287

引用:

Potential bypass of Runas user restrictions (sudo official page)

CVE-2019-14287:sudo权限绕过漏洞分析与复现

Linux Sudo暴userID提权漏洞CVE-2019-14287

sudo 用法简介

第一次复现CVE漏洞,十分滴激动

概述

Sudo 的全称是“superuserdo”,它是Linux系统管理指令,允许用户在不需要切换环境的前提下以其它用户的权限运行应用程序或命令。通常以 root 用户身份运行命令,是为了减少 root 用户的登录和管理时间,同时提高安全性。

2019年10月14日,Sudo官方发布了Sudo 1.8.28版本,其中包含sudo root权限绕过漏洞(CVE-2019-14287)的补丁修复。

利用前提

  1. sudo -v < 1.8.28
  2. 知道当前用户的密码
  3. 当前用户存在于sudo权限列表

漏洞复现

复现是在sudo 1.8.16的版本下进行的,对于低于1.8.28的版本都起作用

1
test	ALL=(ALL,!root)	/usr/bin/id

其中,在sudoers配置中,以上语句代表着test用户,ALL=(ALL,!root)代表指定用户,即所有除root以外的用户都可运行命令/usr/bin/id

一般情况下,大多数Linux发行版的Runas规范(/etc /sudoers)都如下图(第三张图)所示,其中定义的ALL关键字将允许admin或sudo组中的用户以目标系统中的任意用户身份来运行命令

如果想利用该漏洞来实施攻击,用户需要拥有sudo权限,并允许用户使用任意用户ID来运行命令(如下图中定义了test用户可用id命令,但不能以root用户执行命令id(test ALL=(ALL,!root) /usr/bin/id))。通常来说,这意味着用户的sudoer项在Runas规范中定义了特殊的ALL值。如果sudoer策略允许的话,sudo支持由用户指定的用户名或用户ID来运行命令。

如果sudoer条目允许用户以任意用户身份运行命令(非root),那么攻击者就可以利用该漏洞来绕过这种限制了。

1
2
sudo -u#-1 id
sudo -u#4294967295 id

上述命令运行之后,将返回“0”。这是因为sudo命令本身已经在以用户ID“0”运行了,所以当sudo尝试将用户ID修改为“-1”时,不会发生任何变化。

但是,sudo日志条目中记录下的命令运行用户的ID为“4294967295”,而并非root用户(或用户ID为“0”),除此之外,因为用户ID是通过-u选项指定的,并且不会在密码数据库中存储,所以PAM会话模块也不会运行。

漏洞片段

漏洞CVE-2019-14287的源于sudo调用的系统函数setresuid()和setreuid()在参数处理中会将 -1(或其等效的无符号整数4294967295)误认为是 0,而这正好是 root 用户的UserID 。

实际上,只要用户的权限足够高,即拥有最高sudo权限的用户,并且在Runas规范中定义了ALL关键字的话,他们就可以运行Runas规范中明确禁止使用的那些root命令,而且以这种方式运行的命令其日志项所显示的目标用户为4294967295,而不是root。与此同时,在执行相应命令的过程中,PAM会话模块将不会运行。

updatedupdated2021-11-212021-11-21