• Joanne Koong's avatar
    bpf: Add verifier support for dynptrs · 97e03f52
    Joanne Koong authored
    This patch adds the bulk of the verifier work for supporting dynamic
    pointers (dynptrs) in bpf.
    
    A bpf_dynptr is opaque to the bpf program. It is a 16-byte structure
    defined internally as:
    
    struct bpf_dynptr_kern {
        void *data;
        u32 size;
        u32 offset;
    } __aligned(8);
    
    The upper 8 bits of *size* is reserved (it contains extra metadata about
    read-only status and dynptr type). Consequently, a dynptr only supports
    memory less than 16 MB.
    
    There are different types of dynptrs (eg malloc, ringbuf, ...). In this
    patchset, the most basic one, dynptrs to a bpf program's local memory,
    is added. For now only local memory that is of reg type PTR_TO_MAP_VALUE
    is supported.
    
    In the verifier, dynptr state information will be tracked in stack
    slots. When the program passes in an uninitialized dynptr
    (ARG_PTR_TO_DYNPTR | MEM_UNINIT), the stack slots corresponding
    to the frame pointer where the dynptr resides at are marked
    STACK_DYNPTR. For helper functions that take in initialized dynptrs (eg
    bpf_dynptr_read + bpf_dynptr_write which are added later in this
    patchset), the verifier enforces that the dynptr has been initialized
    properly by checking that their corresponding stack slots have been
    marked as STACK_DYNPTR.
    
    The 6th patch in this patchset adds test cases that the verifier should
    successfully reject, such as for example attempting to use a dynptr
    after doing a direct write into it inside the bpf program.
    Signed-off-by: default avatarJoanne Koong <joannelkoong@gmail.com>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Acked-by: default avatarDavid Vernet <void@manifault.com>
    Link: https://lore.kernel.org/bpf/20220523210712.3641569-2-joannelkoong@gmail.com
    97e03f52
bpf_verifier.h 20.4 KB