针对由 Hyunwoo Kim (@v4bel) 发现的 Dirty Frag 漏洞类别的补丁系列。
Dirty Frag 允许非特权本地用户覆盖只读文件(例如 /usr/bin/su、/etc/passwd)页缓存中的任意字节,从而在所有主流 Linux 发行版上实现本地权限提升至 root。
本仓库中的补丁并非本仓库维护者编写。
- CVE-2026-43284(ESP 补丁): 由 Hyunwoo Kim (@v4bel) 和 Kuan-Ting Chen 编写。已合并至 Linux 内核主线,提交号为
f4c50a4034e6。- CVE-2026-43500(RxRPC 补丁): 由 Hyunwoo Kim (@v4bel) 编写。已提交至 netdev 邮件列表,地址为
afKV2zGR6rrelPC7@v4bel,等待合并。本仓库是这些补丁的格式化镜像,以
git am可直接使用的格式收集于此,方便使用。 所有功劳归于原作者。原始研究和 PoC:https://github.com/V4bel/dirtyfrag
4.10(提交 cac2661c53f3,2017-01-17)到 6.x 且早于 f4c50a4034e6 的内核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"
警告: 移除
esp4/esp6将禁用 IPsec ESP。在生产系统上应用前请评估影响。
两种变体具有相同的根本原因:内核的零拷贝 splice() 路径将只读页缓存页直接放入 skb frag 中,而没有写时复制(CoW)语义。随后的就地加密操作会写入该页缓存页,从而永久修改缓存的文件内容。
splice(file_fd → pipe → socket)
│
▼
skb->frags[0].page = &page_cache_page_P <- 无 CoW!
│
▼
[esp_input / rxkad_verify_packet_1]
就地 AEAD/fcrypt 解密 src == dst == &P
│
▼
STORE 到 page_cache_page_P <- 对只读文件缓存进行任意写入
| 变体 | 方法 |
|---|
| 文件 | CVE | 子系统 | 状态 |
|---|
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) |
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),等待合并 |
| ESP | 使用 SKBFL_SHARED_FRAG 标记 splice frag;在 esp_input()/esp6_input() 中检查此标志,以在就地加密前强制调用 skb_cow_data() |
| RxRPC | 将 skb_cloned() 门控扩展为 (skb_cloned(skb) || skb->data_len),以便非线性的 skb(可能包含 splice frag)在就地解密前始终被复制 |