• Kumar Kartikeya Dwivedi's avatar
    bpf: Check PTR_TO_MEM | MEM_RDONLY in check_helper_mem_access · 97e6d7da
    Kumar Kartikeya Dwivedi authored
    The commit being fixed was aiming to disallow users from incorrectly
    obtaining writable pointer to memory that is only meant to be read. This
    is enforced now using a MEM_RDONLY flag.
    
    For instance, in case of global percpu variables, when the BTF type is
    not struct (e.g. bpf_prog_active), the verifier marks register type as
    PTR_TO_MEM | MEM_RDONLY from bpf_this_cpu_ptr or bpf_per_cpu_ptr
    helpers. However, when passing such pointer to kfunc, global funcs, or
    BPF helpers, in check_helper_mem_access, there is no expectation
    MEM_RDONLY flag will be set, hence it is checked as pointer to writable
    memory. Later, verifier sets up argument type of global func as
    PTR_TO_MEM | PTR_MAYBE_NULL, so user can use a global func to get around
    the limitations imposed by this flag.
    
    This check will also cover global non-percpu variables that may be
    introduced in kernel BTF in future.
    
    Also, we update the log message for PTR_TO_BUF case to be similar to
    PTR_TO_MEM case, so that the reason for error is clear to user.
    
    Fixes: 34d3a78c ("bpf: Make per_cpu_ptr return rdonly PTR_TO_MEM.")
    Reviewed-by: default avatarHao Luo <haoluo@google.com>
    Signed-off-by: default avatarKumar Kartikeya Dwivedi <memxor@gmail.com>
    Link: https://lore.kernel.org/r/20220319080827.73251-3-memxor@gmail.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    97e6d7da
verifier.c 415 KB