0x1 引言
近日 ,sudo 被爆光一个漏洞,非授权的特权用户可以绕过限制获得特权,也就是说如果将sudo配置为允许用户通过Runas规范中定义的ALL关键字来以任意用户身份运行命令的话,那么攻击者将有可能通过制定用户ID -1或4294967295来以root权限执行恶意命令,这个漏洞只能在非标准配置的Linux下生效,大多数Linux服务器不受影响。官方的修复公告请见:https://www.sudo.ws/alerts/minus_1_uid.html
受影响的Sudo版本:
1.8.28之前的Sudo版本会受到影响。
0x2 实验环境
操作系统:Ubuntu 18.04.1 LTS
内核版本:Linux version 4.15.0-36-generic
Sudo 版本 :1.8.21p2
在开始复现这个漏洞前,我们需要了解sudo命令的工作原理以及相关的文件配置
Sudo 的全称是“superuserdo”,它是Linux系统管理指令,允许用户在不需要切换环境的前提下以其它用户的权限运行应用程序或命令,通常是以 root 用户身份运行命令,以减少 root 用户的登录和管理时间,同时提高安全性,当在Linux操作系统上执行命令时,只有得到许可或者知道root密码,普通用户才可以使用sudo(super user do)命令以root身份执行命令
因此对于sudo命令来说,通过向/etc/sudoers
配置文件添加特殊的指令,就可以让某个用户以另一个用户的身份运行命令
例如,通过向/etc/sudoers
配置文件添加下面特殊的指令可让abc用户以任意非root身份运行/usr/bin/vim和/usr/bin/id命令。
abc ALL = (ALL, !root) /usr/bin/vim
abc ALL = (ALL, !root) /usr/bin/id
在Linux中创建用户时,每个用户都有一个UID,如下所示,用户kh的UID为1000,root的UID为0,而且在sudo策略中支持由用户指定的用户名或用户ID来运行命令,这也就是说sudoers配置项允许我们以任意用户的身份来运行id命令,比如说root身份!因为在Runas规范中它包含了ALL关键字。
0x3 复现过程
1.创建测试用户abc作为实验所用
useradd abc
然后用 root 身份在 /etc/sudoers 中增加:
abc ALL=(ALL,!root) /usr/bin/id
表示允许 abc帐号以非 root 外的身份执行 /usr/bin/id,如果试图以 root 身份(sudo)运行 id 命令则会被拒绝
sudo -u 也可以通过指定 UID 的方式来代替用户,当指定的 UID 为 -1 或 4294967295(-1 的补码,其实内部是按无符号整数处理的) 时,因此可以触发漏洞,绕过上面的限制并以 root 身份执行命令:
$ sudo -u#-1 id
uid=0(root) gid=1001(abc) 组=1001(abc)
$ sudo -u#4294967295 id
uid=0(root) gid=1001(abc) 组=1001(abc)
利用漏洞
如果sudoers条目允许用户以任意用户身份运行命令(非root),那么攻击者就可以利用该漏洞来绕过这种限制了,所以为了真正利用这个漏洞,用户首先需要为某个能执行其他命令的命令配置好sudoers文件。
例如,我们可以针对vim命令做如下配置:
abc ALL = (ALL, !root) /usr/bin/vim
接着我们使用sudo -u#-1 vim abc.txt
创建一个vim文件,在vim编辑文件时,我们可以使用:!符号启动另一个命令。例如,你可以输入!ls以当前文件夹为目标执行ls命令。
如果我们利用sudo -u#-1 vim命令来利用这个漏洞,vim将以root身份启动。你可以通过执行!whoami命令来确认这一点。
又或者是使用cat /etc/shadow 查看用户配置密码等敏感文件
所以当我们通过某种方法进入一台服务器,但由于服务器的安全策略的限制,这时候如果服务器的sudoers文件配置不当,那么我们能够通过上面命令来以root权限运行vim命令,并绕过目标系统中的安全策略
漏洞修复
通过复现可知该漏洞是 sudo安全策略绕过问题,它可导致恶意用户或程序在目标 Linux 系统上以 root 身份执行任意命令,目前Sudo v1.8.28版本已修复该漏洞,建议广大Linux用户尽快将sudo包更新至最新版本。