Linux: bpf: Don't infer non-NULL from a pointer with an unbounded offset
What fixes it
- 8b414dbe97fcefd116e5a620c3bd9993014aa4ceLinuxCVE List
- 019d845a08b8ccfe8eefaaf4bca6870f2b8c58aeLinuxCVE List
- 65bea674f43c09c0eda033a140dfac6a2842a19fLinuxCVE List
- 67b529f521a6676cdfc78b91b0217d7eaa84216bLinuxCVE List
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
In the Linux kernel, the following vulnerability has been resolved:
bpf: Don't infer non-NULL from a pointer with an unbounded offset
reg_not_null() decides that a register holds a non-NULL value by looking at its type alone. For pointer types that allow arithmetic the type only guarantees a non-NULL base, in case of an unbound offset the runtime offset value might still add up to NULL. Consider the followng program:
r6 = bpf_map_lookup_elem(map, &0); /* present */ if (r6 == 0) return 0; r7 = bpf_map_lookup_elem(map, &1); /* absent, NULL at runtime */ r8 = r7; r8 -= r6; /* pointer - pointer: unknown scalar, -r6 */ r8 <<= 1; r8 >>= 1; /* any non-negative offset is accepted by */ /* check_reg_sane_offset_ptr() */ r6 += r8; /* verifier: map value; runtime: zero */ if (r7 != r6) return 0; *(u8 *)(r7 + 0); /* r7 is inferred non-NULL, both are zero */
At runtime both registers are zero, the comparison is true and the load faults with NULL pointer dereference.
Require the offset to be within +-BPF_MAX_VAR_OFF in reg_not_null().
Text from CVE List
Affected versions 12
- Linuxaffected: cac616db39c207dc63465a4e05c6ce0e60b2cce4 before 8b414dbe97fcefd116e5a620c3bd9993014aa4ceCVE List
- Linuxaffected: cac616db39c207dc63465a4e05c6ce0e60b2cce4 before 019d845a08b8ccfe8eefaaf4bca6870f2b8c58aeCVE List
- Linuxaffected: cac616db39c207dc63465a4e05c6ce0e60b2cce4 before 65bea674f43c09c0eda033a140dfac6a2842a19fCVE List
- Linuxaffected: cac616db39c207dc63465a4e05c6ce0e60b2cce4 before cb6642048739bf4ee5aa09fe465511f1e87caa63CVE List
- Linuxaffected: cac616db39c207dc63465a4e05c6ce0e60b2cce4 before 67b529f521a6676cdfc78b91b0217d7eaa84216bCVE List
- Linuxaffected: 5.8CVE List
- Linuxunaffected: all versions before 5.8CVE List
- Linuxunaffected: 6.6.160 through 6.6.*CVE List
- Linuxunaffected: 6.12.114 through 6.12.*CVE List
- Linuxunaffected: 6.18.57 through 6.18.*CVE List
- Linuxunaffected: 7.2.7 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List
References 5
- git.kernel.org/stable/c/8b414dbe97fcefd116e5a620c3bd9993014aa4ceReferencevia CVE List
- git.kernel.org/stable/c/019d845a08b8ccfe8eefaaf4bca6870f2b8c58aeReferencevia CVE List
- git.kernel.org/stable/c/65bea674f43c09c0eda033a140dfac6a2842a19fReferencevia CVE List
- git.kernel.org/stable/c/cb6642048739bf4ee5aa09fe465511f1e87caa63Referencevia CVE List
- git.kernel.org/stable/c/67b529f521a6676cdfc78b91b0217d7eaa84216bReferencevia CVE List