]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bpf: Reject writes for PTR_TO_MAP_KEY in check_helper_mem_access
authorKumar Kartikeya Dwivedi <memxor@gmail.com>
Sat, 19 Mar 2022 08:08:25 +0000 (13:38 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 6 Jun 2022 06:49:00 +0000 (08:49 +0200)
commit 7b3552d3f9f6897851fc453b5131a967167e43c2 upstream.

It is not permitted to write to PTR_TO_MAP_KEY, but the current code in
check_helper_mem_access would allow for it, reject this case as well, as
helpers taking ARG_PTR_TO_UNINIT_MEM also take PTR_TO_MAP_KEY.

Fixes: 69c087ba6225 ("bpf: Add bpf_for_each_map_elem() helper")
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20220319080827.73251-4-memxor@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
kernel/bpf/verifier.c

index d175b70067b309882fac1d2cfa929a574e3509ba..57632357dac5e1158d5b505fdda2207b3731692c 100644 (file)
@@ -4861,6 +4861,11 @@ static int check_helper_mem_access(struct bpf_verifier_env *env, int regno,
                return check_packet_access(env, regno, reg->off, access_size,
                                           zero_size_allowed);
        case PTR_TO_MAP_KEY:
+               if (meta && meta->raw_mode) {
+                       verbose(env, "R%d cannot write into %s\n", regno,
+                               reg_type_str(env, reg->type));
+                       return -EACCES;
+               }
                return check_mem_region_access(env, regno, reg->off, access_size,
                                               reg->map_ptr->key_size, false);
        case PTR_TO_MAP_VALUE: