CVE-2026-31525Linux内核BPF解释器在处理有符号32位除法(sdiv)和取模(smod)操作时存在漏洞。当操作数为32位有符号整数最小值(S32_MIN)时,使用的abs()宏会产生未定义行为,导致解释器计算错误。由于验证器的抽象解释计算结果是正确的,这种不匹配允许攻击者绕过验证器检查,导致越界映射值访问,进而可能造成权限提升。
该漏洞位于Linux内核的BPF解释器中,涉及`___bpf_prog_run`函数内的sdiv32和smod32处理逻辑。代码中对s32类型操作数使用了`abs()`宏。根据C语言标准和内核文档,对INT_MIN(-2147483648)取绝对值会导致未定义行为。在x86和ARM64架构上,`abs(S32_MIN)`返回S32_MIN本身。该值随后被符号扩展为u64(0xFFFFFFFF80000000),传递给`do_div()`宏导致除法运算结果错误。关键在于,BPF验证器(Verifier)中的`scalar32_min_max_sdiv`函数基于数学原理计算范围,认为操作是安全的。这种验证器与解释器执行逻辑的差异,使得攻击者可以构造特制的eBPF程序,利用错误的计算结果修改数组索引或指针,实现越界读写。