• Stanislav Fomichev's avatar
    bpf: Check attach_func_proto more carefully in check_return_code · d1a6edec
    Stanislav Fomichev authored
    Syzkaller reports the following crash:
    
      RIP: 0010:check_return_code kernel/bpf/verifier.c:10575 [inline]
      RIP: 0010:do_check kernel/bpf/verifier.c:12346 [inline]
      RIP: 0010:do_check_common+0xb3d2/0xd250 kernel/bpf/verifier.c:14610
    
    With the following reproducer:
    
      bpf$PROG_LOAD_XDP(0x5, &(0x7f00000004c0)={0xd, 0x3, &(0x7f0000000000)=ANY=[@ANYBLOB="1800000000000019000000000000000095"], &(0x7f0000000300)='GPL\x00', 0x0, 0x0, 0x0, 0x0, 0x0, '\x00', 0x0, 0x2b, 0xffffffffffffffff, 0x8, 0x0, 0x0, 0x10, 0x0}, 0x80)
    
    Because we don't enforce expected_attach_type for XDP programs,
    we end up in hitting 'if (prog->expected_attach_type == BPF_LSM_CGROUP'
    part in check_return_code and follow up with testing
    `prog->aux->attach_func_proto->type`, but `prog->aux->attach_func_proto`
    is NULL.
    
    Add explicit prog_type check for the "Note, BPF_LSM_CGROUP that
    attach ..." condition. Also, don't skip return code check for
    LSM/STRUCT_OPS.
    
    The above actually brings an issue with existing selftest which
    tries to return EPERM from void inet_csk_clone. Fix the
    test (and move called_socket_clone to make sure it's not
    incremented in case of an error) and add a new one to explicitly
    verify this condition.
    
    Fixes: 69fd337a ("bpf: per-cgroup lsm flavor")
    Reported-by: syzbot+5cc0730bd4b4d2c5f152@syzkaller.appspotmail.com
    Signed-off-by: default avatarStanislav Fomichev <sdf@google.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Link: https://lore.kernel.org/bpf/20220708175000.2603078-1-sdf@google.com
    d1a6edec
verifier.c 438 KB