Linux: bpf: zero extend the result of an arena 32-bit cmpxchg
What fixes it
- 1bb1be18263995b159cf5afad3a05500ba6d2a7bLinuxCVE List
- 6bb6ae5ab1beffda51dabf41612f501d07f10fc6LinuxCVE List
- 1c1b476d43a8b6c9bc04600369dd8cc39950d98eLinuxCVE List
- 4814ed6406f3493bd554ad046da5f7fc04833571LinuxCVE 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: zero extend the result of an arena 32-bit cmpxchg
bpf_convert_ctx_accesses() rewrites an atomic on an arena pointer from BPF_STX | BPF_ATOMIC to BPF_STX | BPF_PROBE_ATOMIC, and it runs before bpf_opt_subreg_zext_lo32_rnd_hi32().
That pass emits an explicit zero extension for a 32-bit cmpxchg even when bpf_jit_needs_zext() is false. This is done because on some architectures 32-bit cmpxchg requires explicit zero extension for the dst register. E.g. on x86-64 'lock cmpxchg' does not change the %eax if comparison is successful, while BPF semantics declare that each operation on a 32-bit register zero extends it's upper half.
is_cmpxchg_insn() matches BPF_MODE == BPF_ATOMIC only, so an arena cmpxchg misses said zero extension adjustment. This patch adjusts is_cmpxchg_insn() to match BPF_PROBE_ATOMIC alongside BPF_ATOMIC.
Text from CVE List
Affected versions 10
- Linuxaffected: d503a04f8bc0c75dc9db9452d8cc79d748afb752 before 1bb1be18263995b159cf5afad3a05500ba6d2a7bCVE List
- Linuxaffected: d503a04f8bc0c75dc9db9452d8cc79d748afb752 before 6bb6ae5ab1beffda51dabf41612f501d07f10fc6CVE List
- Linuxaffected: d503a04f8bc0c75dc9db9452d8cc79d748afb752 before 1c1b476d43a8b6c9bc04600369dd8cc39950d98eCVE List
- Linuxaffected: d503a04f8bc0c75dc9db9452d8cc79d748afb752 before 4814ed6406f3493bd554ad046da5f7fc04833571CVE List
- Linuxaffected: 6.10CVE List
- Linuxunaffected: all versions before 6.10CVE 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 4
- git.kernel.org/stable/c/1bb1be18263995b159cf5afad3a05500ba6d2a7bReferencevia CVE List
- git.kernel.org/stable/c/6bb6ae5ab1beffda51dabf41612f501d07f10fc6Referencevia CVE List
- git.kernel.org/stable/c/1c1b476d43a8b6c9bc04600369dd8cc39950d98eReferencevia CVE List
- git.kernel.org/stable/c/4814ed6406f3493bd554ad046da5f7fc04833571Referencevia CVE List