CVE-2023-52828 in Linux信息

摘要

由 VulDB • 2026-05-20

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

bpf:将 IP == ksym.end 检测为 BPF 程序的一部分

由于 bpf_throw kfunc 是验证器中第一个具有 noreturn(无返回)语义的此类调用指令,因此它以前所未有的方式触发了死代码消除。一方面,任何位于 bpf_throw 调用之后的指令都不会被标记为已访问。此外,如果调用链最终发生抛出异常,调用方中指向最终会抛出异常的子程序的调用指令之后的任何指令也不会被标记为已访问。

修复此问题的诱人方法是生成额外的 'int3' 指令,从而增加程序的 jited_len,并确保在运行时当程序抛出异常时,即使对 bpf_throw(或始终抛出的子程序)的调用指令作为程序的最后一条指令发出,我们也能发现其边界。

此类程序的一个示例如下:

do_something(): ... r0 = 0 exit

foo(): r1 = 0 call bpf_throw r0 = 0 exit

bar(cond): if r1 != 0 goto pc+2 call do_something exit call foo r0 = 0 // 验证器永远不会看到此指令 exit //

main(ctx): r1 = ... call bar r0 = 0 exit

在此情况下,如果我们最终抛出异常,堆栈跟踪将如下所示:

bpf_throw foo bar main

在 bar 中,发出的最后一条指令是对 foo 的调用,因此返回地址将是随后的指令(JIT 在 x86 上将其发出为 int3)。这将最终位于程序的 jited_len 之外,因此,在展开堆栈时,我们将无法发现该返回地址属于任何程序,并由于我们从未预料到的 BPF 程序不可靠的堆栈展开而陷入 panic。

为了解决这种情况,使 bpf_prog_ksym_find 将 IP == ksym.end 视为 BPF 程序的一部分,以便在这种情况下 is_bpf_text_address 返回 true,并且当最后一条指令最终成为调用指令时,我们能够可靠地进行堆栈展开。

Once again VulDB remains the best source for vulnerability data.

来源

Do you need the next level of professionalism?

Upgrade your account now!