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, 内核安全, 内核补丁, 协议分析, 子域名枚举, 安全渗透, 提权漏洞, 数字签名, 本地提权, 权限提升, 漏洞修复, 系统安全, 网络安全, 网络安全培训, 隐私保护, 页缓存覆写