Linux: bpf: Fix NULL-ptr-deref when showing a void BTF type
What fixes it
- 62b00074b58ccf43f61f70f2cfcac80937b530c6LinuxCVE List
- 86d86f9fcf62dd3654090fbf3cf7ae5f42aa0706LinuxCVE List
- 717abdfd1d559d01fdd102023f0a990fb0437240LinuxCVE List
- 98f1cb95221332139acf514350ae2cae3b8656c5LinuxCVE List
- 5324f4e75ff6e9c2ca2e267c5f34f0937f9d0ac9LinuxCVE List
- 4ea508b9ebd78bce7f212166d2e2cba66b875f08LinuxCVE 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: Fix NULL-ptr-deref when showing a void BTF type
btf_modifier_show() resolves the modifier and then calls btf_type_ops(t)->show() unconditionally. For the void type (type_id 0, BTF_KIND_UNKN) kind_ops[] has no entry, so ->show is NULL.
A "const void" (a modifier resolving to void) cannot be a map key or value - map_check_btf() rejects it because void has no size - so the map dump path does not reach it. But bpf_snprintf_btf() takes a type_id straight from the BPF program, and passing such a "const void" from the vmlinux BTF NULL-derefs:
KASAN: null-ptr-deref in range [0x0000000000000028-0x000000000000002f] RIP: 0010:btf_modifier_show (kernel/bpf/btf.c:2914) Call Trace: <TASK> btf_type_show (kernel/bpf/btf.c:8251) btf_type_snprintf_show (kernel/bpf/btf.c:8321) bpf_snprintf_btf (kernel/trace/bpf_trace.c:1047) bpf_prog_test_run_raw_tp (net/bpf/test_run.c:829) __sys_bpf (kernel/bpf/syscall.c:4804) do_syscall_64 (arch/x86/entry/syscall_64.c:94) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121) </TASK>
Fall back to btf_df_show() when the resolved type has no show op; it emits the "<unsupported kind:N>" placeholder already used for kinds like FWD and FUNC. bpf_snprintf_btf() then returns the length as usual.
Text from CVE List
Affected versions 18
- Linuxaffected: c4d0bfb45068d853a478b9067a95969b1886a30f before cf528f2d7a0a54f2a3c6d439cfa3c8d7dfe90d8dCVE List
- Linuxaffected: c4d0bfb45068d853a478b9067a95969b1886a30f before adb15557a641cb8a31f83e5f62bd12042b138c7bCVE List
- Linuxaffected: c4d0bfb45068d853a478b9067a95969b1886a30f before 62b00074b58ccf43f61f70f2cfcac80937b530c6CVE List
- Linuxaffected: c4d0bfb45068d853a478b9067a95969b1886a30f before 86d86f9fcf62dd3654090fbf3cf7ae5f42aa0706CVE List
- Linuxaffected: c4d0bfb45068d853a478b9067a95969b1886a30f before 717abdfd1d559d01fdd102023f0a990fb0437240CVE List
- Linuxaffected: c4d0bfb45068d853a478b9067a95969b1886a30f before 98f1cb95221332139acf514350ae2cae3b8656c5CVE List
- Linuxaffected: c4d0bfb45068d853a478b9067a95969b1886a30f before 5324f4e75ff6e9c2ca2e267c5f34f0937f9d0ac9CVE List
- Linuxaffected: c4d0bfb45068d853a478b9067a95969b1886a30f before 4ea508b9ebd78bce7f212166d2e2cba66b875f08CVE List
- Linuxaffected: 5.10CVE List
- Linuxunaffected: all versions before 5.10CVE List
- Linuxunaffected: 5.10.271 through 5.10.*CVE List
- Linuxunaffected: 5.15.222 through 5.15.*CVE List
- Linuxunaffected: 6.1.189 through 6.1.*CVE List
- Linuxunaffected: 6.6.158 through 6.6.*CVE List
- Linuxunaffected: 6.12.111 through 6.12.*CVE List
- Linuxunaffected: 6.18.53 through 6.18.*CVE List
- Linuxunaffected: 7.2.7 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List
References 8
- git.kernel.org/stable/c/cf528f2d7a0a54f2a3c6d439cfa3c8d7dfe90d8dReferencevia CVE List
- git.kernel.org/stable/c/adb15557a641cb8a31f83e5f62bd12042b138c7bReferencevia CVE List
- git.kernel.org/stable/c/62b00074b58ccf43f61f70f2cfcac80937b530c6Referencevia CVE List
- git.kernel.org/stable/c/86d86f9fcf62dd3654090fbf3cf7ae5f42aa0706Referencevia CVE List
- git.kernel.org/stable/c/717abdfd1d559d01fdd102023f0a990fb0437240Referencevia CVE List
- git.kernel.org/stable/c/98f1cb95221332139acf514350ae2cae3b8656c5Referencevia CVE List
- git.kernel.org/stable/c/5324f4e75ff6e9c2ca2e267c5f34f0937f9d0ac9Referencevia CVE List
- git.kernel.org/stable/c/4ea508b9ebd78bce7f212166d2e2cba66b875f08Referencevia CVE List