linux-yocto/kernel/bpf
Daniel Borkmann a99de19128 bpf: Enforce expected_attach_type for tailcall compatibility
[ Upstream commit 4540aed51b12bc13364149bf95f6ecef013197c0 ]

Yinhao et al. recently reported:

  Our fuzzer tool discovered an uninitialized pointer issue in the
  bpf_prog_test_run_xdp() function within the Linux kernel's BPF subsystem.
  This leads to a NULL pointer dereference when a BPF program attempts to
  deference the txq member of struct xdp_buff object.

The test initializes two programs of BPF_PROG_TYPE_XDP: progA acts as the
entry point for bpf_prog_test_run_xdp() and its expected_attach_type can
neither be of be BPF_XDP_DEVMAP nor BPF_XDP_CPUMAP. progA calls into a slot
of a tailcall map it owns. progB's expected_attach_type must be BPF_XDP_DEVMAP
to pass xdp_is_valid_access() validation. The program returns struct xdp_md's
egress_ifindex, and the latter is only allowed to be accessed under mentioned
expected_attach_type. progB is then inserted into the tailcall which progA
calls.

The underlying issue goes beyond XDP though. Another example are programs
of type BPF_PROG_TYPE_CGROUP_SOCK_ADDR. sock_addr_is_valid_access() as well
as sock_addr_func_proto() have different logic depending on the programs'
expected_attach_type. Similarly, a program attached to BPF_CGROUP_INET4_GETPEERNAME
should not be allowed doing a tailcall into a program which calls bpf_bind()
out of BPF which is only enabled for BPF_CGROUP_INET4_CONNECT.

In short, specifying expected_attach_type allows to open up additional
functionality or restrictions beyond what the basic bpf_prog_type enables.
The use of tailcalls must not violate these constraints. Fix it by enforcing
expected_attach_type in __bpf_prog_map_compatible().

Note that we only enforce this for tailcall maps, but not for BPF devmaps or
cpumaps: There, the programs are invoked through dev_map_bpf_prog_run*() and
cpu_map_bpf_prog_run*() which set up a new environment / context and therefore
these situations are not prone to this issue.

Fixes: 5e43f899b0 ("bpf: Check attach type at prog load time")
Reported-by: Yinhao Hu <dddddd@hust.edu.cn>
Reported-by: Kaiyan Mei <M202472210@hust.edu.cn>
Reviewed-by: Dongliang Mu <dzm91@hust.edu.cn>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/r/20250926171201.188490-1-daniel@iogearbox.net
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2025-10-15 11:56:29 +02:00
..
preload bpf/preload: Don't select USERMODE_DRIVER 2025-08-15 12:05:00 +02:00
arraymap.c bpf: Check percpu map value size first 2024-10-17 15:22:12 +02:00
bloom_filter.c
bpf_inode_storage.c bpf: Refactor some inode/task/sk storage functions for reuse 2024-07-18 13:18:34 +02:00
bpf_iter.c
bpf_local_storage.c bpf: fix order of args in call to bpf_map_kvcalloc 2024-07-18 13:18:34 +02:00
bpf_lru_list.c
bpf_lru_list.h
bpf_lsm.c
bpf_struct_ops_types.h
bpf_struct_ops.c
bpf_task_storage.c bpf: Refactor some inode/task/sk storage functions for reuse 2024-07-18 13:18:34 +02:00
btf.c bpf: Fix memory leak in bpf_core_apply 2024-11-01 01:55:56 +01:00
cgroup_iter.c
cgroup.c cgroup/bpf: use a dedicated workqueue for cgroup bpf destruction 2024-11-08 16:26:45 +01:00
core.c bpf: Enforce expected_attach_type for tailcall compatibility 2025-10-15 11:56:29 +02:00
cpumap.c
devmap.c bpf: fix OOB devmap writes when deleting elements 2024-12-14 19:54:35 +01:00
disasm.c
disasm.h
dispatcher.c bpf: Synchronize dispatcher update with bpf_dispatcher_xdp_func 2024-08-03 08:49:45 +02:00
hashtab.c bpf: fix possible endless loop in BPF map iteration 2025-06-04 14:40:02 +02:00
helpers.c bpf: Reject %p% format string in bprintf-like helpers 2025-07-24 08:51:51 +02:00
inode.c
Kconfig
link_iter.c
local_storage.c
log.c bpf: drop unnecessary user-triggerable WARN_ONCE in verifierl log 2024-08-29 17:30:17 +02:00
lpm_trie.c bpf: Fix exact match conditions in trie_get_next_key() 2024-12-14 19:54:31 +01:00
Makefile bpf: Split off basic BPF verifier log into separate file 2024-08-29 17:30:17 +02:00
map_in_map.c
map_in_map.h
map_iter.c
memalloc.c
mmap_unlock_work.h
net_namespace.c
offload.c
percpu_freelist.c
percpu_freelist.h
prog_iter.c
queue_stack_maps.c
reuseport_array.c
ringbuf.c bpf: Add MEM_WRITE attribute 2025-01-17 13:34:43 +01:00
stackmap.c
syscall.c bpf: Move bpf map owner out of common struct 2025-09-09 18:54:11 +02:00
sysfs_btf.c
task_iter.c bpf: Fix iter/task tid filtering 2024-11-01 01:56:01 +01:00
tnum.c
trampoline.c
verifier.c bpf: Reject bpf_timer for PREEMPT_RT 2025-10-02 13:40:38 +02:00