
Kernel privilege escalation exploit for CVE-2026-31431, abusing AF_ALG interface to overwrite /bin/su and spawn a root shell. Includes C implementation and troubleshooting guide.
作者:0xShe
由于有的目标环境缺少 Python,使用 C 语言重写了该提权逻辑。
在你的 Linux 机器或 WSL 中运行(建议使用 -static 避免 GLIBC 版本报错):
gcc -static exploit.c -o exploit
将生成的二进制文件上传到靶机:
chmod +x exploit
./exploit
如果利用成功,程序会自动执行 su 并直接弹回一个 root 权限的 Shell,无需输入密码。
这个 Exploit 利用的是 Linux 内核 AF_ALG 接口(内核加密 API)的一个逻辑缺陷。
socket(AF_ALG, ...) 创建一个 AEAD(关联数据的认证加密)类型的套接字。splice 系统调用,可以将文件描述符(这里是 /bin/su)的数据流直接导向内核的加密缓冲区。/bin/su 的验证逻辑部分替换为我们的提权 Payload(一段运行 /bin/sh 的微型 ELF 程序)。su 已经被篡改。最后执行 system("su") 时,系统运行的是我们篡改后的 root shell。在调试过程中,如果程序提示 Exploit finished 但运行 su 依然要密码,通常是以下细节没对上:
MSG_MORE 标志这是最容易翻车的地方。在 sendmsg 时,必须带上 MSG_MORE 标志位。
splice 注入就无法进入正确的内核缓冲区,篡改也就无从谈起。内核在处理 AEAD 加密时,对关联数据的对齐和长度检查非常死板。
ASSOCLEN 设置为 4 字节而实际预期是 8 字节(或者反过来),内核会直接抛出非法参数错误,或者虽然不报错但完全不执行后续的注入逻辑。在循环篡改 /bin/su 的过程中,必须确保每次 splice 都是从文件的 0 偏移开始读。
off_su 没有显式重置为 0,splice 就会像 read 函数一样往后移动指针。第二次循环时注入的数据就会错位,导致 su 程序损坏或逻辑失效。有的系统偷偷给你打了补丁,这也是跟朋友测试出来的,有的机器已经自己偷偷上补丁了。
su 的位置不同(/bin/su 或 /usr/bin/su),代码已做自动探测,但如果都不在,需手动 which su 修改。