• Daniel Borkmann's avatar
    bpf, verifier: enforce larger zero range for pkt on overloading stack buffs · b399cf64
    Daniel Borkmann authored
    Current contract for the following two helper argument types is:
    
      * ARG_CONST_STACK_SIZE: passed argument pair must be (ptr, >0).
      * ARG_CONST_STACK_SIZE_OR_ZERO: passed argument pair can be either
        (NULL, 0) or (ptr, >0).
    
    With 6841de8b ("bpf: allow helpers access the packet directly"), we can
    pass also raw packet data to helpers, so depending on the argument type
    being PTR_TO_PACKET, we now either assert memory via check_packet_access()
    or check_stack_boundary(). As a result, the tests in check_packet_access()
    currently allow more than intended with regards to reg->imm.
    
    Back in 969bf05e ("bpf: direct packet access"), check_packet_access()
    was fine to ignore size argument since in check_mem_access() size was
    bpf_size_to_bytes() derived and prior to the call to check_packet_access()
    guaranteed to be larger than zero.
    
    However, for the above two argument types, it currently means, we can have
    a <= 0 size and thus breaking current guarantees for helpers. Enforce a
    check for size <= 0 and bail out if so.
    
    check_stack_boundary() doesn't have such an issue since it already tests
    for access_size <= 0 and bails out, resp. access_size == 0 in case of NULL
    pointer passed when allowed.
    
    Fixes: 6841de8b ("bpf: allow helpers access the packet directly")
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b399cf64
verifier.c 79.2 KB