mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
1751 字
5 分钟
666还有第三关 Linux又出漏洞 CVE-2026-43494 | 代号PinTheft
2026-05-23

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 || true

Ubuntu 用户其实不用操心,系统默认的安全配置已经够用。之前如果你在 Ubuntu 上手动开启过 RDS,按上面说的方法关掉就行

容器环境还是建议再加一层防护:可以用 seccomp 限制 socket 调用,这样容器里就碰不到 AF_RDS,也没法直接跑 modprobe rds

一块看#

它们(这些漏洞)都绕不过同一个核心问题——页缓存被污染,外加内核某个子系统里有不安全的内存操作。更巧的是,这些漏洞都出现在 2017 到 2018 年那批代码里,差不多快十年了才被人发现。

更值得玩味的一点是,这三个漏洞的发现过程几乎一模一样。研究团队用 AI 辅助的代码审计工具把内核的网络子系统扫了一遍,发现可疑之后再人工确认。说白了,以后类似的“同门”漏洞,估计还会陆续冒出来。

资源链接#

免责声明:本文内容仅供网络安全技术研究和防御参考。严禁将所述技术用于任何未经授权的系统入侵、数据窃取或破坏活动。使用者须严格遵守《中华人民共和国网络安全法》及所在地区的法律法规。因不当使用造成的一切后果由使用者自行承担。所有漏洞验证及攻击模拟必须在拥有合法控制权的测试环境中进行。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

666还有第三关 Linux又出漏洞 CVE-2026-43494 | 代号PinTheft
http://blog.mcstarland.top/posts/pin/
作者
MEMZGBL
发布于
2026-05-23
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00