漏洞描述
Sudo是一个功能强大的实用程序,大多数基于Unix和Linux的操作系统都包含Sudo。它允许用户使用其他用户的安全特权运行程序。2021年1月27日,国外安全研究人员披露了Sudo 堆缓冲区溢出致本地提权漏洞,漏洞编号为 CVE-2021-3156。任何本地用户(包括普通用户和系统用户,sudoer和非sudoers)若成功利用该漏洞,可在无需密码的情况下获得root权限。提醒 sudo 用户尽快采取安全措施阻止漏洞攻击。
在 sudo
解析命令行参数的方式中发现了基于堆的缓冲区溢出。任何本地用户(普通用户和系统用户,sudoer
和非 sudoers
)都可以利用此漏洞,而无需进行身份验证,攻击者不需要知道用户的密码。成功利用此漏洞可以获得 root
权限。
用户可以使用如下方法进行自查:
以非root用户登录系统,并使用命令 sudoedit -s /
sudoedit:
开头的报错,那么表明存在漏洞。usage:
开头的报错,那么表明补丁已经生效。影响版本
Sudo 1.9.0 到 1.9.5p1 所有稳定版(默认配置)
Sudo 1.8.2 到 1.8.31p2 所有旧版本(默认配置)
安全版本
Sudo 1.9.5p2 或更新版本
安全建议
首先,安装所需的 systemtap 软件包和依赖项:
systemtap yum-utils kernel-devel-"$(uname -r)"
然后,对于 RHEL 7
,使用命令安装 kernel debuginfo:debuginfo-install -y kernel-"$(uname -r)"
。
对于 RHEL 8
,使用命令安装 sudo debuginfo:debuginfo-install sudo
。
接着,创建以下 systemtap 脚本,并将文件命名为 sudoedit-block.stap:
probe process("/usr/bin/sudo").function("main") {
command = cmdline_args(0,0,"");
if (strpos(command, "edit") >= 0) {
raise(9);
}
}
最终,使用root权限以下命令安装脚本:
# nohup stap -g sudoedit-block.stap &
该脚本将使得易受攻击的 sudoedit
二进制文件停止工作。 sudo命令仍将照常工作。上述更改在重启后失效,必须在每次重启后重新应用。
一旦安装了补丁程序,就可以通过取消 systemtap
进程来删除 systemtap
脚本。 例如,通过使用:
# kill -s SIGTERM 7590 (其中7590是systemtap进程的PID)