metalx1993/dirtyfrag-patches
GitHub: metalx1993/dirtyfrag-patches
修复 Linux 内核 Dirty Frag 漏洞(CVE-2026-43284、CVE-2026-43500)的补丁集合,解决 splice() 零拷贝路径因缺少写时复制导致的本地提权问题。
Stars: 0 | Forks: 0
# Dirty Frag — 内核补丁
该补丁系列用于修复由 [Hyunwoo Kim (@v4bel)](https://github.com/V4bel/dirtyfrag) 发现的 **Dirty Frag** 漏洞类别。
Dirty Frag 允许无特权的本地用户覆盖只读文件(例如 `/usr/bin/su`、`/etc/passwd`)的页缓存中的任意字节,从而在所有主流 Linux 发行版上实现**本地提权至 root**。
## ⚠️ 致谢
## 补丁
| 文件 | CVE | 子系统 | 状态 |
|---|---|---|---|
| [`0001-net-xfrm-fix-page-cache-write-via-esp-splice-CVE-2026-43284.patch`](./0001-net-xfrm-fix-page-cache-write-via-esp-splice-CVE-2026-43284.patch) | CVE-2026-43284 | `net/ipv4/esp4.c`, `net/ipv6/esp6.c`, `net/ipv4/ip_output.c`, `net/ipv6/ip6_output.c` | ✅ 已合入主线 ([`f4c50a4034e6`](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f4c50a4034e62ab75f1d5cdd191dd5f9c77fdff4)) |
| [`0002-net-rxrpc-fix-page-cache-write-via-rxkad-splice-CVE-2026-43500.patch`](./0002-net-rxrpc-fix-page-cache-write-via-rxkad-splice-CVE-2026-43500.patch) | CVE-2026-43500 | `net/rxrpc/call_event.c`, `net/rxrpc/conn_event.c` | ⏳ 已提交至 netdev 邮件列表 ([`afKV2zGR6rrelPC7@v4bel`](https://lore.kernel.org/all/afKV2zGR6rrelPC7@v4bel/)),等待合并 |
## 受影响的内核版本
- **CVE-2026-43284** (ESP):从 `4.10`(提交 `cac2661c53f3`,2017-01-17)到 `6.x`(补丁 `f4c50a4034e6` 之前)的内核
- **CVE-2026-43500** (RxRPC):从 `6.4`(提交 `2dc334f1a63a`,2023-06-08)到上游版本的内核(尚无已合并的补丁)
## 如何应用
### 应用至内核源码树
```
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
# 应用补丁 1 (ESP — CVE-2026-43284)
git am 0001-net-xfrm-fix-page-cache-write-via-esp-splice-CVE-2026-43284.patch
# 应用补丁 2 (RxRPC — CVE-2026-43500)
git am 0002-net-rxrpc-fix-page-cache-write-via-rxkad-splice-CVE-2026-43500.patch
```
### 使用 `patch` 应用(如果因上下文偏移导致 git am 失败)
```
patch -p1 < 0001-net-xfrm-fix-page-cache-write-via-esp-splice-CVE-2026-43284.patch
patch -p1 < 0002-net-rxrpc-fix-page-cache-write-via-rxkad-splice-CVE-2026-43500.patch
```
## 紧急缓解措施(无需重新编译内核)
如果您无法立即应用补丁,请将易受攻击的模块列入黑名单:
```
sudo sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' \
> /etc/modprobe.d/dirtyfrag.conf && \
rmmod esp4 esp6 rxrpc 2>/dev/null; \
echo 3 > /proc/sys/vm/drop_caches"
```
## 技术总结
### 根本原因
这两个变体都具有相同的根本原因:内核的零拷贝 `splice()` 路径直接将**只读页缓存页**植入到 `skb` 片段中,而没有写时复制(copy-on-write)语义。随后的原地加密操作会写入该页缓存页,从而永久修改缓存的文件内容。
```
splice(file_fd → pipe → socket)
│
▼
skb->frags[0].page = &page_cache_page_P <- no CoW!
│
▼
[esp_input / rxkad_verify_packet_1]
in-place AEAD/fcrypt decrypt src == dst == &P
│
▼
STORE to page_cache_page_P <- arbitrary write to read-only file cache
```
### 修复策略
| 变体 | 方法 |
|---|---|
| **ESP** | 使用 `SKBFL_SHARED_FRAG` 标记 splice 片段;在 `esp_input()`/`esp6_input()` 中检查此标志,以在执行原地加密前强制执行 `skb_cow_data()` |
| **RxRPC** | 将 `skb_cloned()` 判断条件扩展为 `(skb_cloned(skb) \|\| skb->data_len)`,以便非线性 skbs(可能包含 splice 片段)在原地解密前总是被复制 |
## 参考资料
- 原始 PoC 与分析文章:https://github.com/V4bel/dirtyfrag
- CVE-2026-43284:https://www.cve.org/CVERecord?id=CVE-2026-43284
- CVE-2026-43500:https://www.cve.org/CVERecord?id=CVE-2026-43500
- 主线提交 (ESP 修复):https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f4c50a4034e62ab75f1d5cdd191dd5f9c77fdff4
- RxRPC 补丁 (netdev 邮件列表):https://lore.kernel.org/all/afKV2zGR6rrelPC7@v4bel/
- Copy Fail(同源漏洞):https://copy.fail/
- Dirty Pipe(相同漏洞类别):https://dirtypipe.cm4all.com/
标签:0day, 0day挖掘, CSV导出, CVE, CVE-2026-43284, CVE-2026-43500, Dirty Frag, ESP, IPSec, Linux内核漏洞, Page Cache, Root权限, RxRPC, Web报告查看器, xfrm, 内核安全, 内核补丁, 协议分析, 子域名枚举, 安全渗透, 提权漏洞, 数字签名, 本地提权, 权限提升, 漏洞修复, 系统安全, 网络安全, 网络安全培训, 隐私保护, 页缓存覆写