mirror of
https://github.com/torvalds/linux.git
synced 2026-09-11 20:13:02 +02:00
bpf: Require MEM_PERCPU for percpu kptr stores
map_kptr_match_type() treats perm_flags as the set of register type flags
that a kptr field permits. Adding MEM_PERCPU to that set for
BPF_KPTR_PERCPU does not require the source register to carry it, however.
The subset test consequently accepts both a plain bpf_obj_new() allocation
and a referenced kernel pointer into a __percpu_kptr map field.
Loads from the field are always marked MEM_PERCPU. Consumers then treat the
stored value as the cookie returned by bpf_percpu_obj_new(): per-CPU pointer
helpers relocate it, and map teardown selects the per-CPU free path. A plain
allocation can therefore provide an arbitrary kernel read/write, while a
kernel pointer can be relocated into an invalid address or sent through a
missing destructor.
Require the source MEM_PERCPU flag to match the destination field kind.
This preserves valid bpf_percpu_obj_new() stores and rejects both the
program-BTF and kernel-BTF variants.
Fixes: 36d8bdf75a ("bpf: Add alloc/xchg/direct_access support for local percpu kptr")
Reported-by: Nicholas Carlini <npc@anthropic.com>
Suggested-by: Nicholas Carlini <npc@anthropic.com>
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20260904084325.52250-2-memxor@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
6b31560c6b
commit
048029ba1c
|
|
@ -4495,6 +4495,13 @@ static int map_kptr_match_type(struct bpf_verifier_env *env,
|
|||
if (type_flag(reg->type) & ~perm_flags)
|
||||
goto bad_type;
|
||||
|
||||
/*
|
||||
* A BPF_KPTR_PERCPU field is read back as MEM_PERCPU, so the value
|
||||
* stored in it must carry the same flag.
|
||||
*/
|
||||
if ((kptr_field->type == BPF_KPTR_PERCPU) != !!(reg->type & MEM_PERCPU))
|
||||
goto bad_type;
|
||||
|
||||
/* We need to verify reg->type and reg->btf, before accessing reg->btf */
|
||||
reg_name = btf_type_name(reg->btf, reg->btf_id);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user