lkml.org 
[lkml]   [2021]   [Mar]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 6/8] bpf: Add sanity check for upper ptr_limit
    Date
    From: Piotr Krysiuk <piotras@gmail.com>

    commit 1b1597e64e1a610c7a96710fc4717158e98a08b3 upstream.

    Given we know the max possible value of ptr_limit at the time of retrieving
    the latter, add basic assertions, so that the verifier can bail out if
    anything looks odd and reject the program. Nothing triggered this so far,
    but it also does not hurt to have these.

    Signed-off-by: Piotr Krysiuk <piotras@gmail.com>
    Co-developed-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    kernel/bpf/verifier.c | 11 ++++++++---
    1 file changed, 8 insertions(+), 3 deletions(-)

    --- a/kernel/bpf/verifier.c
    +++ b/kernel/bpf/verifier.c
    @@ -2734,24 +2734,29 @@ static int retrieve_ptr_limit(const stru
    {
    bool mask_to_left = (opcode == BPF_ADD && off_is_neg) ||
    (opcode == BPF_SUB && !off_is_neg);
    - u32 off;
    + u32 off, max;

    switch (ptr_reg->type) {
    case PTR_TO_STACK:
    + /* Offset 0 is out-of-bounds, but acceptable start for the
    + * left direction, see BPF_REG_FP.
    + */
    + max = MAX_BPF_STACK + mask_to_left;
    off = ptr_reg->off + ptr_reg->var_off.value;
    if (mask_to_left)
    *ptr_limit = MAX_BPF_STACK + off;
    else
    *ptr_limit = -off - 1;
    - return 0;
    + return *ptr_limit >= max ? -ERANGE : 0;
    case PTR_TO_MAP_VALUE:
    + max = ptr_reg->map_ptr->value_size;
    if (mask_to_left) {
    *ptr_limit = ptr_reg->umax_value + ptr_reg->off;
    } else {
    off = ptr_reg->smin_value + ptr_reg->off;
    *ptr_limit = ptr_reg->map_ptr->value_size - off - 1;
    }
    - return 0;
    + return *ptr_limit >= max ? -ERANGE : 0;
    default:
    return -EINVAL;
    }

    \
     
     \ /
      Last update: 2021-03-19 13:20    [W:3.086 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site