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_RDS、CONFIG_RDS_TCP、CONFIG_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)到散列表中时,如果中间某一页固定失败,其错误处理路径存在引用计数缺陷:
- 该函数逐页调用
pin_user_pages() 固定用户内存页
- 当其中某一页固定失败时,错误路径会释放之前已固定的页面(
put_page())
- 但未能正确重置
rm->data.op_nents(散列表条目计数)
- 后续
rds_message_purge() 清理时,根据残留的非零 op_nents 再次遍历并释放同样的页面 → 双重释放
- 每次失败的 zerocopy 发送可以偷取一页的一个引用计数
利用链
- 注册 io_uring 固定缓冲区 — 将一个匿名页注册为 io_uring 固定缓冲区,给该页增加
FOLL_PIN 1024 个引用
- 耗尽引用 — 反复发送失败的 RDS zerocopy 消息,每次偷取一个引用,直到所有引用被耗尽
- 页面回收 — 页面被内核回收并重新用作 SUID root 二进制文件(如
/usr/bin/su、/usr/bin/passwd)的页缓存
- 写入覆盖 — 利用陈旧的 io_uring 固定缓冲区指针覆盖页缓存中的目标二进制内容
- 执行提权 — 运行被篡改的 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 发布安全公告与缓解指南 |
参考资料