该漏洞由 V12 Security 团队研究员 Aaron Esau 发现。在内核补丁发布之后,研究团队公开了概念验证(PoC)利用代码。PinTheft 属于 本地提权漏洞(Local Privilege Escalation, LPE),意味着攻击者需要已经在目标系统上获得普通用户权限才能进一步利用漏洞。
PinTheft 的问题出现在 RDS(Reliable Datagram Sockets)子系统。RDS 是 Linux 内核中的一种网络协议实现,主要用于 高性能计算环境和 InfiniBand 集群通信等高吞吐场景。
漏洞存在于 RDS 的 zerocopy 发送路径。在这种模式下,内核会直接从用户态内存发送数据,而不是先复制到内核缓冲区,从而减少内存复制带来的性能开销。
关键函数 rds_message_zcopy_from_user() 在发送数据时会 逐页(page)固定用户内存,确保数据在发送期间不会被移动。但如果在后续过程中发生 page fault(页错误),错误处理路径会尝试释放之前固定的页面。
在某些条件下,这个清理逻辑会 错误地再次释放仍被引用的页面,从而导致 双重释放或引用计数异常。这种内存管理错误为后续的提权利用创造了条件。
研究人员展示了如何将这个看似普通的内存错误,结合 Linux 的其他机制转变为稳定的提权攻击。
攻击者首先通过本地代码触发 RDS zerocopy 发送路径。当页面固定过程中发生 page fault 时,错误处理逻辑会错误释放页面,导致内核内部出现 被释放但仍被引用的内存页。
随后攻击者利用 io_uring(Linux 的高性能异步 I/O 框架)中的 fixed buffers 功能。
通过精心安排缓冲区注册和内存分配,攻击者可以 重新分配之前被释放的物理页面,并在一定程度上控制这些页面的内容。
这些被操控的页面有可能属于 页缓存(page cache)——也就是内核用于缓存文件内容的内存区域。
一旦攻击者获得对这些页面的控制,就可以 修改内核缓存中的文件数据,即使磁盘上的真实文件并没有被修改。
公开的利用链中,攻击者会针对 SUID‑root 可执行文件 的页缓存进行修改。
当系统从页缓存读取该程序并执行时,内核实际上运行的是 被攻击者修改过的代码,但仍然保留该文件的 root 权限属性,从而让攻击者获得 root shell。
漏洞是否容易被利用,取决于系统配置。
目前公开的 PoC 在 Arch Linux 上成功演示,因此该发行版被认为风险较高,原因包括:
因此 Arch Linux 环境成为研究人员测试和展示漏洞的主要平台。
理论上,任何 Linux 发行版如果满足以下条件都可能受到影响:
如果系统没有启用该模块,攻击面会明显缩小。
部分报道指出,Ubuntu、Debian、RHEL 和 AlmaLinux 的默认安装通常不会启用 RDS 模块,因此在默认配置下可能风险较低。不过管理员仍然需要检查具体内核配置,而不能完全依赖默认假设。
CloudLinux 官方表示,他们在多个平台版本上测试了公开的 PoC,包括 CL7、CL8、CL9、CL10 以及 Ubuntu 22.04 版本的 CloudLinux,结果显示 这些系统未受影响。
PinTheft 并不是“开箱即用”的远程攻击。通常需要满足多个前提条件:
如果缺少其中关键条件,攻击难度会大幅增加,甚至无法利用。
系统管理员可以通过以下措施显著降低风险。
Linux 内核维护者已经发布修复补丁。最重要的措施是 安装发行版提供的最新内核更新。
更新后需要 重启系统 才能让修复生效。
如果你的系统不使用 RDS 网络功能,可以通过以下方式减少攻击面:
rds 模块加入黑名单由于利用链依赖 io_uring fixed buffers,在可行情况下限制或禁用 非特权用户访问 io_uring 能减少潜在风险。
攻击最终依赖 SUID 可执行文件进行提权,因此建议:
PinTheft 需要本地执行权限,因此以下环境应优先更新:
PinTheft 再次说明:现代 Linux 内核攻击往往并不是单一漏洞,而是 多个子系统协同利用。在这个案例中,攻击链结合了 RDS 网络子系统 与 io_uring 高性能 I/O 框架,把一个内存管理错误转化为可靠的提权路径。
即使是较少使用的内核模块,也可能在复杂系统中成为高价值攻击面。因此,及时更新内核、关闭不必要模块、最小化系统权限,仍然是防御此类漏洞最有效的基本策略。