mirror of
https://github.com/torvalds/linux.git
synced 2026-09-27 11:02:03 +02:00
bpf: Reject pkt arguments in mutating subprogs
The verifier tracks changes in how PTR_TO_PACKET registers'
bounds are modified across subprog boundaries. PTR_TO_PACKET
registers are actually passed as PTR_TO_MEM, which is assumed
valid for the entire call. This is not the case with packet memory,
where a pskb_* call may invalidate its memory region.
Reject BPF code that passes PTR_TO_PACKET pointers to subprogs that
may mutate a packet. We cannot pass the pointer as a true PTR_TO_PACKET
because we would also need to somehow pass the PTR_TO_PACKET_META
or PTR_TO_PACKET_END to the subprog. Since we cannot avoid representing
the pointer in the subprog as PTR_TO_MEM, only permit it if the
subprog is guaranteed not to mutate the packet.
Fixes: 80f281664f5a ("bpf: Support pointers in global func args")
Reported-by: Nicholas Carlini <nicholas@carlini.com>
Suggested-by: Nicholas Carlini <nicholas@carlini.com>
Signed-off-by: Emil Tsalapatis <emil@etsalapatis.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://patch.msgid.link/20260922172028.6269-6-emil@etsalapatis.com
This commit is contained in:
parent
dec0c209a6
commit
a6c1edfbe2
|
|
@ -9750,6 +9750,16 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env, int subprog,
|
|||
if (check_mem_reg(env, reg, argno, arg->mem_size, BPF_READ | BPF_WRITE, NULL,
|
||||
NULL))
|
||||
return -EINVAL;
|
||||
/*
|
||||
* PTR_TO_PACKET get passed as PTR_TO_MEM, preventing
|
||||
* us from adjusting bounds tracking info.
|
||||
*/
|
||||
if ((reg_is_pkt_pointer_any(reg) || reg_is_dynptr_slice_pkt(reg)) &&
|
||||
sub->changes_pkt_data) {
|
||||
bpf_log(log, "%s is a packet pointer, but func#%d may change packet data\n",
|
||||
reg_arg_name(env, argno), subprog);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!(arg->arg_type & PTR_MAYBE_NULL) &&
|
||||
(type_may_be_null(reg->type) || bpf_register_is_null(reg))) {
|
||||
bpf_log(log, "%s is expected to be non-NULL\n",
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user