bpf: Reset register bounds before narrowing retval range in check_mem_access()
- Published
- Last modified
- Where the record stands: published, rejected by its publisher, or superseded by another id.What do these mean? →
- published
- Whether CISA lists it in its Known Exploited Vulnerabilities catalog: proof that attackers are using it.What do these mean? →
- Not listed in CISA KEV
- Fix
- Fixed in 6.11, 6.12, 6.12.103, 6.18.40, 7.1.5
- Whether working attack code is public (Exploit-DB, Metasploit, Nuclei or GitHub). Public code makes attacks easier.What do these mean? →
- None on Exploit-DB, Metasploit or GitHub
- Exploitation: none
- Automatable: no
- Technical impact: total
Summary
In the Linux kernel, the following vulnerability has been resolved: bpf: Reset register bounds before narrowing retval range in check_mem_access() When the BPF verifier processes a context load of an LSM hook return value, it calls __mark_reg_s32_range() to narrow the register to the hook's valid range. However, __mark_reg_s32_range() intersects the new range with the register's existing bounds using max_t()/min_t() rather than replacing them. If the destination register carries stale bounds from a prior instruction (e.g. BPF_MOV64_IMM), the intersection can produce a range narrower than reality. The verifier then believes it knows the register's exact value, while at runtime the actual hook return value is loaded, creating a verifier/runtime mismatch that can be used to bypass BPF memory safety checks. The else branch already calls mark_reg_unknown() to reset register state before any narrowing. Apply the same reset in the is_retval path so stale bounds are cleared before __mark_reg_s32_range() intersects.
Timeline
- CVE published
- CISA SSVC assessment
Exploitation: none · Automatable: no · Technical impact: total
- Record last updated
Affected versions
- Linux Linux
From 5d99e198be279045e6ecefe220f5c52f8ce9bfd5 · fixed in bde92f65042ec14389782dd223f706bf6b59ce5d; From 5d99e198be279045e6ecefe220f5c52f8ce9bfd5 · fixed in 0993dc5fc619c0b25ab1310cb11d65e78351c0fe; From 5d99e198be279045e6ecefe220f5c52f8ce9bfd5 · fixed in 5a55f9aecc08990940e70f0c7048a80850c5a16a; From 5d99e198be279045e6ecefe220f5c52f8ce9bfd5 · fixed in 5e0b273e0a62cc04ec338c7b502797c66c2ed42a; From 6.10.13 · fixed in 6.11; From 6.11.2 · fixed in 6.12
- Linux Linux
6.12
- KernelLinux
From 6.12.0 · fixed in 6.12.103; From 6.13.0 · fixed in 6.18.40; From 6.19.0 · fixed in 7.1.5