Linux 再爆高危漏洞,一行命令提权到 root | CVE-2026-43494 | PinTheft
上周 Dirty Frag 的补丁还没打完,第三关又来了
5 月 19 号晚上,V12 Security 甩出了一个新的漏洞,编号 CVE-2026-43494,代号 PinTheft。又是一个本地提权,又是一条命令拿 root。。。。
CVE-2026-43494 是一个本地提权漏洞,套路就是页缓存污染配合 double-free。漏洞点在 RDS 协议的 zero-copy 路径,里面有个引用计数搞错了,结果跟 io_uring 一起用,直接可以拿来提权。受影响的版本跨度挺大,从 Linux 内核 4.17 到 7.1-rc3,基本覆盖了 2018 年到 2026 年 5 月。安全的版本是 7.1-rc4 及以上,主线补丁号是 e1749297。现在 PoC 已经放出来了,现实环境里也已经有人在利用这个漏洞了。
这个 RDS 是什么
RDS 全称 Reliable Datagram Sockets,是一种高性能网络协议,主要用在 Oracle RAC 这类数据库集群和高性能计算场景里。普通服务器默认不会加载这个模块,但模块通常存在于内核中,攻击者可以尝试触发自动加载
PinTheft 这个名字取得挺准——它本质上是在偷内核的内存页引用计数
原理
这个漏洞的关键在于 RDS 协议的 zero‑copy 发送路径里,具体来说就是 rds_message_zcopy_from_user() 这个函数。
正常情况下,流程是这样的:当你通过 RDS 发送 zero‑copy 数据时,内核会把用户空间的内存页钉住(pin)。一旦在钉某个页的过程中失败,函数会把已经钉住的页面释放掉,并且清除相应的标记。到这里一切看起来都还正常。
真正的问题出在这个 bug 上:在释放页面的时候,有个计数器 op_nents 没有被清零。这样一来,内核内部状态就会被“撕裂”——一部分字段告诉系统“我没资源了”,但另一部分却还在记录“我还有这么多页”。
之后当程序再调用 rds_message_purge() 时,就会根据 op_nents 的数值再次把那些页面释放掉。于是同一页会被释放两次,这就是 double‑free。double‑free 本身虽然不一定立刻导致提权,但 V12 Security 的 PoC 采用了很巧妙的方式,把这个 double‑free 和 io_uring 的固定缓冲区结合了起来。
io_uring 的固定缓冲区会给页面增加一个带特殊含义的 FOLL_PIN 引用计数。攻击者会反复利用 RDS 的错误路径,每次都“偷走”一个引用计数,等到计数最终耗尽时,这个页面就会被释放掉。但与此同时,io_uring 那边仍然保留着一个指向该页面的指针——也就是悬垂指针。
接着,攻击者会重新申请这个页面,让内核把它当作 /usr/bin/su 这类 setuid 程序的页缓存来分配。最后他再通过悬垂指针往里面写入一段极短的 shellcode。当你再次运行 su 的时候,就能得到root
关系
把这段时间曝的几个漏洞放在一起看,会发现它们其实是同一套攻击模式的不同变体:
- Copy Fail(CVE-2026-31431):走的是 AF_ALG 加密套接字,利用加密路径写页缓存,不需要特殊权限
- Dirty Frag(CVE-2026-43284 + CVE-2026-43500):走的是 IPsec ESP 和 RxRPC,两个 CVE 互补,覆盖几乎所有发行版
- PinTheft(CVE-2026-43494):走的是 RDS +
io_uring,用 double‑free 加悬垂指针完成页缓存污染
前两个都是直接写页缓存,PinTheft 绕了个弯,但终点是一样的:篡改 setuid 程序的内存镜像,拿到 root。
好消息是,RDS 模块不是默认加载的。坏消息是,模块通常存在于内核中,且攻击者可以尝试触发自动加载,除非发行版已经把它加进了黑名单
各发行版的状况不太一样:
- Ubuntu:模块存在于内核,但
/etc/modprobe.d/blacklist-rare-network.conf禁止了自动加载 - Fedora:RDS 在
kernel-modules-extra包里,自带黑名单配置 - Arch Linux:RDS 模块默认可用且可加载
- RHEL / AlmaLinux / Rocky:RHEL 的内核配置明确禁用了 RDS(
# CONFIG_RDS is not set),部分衍生发行版可能开启
跑一下这几条命令检查一下:
# 检查模块是否已加载lsmod | grep -qE '^rds ' && echo "模块已加载(有风险)" || echo "模块未加载"
# 检查是否会被自动加载grep -rqE '^alias net-pf-21 off' /etc/modprobe.d/ && echo "自动加载已禁用" || echo "自动加载可能开启"
# 检查开机是否会被拉起grep -rqE '^rds' /etc/modules-load.d/ /usr/lib/modules-load.d/ && echo "开机自动加载(有风险)" || echo "开机不自动加载"如果任何一条显示“有风险”,说明系统对 RDS 的暴露面没有完全封堵。即便现在没加载,攻击者仍有机会触发自动加载。
怎么修?
最彻底的办法是升级内核到安全版本(≥ 7.1-rc4,或对应发行版已回溯补丁的内核)。如果暂时不能升级,可以先把 RDS 模块禁掉:
# 创建黑名单配置echo "install rds /bin/false" | sudo tee /etc/modprobe.d/blacklist-rds.conf
# 顺便把辅助模块也禁了echo "install rds_tcp /bin/false" | sudo tee -a /etc/modprobe.d/blacklist-rds.conf
# 卸载已加载的模块(如有)sudo rmmod rds_tcp rds 2>/dev/null || trueUbuntu 用户其实不用操心,系统默认的安全配置已经够用。之前如果你在 Ubuntu 上手动开启过 RDS,按上面说的方法关掉就行
容器环境还是建议再加一层防护:可以用 seccomp 限制 socket 调用,这样容器里就碰不到 AF_RDS,也没法直接跑 modprobe rds
一块看
它们(这些漏洞)都绕不过同一个核心问题——页缓存被污染,外加内核某个子系统里有不安全的内存操作。更巧的是,这些漏洞都出现在 2017 到 2018 年那批代码里,差不多快十年了才被人发现。
更值得玩味的一点是,这三个漏洞的发现过程几乎一模一样。研究团队用 AI 辅助的代码审计工具把内核的网络子系统扫了一遍,发现可疑之后再人工确认。说白了,以后类似的“同门”漏洞,估计还会陆续冒出来。
资源链接
- Linux 内核补丁公告(oss‑security):https://openwall.com/lists/oss-security/2026/05/21/2
- 官方修复提交(
e1749297):https://git.kernel.org/stable/c/e174929793195e0cd6a4adb0cad731b39f9019b4 - Ubuntu 官方缓解指南:https://ubuntu.com/blog/pintheft-linux-kernel-vulnerability-mitigation
- PoC 仓库(V12 Security):https://github.com/v12security/pintheft
- MITRE CVE 详情:https://cve.org/CVERecord/?id=CVE-2026-43494
免责声明:本文内容仅供网络安全技术研究和防御参考。严禁将所述技术用于任何未经授权的系统入侵、数据窃取或破坏活动。使用者须严格遵守《中华人民共和国网络安全法》及所在地区的法律法规。因不当使用造成的一切后果由使用者自行承担。所有漏洞验证及攻击模拟必须在拥有合法控制权的测试环境中进行。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时









