[技术深潜]sudo里藏了12年的提权口子,触发只要一个参数

admin 2026-05-01 06:22:20 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文披露了sudo权限提升漏洞CVE-2025-32462,该漏洞允许本地用户通过-h参数伪装主机名绕过sudoers规则中的主机限制,在无需特殊权限或复杂攻击的情况下获取root权限。漏洞影响sudo1.8.8至1.9.17版本,藏匿12年未被发现,主要威胁配置了主机限制规则的企业环境。文档提供了漏洞原理分析、利用步骤及修复建议,并提及关联漏洞CVE-2025-32463。 综合评分: 89 文章分类: 漏洞分析,渗透测试,红队,内网渗透,安全工具


cover_image

[技术深潜] sudo 里藏了 12 年的提权口子,触发只要一个参数

原创

极客零零七 极客零零七

极客零零七

2026年4月30日 07:35 加拿大

在小说阅读器读本章

去阅读

#

今天我们来聊一个让我后背发凉的漏洞。

CVE-2025-32462,sudo 的 host option(-h)参数处理逻辑里有个 bug。这个 bug 不需要任何 shellcode,不需要任何缓冲区溢出技巧,触发条件是一个普通用户加一行命令——只要 sudoers 配置里出现 host 限制规则,本地任意用户就能拿到 root。

更刺激的是:这个 bug 从 2013 年的 sudo 1.8.8 开始就存在了,藏了整整 12 年才被发现。

发现者是 Stratascale 的 Rich Mirch,2025 年 4 月报给 sudo 维护者 Todd Miller,6 月底披露并修复在 1.9.17p1。受影响版本覆盖 1.8.8 到 1.9.17 全系列,几乎所有还在维护的 Linux 发行版的默认 sudo 都中招过——Ubuntu 24.04.1、macOS Sequoia 15.3.2 都是已验证目标。

距离披露快一年了,今天把这个漏洞从原理到利用拆一遍,顺带聊聊为什么这种「逻辑漏洞」比内存破坏漏洞更值得关注。


sudo 的 host option 是什么

先讲清楚 -h 参数是干嘛的,否则后面看不懂。

sudo 的 sudoers 规则可以按主机限定。一条典型规则长这样:

alice  webserver01 = (root) /usr/sbin/nginx

意思是:用户 alice 在 webserver01 这台机器上,可以以 root 身份运行 nginx。规则里的 webserver01 就是 host 限定。

在企业环境里,sudoers 文件通常通过 LDAP 或 Puppet 集中分发,同一份配置推到所有机器上。每台机器在解析规则时,会用自己的 hostname 去匹配规则里的 host 字段,只执行匹配自己的那部分。

-h/--host 参数的设计初衷,是让管理员能查询「我在另一台机器上有什么 sudo 权限」:

sudo -l -h webserver02# 列出我在 webserver02 上的 sudo 权限

注意,它的本意只配合 -l(list)使用。文档里写得清清楚楚,2013 年引入这个参数时的 NEWS 文件原话是 “currently only used by the sudoers plugin in conjunction with the -l option”。

问题就出在这个「currently only」上——代码里没有强制限制


漏洞本质:host 字段被用户控制了

把整个鉴权流程简化成一句话:

sudo 用什么 hostname 去匹配 sudoers 规则,应该由系统决定(gethostname()),但因为 -h 参数生效范围没限制,实际可以被用户用命令行参数覆盖。

这就把整个 host 限定模型给击穿了。

举个例子。某公司 sudoers 配置:

Host_Alias  PROD     = prod-db-01Host_Alias  DEV      = dev.test.localHost_Alias  CI       = ci.test.localHost_Alias  SERVERS  = prod-db-01, dev.test.local, ci.test.local
# 用户 lowpriv 的权限分配:lowpriv  SERVERS  = (root) ALL    # 所有 SERVERS 上有 rootlowpriv  !PROD    = (root) ALL    # 但生产机器上禁止lowpriv  CI=(root)ALL#CI 机器单独允许

正常逻辑:lowpriv 在 prod-db-01 上没有 root 权限(被 !PROD 显式拒绝)。

利用:lowpriv 登录到 prod-db-01 后,运行:

sudo -h dev.test.local /bin/bash

sudo 在解析规则时,把 hostname 当成了 dev.test.local,匹配到了 lowpriv SERVERS = (root) ALL 这条规则——dev 在 SERVERS 里,规则成立,授权通过。

下面是HTB Lab中Expressway题目提权后查看到的suderos文件配置以及提权过程:

然后呢?sudo 真的在本地(prod-db-01)启动了一个 root shell。

权限检查用的是远程主机的规则,命令执行用的是本地系统。整个 host 限定机制等于不存在。


为什么藏了 12 年

这种漏洞看起来很「明显」,怎么会 12 年没人发现?我觉得有三个原因:

1. 它不像漏洞,像功能

-h 参数本身就是用来「查别的主机的权限」的。当你看 sudo 源码里 host 字段的处理时,你会觉得「让用户控制 host 是合理的」——直到你意识到这个参数还能配合非 list 操作使用。

