Koshmare-Blossom/PinTheft-go

GitHub: Koshmare-Blossom/PinTheft-go

Linux 内核 RDS zcopy 双重释放漏洞(CVE-2026-43494)的 Go 语言本地提权利用实现,通过引用计数窃取和悬挂指针写入获得 root 权限。

Stars: 0 | Forks: 1

# pintheft-go [pintheft](https://github.com/v12-security/pocs/tree/main/pintheft) 的 Go 移植版 - RDS zcopy double-free LPE。属于 [Dirty Frag](https://github.com/V4bel/dirtyfrag) 漏洞类别。 ## 工作原理 (简述) 该漏洞存在于 `rds_message_zcopy_from_user()` 中。该函数通过 `FOLL_GET` 逐个 GUP-pin 用户页面。如果后续页面发生错误(例如 `PROT_NONE` 保护页),错误路径会对已 pin 的页面调用 `put_page()`,随后 `rds_message_purge()` 会再次对它们调用 `__free_page()`,因为 `op_mmp_znotifier` 被置为 NULL,但 `op_nents`/sg 条目保持不变。当页面仍有其他引用时,`__free_page` 会静默地递减 refcount。每次失败的 `sendmsg` 都会从第一个页面恰好窃取一个 ref。 ### 绕过 `CONFIG_INIT_ON_ALLOC_DEFAULT_ON` 通过 `io_uring REGISTER_BUFFERS` pin 目标页面,这会通过 `FOLL_PIN` 将 `GUP_PIN_COUNTING_BIAS` (1024) 添加到 refcount 中。通过失败的 zcopy 发送窃取所有 1024 个 pin refs。此时页面 refcount 约为 1(仅剩 PTE 映射)。`munmap` 走正常的 `__folio_put` 路径,该路径在释放前会调用 `mem_cgroup_uncharge`(清除 `memcg_data`)。不会触发任何 `bad_page` 检查。 ### Dangling bvec 写入 `io_uring` 将原始的 `struct page*` 保留在其 bvec 数组中,且没有任何存活检查。当该页面被回收作为 suid binary 的页缓存后,`IORING_OP_READ_FIXED` 会通过该 dangling 指针将我们的 payload 写入其中。 ### 防止在 ring 关闭时 unpin `IORING_REGISTER_CLONE_BUFFERS` 会递增 `imu->refs`。一个 fork 出的守护进程子进程会保持克隆的 ring fd 处于打开状态 - `io_buffer_unmap` 发现 `refs > 1` 便跳过 `unpin_user_folio`,从而防止已释放的页面发生 refcount 损坏。 ### PCP LIFO 固定到 CPU 0,在释放前排空过期的 PCP 条目 - 当页缓存分配器抓取页面时,我们的页面会位于顶部。 ## 利用链 ``` REGISTER_BUFFERS(+1024) -> CLONE_BUFFERS(imu->refs=2) -> daemon holds clone -> steal 1024 refs -> evict page cache -> drain PCP -> munmap(free) -> pread(reclaim) -> READ_FIXED(overwrite) -> verify -> exec -> root ``` ## 用法 ``` go build -o pintheft-go . ./pintheft-go ``` 成功后会通过 PTY 落入 root shell。磁盘上的二进制文件保持不变。 ### 清理 ``` sudo cp /tmp/.backup_pintheft_ /usr/bin/su && sudo chmod u+s /usr/bin/su ``` ## 要求 - 带有未修复 RDS + io_uring 的 Linux 内核 - `CONFIG_RDS=m`, `CONFIG_RDS_TCP=m`(通过 `SO_RDS_TRANSPORT=2` 自动加载) - `CONFIG_IO_URING=y` 且 `io_uring_disabled=0` - 可读的 suid-root binary - 不需要任何 capabilities ## 参考 - [v12-security/pocs - pintheft](https://github.com/v12-security/pocs/tree/main/pintheft) - 原始 C PoC ## 致谢 - **Aaron Esau / V12 team** - 漏洞发现及原始 PoC _顺便说一句,我喜欢 Arch Linux :)_
标签:EVTX分析, Go语言, Linux内核, Web报告查看器, 内核漏洞, 安全渗透, 日志审计, 本地提权, 程序破解