由 DeepSeek 撰写。
一个普通的 IPv4 TCP 服务器存在漏洞。MPTCP 并非触发条件。
我们使用发布版 tarball 构建了 Linux 6.18.55,并让内核在一个普通的 IPPROTO_TCP 监听器上读取已释放的内存。KASAN 报告了两次。从未创建过 MPTCP 套接字,且其中一次运行在内核中关闭了 MPTCP。
同一个缺陷使内核从已释放的对象中复制字节到它发回的响应中。这正是破解 KASLR 所需的原语,我们已在未公开的工作中观察到它发生。我们没有构建内核地址泄露,也没有证明写入。
这里用代码和日志证明的是:释放后使用是真实存在的,标准 TCP 可以触达它,且上游修复可以阻止它。
| 内核 | MPTCP | 尝试次数 | 时间 | 结果 |
|---|---|---|---|---|
| 6.18.55,无修复 | 未使用 | 134,955 | 34 秒 | KASAN 释放后使用 |
| 6.18.55,无修复 | 已关闭 | 191,431 | 80 秒 | KASAN 释放后使用 |
| 6.18.55 + 修复 | 未使用 | 439,316 | 411 秒 | 干净 |
非常困难。在 KASAN 下读取器很慢,因此该缺陷在几十万次尝试内就会显现。在普通内核上则罕见得多:在约 4800 万次尝试中我们只看到两次事件,且都发生在同一五秒内。
这太少,无法给出速率。我们最多只能声称每次尝试约 1e-7 的上界,而这还是最好情况,因为我们的测试框架强制将两个数据包分配到两个 CPU 上,而真实网卡通常将一条流发送到一个 CPU。
因此,一次干净的运行并不意味着内核是安全的。在引用任何数字之前,请阅读 ANALYSIS.md 第 5.2 节和第 6 节。
TCP 服务器收到一个 SYN。该 SYN 携带一个 IPv4 选项(Record Route 或 Timestamp)。内核将这些选项保存在请求套接字上。
同一连接的第二个 SYN 到达。内核为它构建一个 SYNACK 并读取已保存的选项。
与此同时握手完成。子套接字获得同一个指针,而非副本。服务器关闭子套接字,内核用普通的 kfree() 释放这些选项。
SYNACK 代码仍在读取那块内存。这就是释放后使用。同样的读取正是将已释放的字节放入数据包的原因。
它是一个缺陷触发器,不是漏洞利用。它不泄露内核地址,不写入内核内存,也不获取 root。它展示的是内核读取已释放的内存;KASAN 是裁判。
仓库有意止步于此。后续阶段在私下进行,未在此发布。
scripts/get-kernel.sh # fetch 6.18.55, sha256 checked, into linux/
scripts/build-kernel.sh vuln # KASAN kernel, no fix
scripts/build-kernel.sh patched # KASAN kernel, with the fix
scripts/build-harness.sh # builds harness/init + initramfs
scripts/run.sh vuln 90 selftest # checks the wiring only
scripts/run.sh vuln 600 # expect a KASAN report
scripts/run.sh patched 600 # expect nothing
你需要 gcc、make、bison、flex、bc 和 qemu-system-x86_64。KVM 会大有帮助。
该虚拟机需要 2 GB 内存和 8 个 vCPU。
单次运行可能什么都显示不出来。 这并不能证明内核是安全的。请多次运行,并阅读 ANALYSIS.md 中的注意事项。
不要相信版本字符串。要查看二进制文件中的代码。
scripts/check-free-sites.py
它在运行中的内核里找到这两个空闲站点,并显示它们调用的是哪个函数:kfree(有问题的)还是 kvfree_call_rcu(已修复的)。
在编写本文所用的机器上(6.18.59_1),两个站点都使用 kvfree_call_rcu,因此该内核已修复。
如果以下三个条件全部成立,主机就受影响:
攻击者控制第 2 点。因此大多数互联网服务器都受影响,而且“我们不使用 MPTCP”也无济于事。
两点说明:
accept_source_route=0 不能保护你。它只阻止源路由,不阻止 Record Route 或 Timestamp。| 路径 | 内容 |
|---|---|
ANALYSIS.md | 完整报告:源码路径、方法、结果、限制 |
harness/ | 在 QEMU 中作为 /init 运行的漏洞触发器 |
patches/ | 上游修复,用于对照构建 |
scripts/ | 获取、构建、运行和检查辅助脚本 |
evidence/ | KASAN 报告、运行日志、构建对比 |
仅限测试内核,且仅限你拥有的内核。这里的内容不应指向你无法控制的系统。
我们的代码和文本采用 MIT 许可证。patches/ 包含一个 Linux 内核提交,仍遵循 GPL-2.0。参见 LICENSE。