代码层面的 bug 极小,可能就缺一个 if (mode != MODE_LIST) 的分支判断。但语义层面的影响是灾难性的。

2. 利用前提需要特定 sudoers 配置

不是所有 sudo 安装都受影响。攻击成立需要:

  • sudoers 里有 host 限定规则(Host_Alias 或具体 hostname)
  • 用户在某些 host 上有权限、在当前 host 上无权限或权限受限
  • 这种配置在小型环境少见,主要出现在用 LDAP/Puppet 集中管理 sudo 的中大型企业

所以普通个人 Linux 用户、单机服务器基本不暴露。但凡是上规模的组织,几乎一定中招。

3. 漏洞挖掘的注意力分布

sudo 历史上的高危漏洞——Baron Samedit(CVE-2021-3156)、CVE-2023-22809——都是内存破坏类。安全研究员的 fuzzing 工具、代码审计的关注点都集中在解析逻辑、堆栈缓冲区上。没人系统性审计「参数语义和执行模式之间的耦合关系」

这是一种典型的「逻辑漏洞」,它不能被 sanitizer 抓到,不会让进程崩溃,不会触发 KASAN 警告。它只是让授权决策做出了错误的判断。


攻击链还原

整条利用其实非常简单,但完整画一遍能看清防守者要观察什么:

Step 1  侦察 sudoers 配置   └─sudo-l # 列出当前用户的权限   sudo-ll # 详细模式,显示所有规则           cat /etc/sudoers /etc/sudoers.d/* (如果可读)
           关键观察:是否有 host_alias、是否有 !host 否定规则、           是否提到了"别的主机名"
Step 2  识别可利用的远程 host        └─ 找到一个:当前用户在该 host 上有 (root) ALL 权限的规则           常见目标:开发机、CI 机器、跳板机、测试服务器
Step 3 &nbsp;触发漏洞&nbsp; &nbsp; &nbsp; &nbsp; └─ sudo -h <target-host> /bin/bash&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;或&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sudo -h <target-host> -i&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;或&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sudoedit -h <target-host> /etc/shadow
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;注意:sudo 会打印&nbsp;"a remote host may only be specified&nbsp; &nbsp;whenlistingprivileges"的警告,但仍然给你root shell
Step 4 &nbsp;权限维持&nbsp; &nbsp; &nbsp; &nbsp; └─ 拿到 root 后的常规操作:&nbsp; &nbsp;-写SSHkey到 /root/.ssh/authorized_keys&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- 添加新的 sudo NOPASSWD 规则&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- 安装内核模块 / 修改 PAM

整条链没有任何「攻击痕迹」是 EDR 能直接捕获的,因为它本身就是 sudo 的合法行为。日志里能看到的只有一条 sudo 调用记录,看上去和正常使用没区别。


顺带说一下 CVE-2025-32463(chroot 漏洞)

这个 CVE 和 32462 是同一批披露、同一个 patch 修复的,发现者也是 Rich Mirch。两个一起看更完整。

CVE-2025-32463 是 sudo -R/--chroot 参数的问题。1.9.14 版本引入了一个改动:「在评估 sudoers 规则时,先用用户指定的 chroot 路径解析符号链接」——听起来很合理,但意味着在还没鉴权通过之前,sudo 就开始读用户控制的目录了

具体利用:攻击者在自己控制的目录下放一个伪造的 /etc/nsswitch.conf,里面指向恶意 .so 文件,然后:

sudo -R /tmp/attacker-controlled-dir&nbsp;true

sudo 在解析路径时通过 NSS 加载了恶意共享库,直接以 root 身份执行了攻击者代码。这个比 32462 更狠:不需要 sudoers 给你任何权限,任何能登录的本地用户都能利用。

两个漏洞放一起看,反映了 sudo 这个软件的一个共性问题:为了支持复杂的鉴权场景(host 限定、chroot 隔离),引入了大量在「鉴权完成前」就要解析的用户输入,攻击面被放大了


参考资料

  • https://www.exploit-db.com/exploits/52354
  • https://www.stratascale.com/vulnerability-alert-CVE-2025-32462-sudo-host
  • https://www.sudo.ws/security/advisories/host_any/
  • https://nvd.nist.gov/vuln/detail/CVE-2025-32462
  • https://thehackernews.com/2025/07/critical-sudo-vulnerabilities-let-local.html

思考题:你管理过的环境里,sudoers 配置是按机器一份还是全公司一份?这次漏洞之后你会调整策略吗?留言聊聊

关注「极客零零七」,每周实战攻防干货。

回复「提权」获取 Windows + Linux 提权速查表

回复「sudo」获取 sudo 安全配置审计脚本

往期推荐


Windows提权完全指南

[技术深浅] Linux提权完全指南

从网线到域控:一次完整AD渗透的全流程复盘

[技术深浅] AD域渗透攻击链全解

AD环境信息收集:域用户枚举


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:极客零零七 极客零零七 极客零零七《[技术深潜] sudo 里藏了 12 年的提权口子,触发只要一个参数》

评论:0   参与:  0