
两个漏洞。一个 Shell。零磁盘写入。
dirtyfrag(CVE-2026-43284 / CVE-2026-43500)的 Go 移植版。
这类漏洞位于 Linux 内核的 XFRM 子系统。当文件页被 splice() 送入管道,再送入 ESP 加密的套接字时,内核会在原地解密 ESP 载荷——直接写入源文件的页缓存页。文件是只读的,但页缓存不是。
dirtyfrag 利用这一原语串联了两个独立的漏洞:
CVE-2026-43284 - ESP/XFRM 路径
通过 NETLINK_XFRM 安装 48 条 XFRM 传输模式 SA。每条 SA 在其 ESN 重放状态的 seq_hi 字段中编码 4 字节的 shellcode 载荷。vmsplice + splice 链会为每条 SA 触发 ESP 原地解密,将这 4 字节写入 /usr/bin/su 的页缓存条目。48 次触发,写入 192 字节,无需竞态条件。
CVE-2026-43500 - RxRPC/rxkad 路径
离线暴力破解 3 个 PCBC(fcrypt) 会话密钥,这些密钥解密后会产生目标字节序列。对每个密钥,通过 AF_RXRPC 套接字触发一次,将 /etc/passwd 中的 root 条目修补为 root::0:0(nullok)。随后 su - 将接受空密码。
两条路径都在用户 + 网络命名空间(CLONE_NEWUSER | CLONE_NEWNET)中运行,以避免在宿主机上要求 CAP_NET_ADMIN。
go build -o dirtyfrag-go .
./dirtyfrag-go
# Force a specific path
./dirtyfrag-go --force-esp
./dirtyfrag-go --force-rxrpc
# Verbose output
./dirtyfrag-go -v
该二进制会先尝试 ESP 路径。如果之后 /usr/bin/su 未被修补,则回退到 RxRPC 路径(最多重试 3 次)。成功后会通过全新 PTY 进入 root shell。
该漏洞利用只触及页缓存。磁盘上的二进制文件和 /etc/passwd 均不会被改动。重启即可恢复一切。如需在不重启的情况下立即释放缓存:
echo 1 | tee /proc/sys/vm/drop_caches
esp4、esp6(ESP 路径)和/或 rxrpc(RxRPC 路径)补丁之前的所有内核:
rmmod esp4 esp6 rxrpc
printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' \
> /etc/modprobe.d/dirtyfrag.conf
| C(原版) | Go | |
|---|---|---|
| 外部依赖 | 无 | 无 |
| 单文件 | 否 | 否 |
| 静态二进制 | 是 | 是 |
| RxRPC 路径 | 是 | 是 |
| ESP 路径 | 是 | 是 |
| 命名空间隔离 | unshare() | 通过 Cloneflags 重新执行 |
Go 运行时从一开始就是多线程的,因此不允许 unshare(CLONE_NEWUSER)。Go 移植版会将自身作为子进程重新执行,并设置 SysProcAttr.Cloneflags,这会在 Go 运行时初始化之前调用 clone()。