• Piotr Krysiuk's avatar
    bpf: Prohibit alu ops for pointer types not defining ptr_limit · f232326f
    Piotr Krysiuk authored
    The purpose of this patch is to streamline error propagation and in particular
    to propagate retrieve_ptr_limit() errors for pointer types that are not defining
    a ptr_limit such that register-based alu ops against these types can be rejected.
    
    The main rationale is that a gap has been identified by Piotr in the existing
    protection against speculatively out-of-bounds loads, for example, in case of
    ctx pointers, unprivileged programs can still perform pointer arithmetic. This
    can be abused to execute speculatively out-of-bounds loads without restrictions
    and thus extract contents of kernel memory.
    
    Fix this by rejecting unprivileged programs that attempt any pointer arithmetic
    on unprotected pointer types. The two affected ones are pointer to ctx as well
    as pointer to map. Field access to a modified ctx' pointer is rejected at a
    later point in time in the verifier, and 7c696732 ("bpf: Permit map_ptr
    arithmetic with opcode add and offset 0") only relevant for root-only use cases.
    Risk of unprivileged program breakage is considered very low.
    
    Fixes: 7c696732 ("bpf: Permit map_ptr arithmetic with opcode add and offset 0")
    Fixes: b2157399 ("bpf: prevent out-of-bounds speculation")
    Signed-off-by: default avatarPiotr Krysiuk <piotras@gmail.com>
    Co-developed-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
    f232326f
verifier.c 364 KB