RDS 协议中的引用计数缺陷导致双重释放,进而实现页缓存越界写入获取 root 权限。


漏洞概述

项目 内容
漏洞名称 PinTheft
CVE 编号 CVE-2026-43494
漏洞类型 双重释放(Double-Free)→ 页缓存写入(Page-Cache Write)
CVSS 7.8(High)
发现者 Aaron Esau(V12 安全团队)
公开时间 2026 年 5 月 19 日
PoC 状态 ✅ 已公开(GitHub: v12-security/pocs)

影响范围

属性 内容
内核组件 RDS(Reliable Datagram Sockets)— rds_message_zcopy_from_user()
依赖配置 CONFIG_RDSCONFIG_RDS_TCPCONFIG_IO_URING

各发行版默认风险

发行版 默认风险 原因
Arch Linux 默认受影响 RDS 模块在内核中默认加载
Fedora ⚠️ 部分受影响 RDS 在 kernel-modules-extra 中,但 modprobe 黑名单阻止自动加载
Ubuntu ✅ 默认安全 RDS 被 /etc/modprobe.d/blacklist-rare-network.conf 黑名单禁用
Debian 稳定版 ✅ 默认安全 RDS 不会自动加载
RHEL 8/9 ✅ 默认安全 RDS 不会自动加载

漏洞原理

根因:RDS zerocopy 发送路径中的双重释放

rds_message_zcopy_from_user() 函数在将用户页固定(pin)到散列表中时,如果中间某一页固定失败,其错误处理路径存在引用计数缺陷

  1. 该函数逐页调用 pin_user_pages() 固定用户内存页
  2. 当其中某一页固定失败时,错误路径会释放之前已固定的页面(put_page()
  3. 未能正确重置 rm->data.op_nents(散列表条目计数)
  4. 后续 rds_message_purge() 清理时,根据残留的非零 op_nents 再次遍历并释放同样的页面双重释放
  5. 每次失败的 zerocopy 发送可以偷取一页的一个引用计数

利用链

  1. 注册 io_uring 固定缓冲区 — 将一个匿名页注册为 io_uring 固定缓冲区,给该页增加 FOLL_PIN 1024 个引用
  2. 耗尽引用 — 反复发送失败的 RDS zerocopy 消息,每次偷取一个引用,直到所有引用被耗尽
  3. 页面回收 — 页面被内核回收并重新用作 SUID root 二进制文件(如 /usr/bin/su/usr/bin/passwd)的页缓存
  4. 写入覆盖 — 利用陈旧的 io_uring 固定缓冲区指针覆盖页缓存中的目标二进制内容
  5. 执行提权 — 运行被篡改的 SUID 二进制 → root shell

漏洞特点

  • 仅修改内存 — 磁盘文件保持不变,文件完整性检查无法发现
  • 需要 io_uring — 大多数现代发行版默认启用
  • ⚠️ 利用前提 — 需要先加载 RDS 模块(部分发行版默认禁用)

缓解措施

方案一:升级内核

# Arch Linux
sudo pacman -Syu linux
sudo reboot

# Fedora
sudo dnf upgrade --refresh kernel kernel-core kernel-modules
sudo reboot

# Ubuntu(如使用非默认启用了 RDS 的内核)
sudo apt update && sudo apt dist-upgrade
sudo reboot

方案二:禁用 RDS 模块(推荐临时缓解)

# 卸载 RDS 模块
sudo rmmod rds_tcp rds 2>/dev/null

# 阻止模块自动加载
printf 'install rds /bin/false\ninstall rds_tcp /bin/false\n' | sudo tee /etc/modprobe.d/pintheft.conf

方案三:禁用 io_uring(备用)

# 通过内核参数禁用 io_uring
echo "io_uring_disabled=2" | sudo tee -a /etc/sysctl.d/99-disable-io_uring.conf

检测方法

# 检查 RDS 模块是否已加载
lsmod | grep rds

# 检查内核版本
uname -r

# 检查内核日志中是否有可疑异常
dmesg | grep -i "rds\|RDS" | tail -20

时间线

日期 事件
2026-05-19 漏洞通过 oss-security 列表公开披露
2026-05-19 PoC 发布在 v12-security/pocs 仓库
2026-05-19 Canonical 发布安全公告与缓解指南

参考资料