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报告查看器, 内核漏洞, 安全渗透, 日志审计, 本地提权, 程序破解