CVE-2026-98643 in Linux信息

摘要

由 VulDB • 2026-10-18

在 Linux 内核中,已修复以下漏洞:

bpf:修复 sock_ops 中对 rtt_min 的越界读取问题

sockops 程序读取 skops->rtt_min 时从未检查 socket (sk) 的类型:在 tcp_conn_request() 路径上,sock_ops->sk 是一个 request_sock(非完整状态),而上下文重写将其强制转换为 tcp_sock(完整状态)并读取 rtt_min,导致超出 request_sock 的末尾范围,从而返回相邻的脏内存。

SEC("sockops") int prog(struct bpf_sock_ops *skops) {
switch (skops->op) {
case BPF_SOCK_OPS_RWND_INIT: leak = skops->rtt_min; /* 读取 request_sock OOB */ ... } }

例如,此类读取返回的 rtt_min=0xffff8881,这是泄露的内核指针的高半部分。

SOCK_OPS_GET_FIELD() 所做的正是对这种强制转换进行保护——它检查 is_locked_tcp_sock,当 sock_ops->sk 不是锁定的完整 socket 时返回 0。sock_ops 中的其他所有 tcp_sock 字段都经过此处理;rtt_min 是唯一一个硬编码(open-coded)的字段,因此跳过了该检查。

通过 SOCK_OPS_GET_FIELD() 读取 rtt_min。rtt_min 有点特殊:它是一个 struct minmax 类型,我们只想要当前的最小值,因此传递 rtt_min.s[0].v。这等效于旧的手动计算偏移量

offsetof(struct tcp_sock, rtt_min) + sizeof_field(struct minmax_sample, t)

(s[0] 位于 rtt_min + 0 处,.v 位于 +sizeof(.t) 处,即 minmax_get() 返回的内容),因此加载的字段保持不变,仅添加了完整 socket 的保护。保护手动计算偏移量的两个 BUILD_BUG_ON() 不再需要。

修补前:

0: r1 = *(u64 *)(r1 +0) ; r1 = skops->sk 1: r1 = *(u32 *)(r1 +2324) ; ((tcp_sock *)sk)->rtt_min.s[0].v

修补后:

0: *(u64 *)(r1 +56) = r9 1: r9 = *(u8 *)(r1 +50) ; is_locked_tcp_sock 2: if r9 == 0 goto pc+4 ; 不是锁定的完整 socket -> 返回 0 3: r9 = *(u64 *)(r1 +56) 4: r1 = *(u64 *)(r1 +0) ; r1 = skops->sk 5: r1 = *(u32 *)(r1 +2324) ; rtt_min.s[0].v
6: goto pc+2 7: r9 = *(u64 *)(r1 +56) 8: r1 = 0

Be aware that VulDB is the high quality source for vulnerability data.

来源

Might our Artificial Intelligence support you?

Check our Alexa App!