inet_opt / ireq_opt)针对可从普通 IPv4 TCP 监听器触达的 Linux 内核释放后使用漏洞的研究 PoC 与本地实验环境。这是一个缺陷检测器/触发器,不是漏洞利用程序。
7.0.0-38-generic)上,该代码路径存在漏洞:
inet_sock_destruct() 和 tcp_v4_reqsk_destructor() 使用
kfree() 而非 kfree_rcu() 释放选项。kfree 路径在运行时可达(kprobes)。free -> use 事件(via=reqsk),但无法可靠地复现它们。tcp2kaslr 参考仓库也止步于缺陷触发;
后续阶段未公开。CONFIG_KASAN 处于关闭状态,且 KFENCE 采样被禁用。tcp2kaslr)不需要 MPTCP。经验证的路径是普通 IPv4 TCP:
ireq_opt)。accept() 子套接字,设置 SO_LINGER(0) 并关闭它。
inet_sock_destruct() 使用 kfree() 释放选项。我们之前的触发器在两方面有误:受害者从未 accept/close 子套接字
(free_sock=0),并且我们发送的是 RST 而不是依赖服务器关闭。
当前代码添加了正确的部分:
listen --accept-close — accept + SO_LINGER(0) + close。--sync — 并发发送 ACK + 重复 SYN,不使用 RST,带 Record Route 选项。上游的修复正是:
- kfree(rcu_dereference_protected(inet->inet_opt, 1));
+ kfree_rcu(rcu_dereference_protected(inet->inet_opt, 1), rcu);
以及 tcp_v4_reqsk_destructor() 中的相同改动。
| 路径 | 内容 |
|---|---|
rust-poc/ | 原生 Rust PoC:静态 ELF 分析、kprobes、触发模式 |
lab/ | 用于旧版本地测试的 Alpine + PHP 回环受害者 |
scripts/ | 本地复现辅助脚本、授权审计辅助脚本 |
docs/FINDINGS.md | 测试了什么、确认了什么、未确认什么 |
docs/EXPLOITATION-NOTES.md | 范围:仅漏洞触发,无 RCE |
docs/evidence/ | 经过脱敏的样本证据 |
cd rust-poc
cargo build --release
# static analysis (no root)
./target/release/cve-2026-98432 static
# runtime reachability (root, tracefs)
sudo ./target/release/cve-2026-98432 runtime
# correct local vector: accept+close server + --sync trigger
cd ..
PASSES=1 ./scripts/repro-sync.sh 8083
repro-sync.sh 在 127.0.0.1:8083 上启动 --accept-close 受害者,使用 sudo 运行同步触发器,并打印 free_sock、use_build 和 UAF 判定结果。一次干净的运行并不是安全的证明:每次尝试的成功率约为 1e-7,且事件会聚集出现。
如果 artifacts/ 缺失,static/runtime 会回退到 /boot;旧版 scripts/cve-2026-98432.sh --static 可以生成内核产物。
在 KASAN 下,内核会在 inet_csk_route_req / ip_options_build 中报告 slab-use-after-free,其释放栈位于 inet_sock_destruct / inet_release。tcp2kaslr 测试框架在 KASAN 下大约经过 134k 次尝试即可触发该问题;在普通内核上,同样的竞态在约 48M 次尝试中仅被观察到两次。
仅测试你拥有或获得明确授权测试的内核和主机。该触发器是一个内核竞态,可能导致主机崩溃。请使用带快照的一次性虚拟机。
offline-ant/tcp2kaslr — 漏洞触发器、KASAN 证据、分析:
https://github.com/offline-ant/tcp2kaslripv4: free inet_opt and ireq_opt after an RCU grace period
(Eric Dumazet),在 net/ipv4/af_inet.c 和
net/ipv4/tcp_ipv4.c 中将 kfree 改为 kfree_rcu。MIT。参见 LICENSE。