• Andrii Nakryiko's avatar
    bpf: Align CAP_NET_ADMIN checks with bpf_capable() approach · ed1ad5a7
    Andrii Nakryiko authored
    Within BPF syscall handling code CAP_NET_ADMIN checks stand out a bit
    compared to CAP_BPF and CAP_PERFMON checks. For the latter, CAP_BPF or
    CAP_PERFMON are checked first, but if they are not set, CAP_SYS_ADMIN
    takes over and grants whatever part of BPF syscall is required.
    
    Similar kind of checks that involve CAP_NET_ADMIN are not so consistent.
    One out of four uses does follow CAP_BPF/CAP_PERFMON model: during
    BPF_PROG_LOAD, if the type of BPF program is "network-related" either
    CAP_NET_ADMIN or CAP_SYS_ADMIN is required to proceed.
    
    But in three other cases CAP_NET_ADMIN is required even if CAP_SYS_ADMIN
    is set:
      - when creating DEVMAP/XDKMAP/CPU_MAP maps;
      - when attaching CGROUP_SKB programs;
      - when handling BPF_PROG_QUERY command.
    
    This patch is changing the latter three cases to follow BPF_PROG_LOAD
    model, that is allowing to proceed under either CAP_NET_ADMIN or
    CAP_SYS_ADMIN.
    
    This also makes it cleaner in subsequent BPF token patches to switch
    wholesomely to a generic bpf_token_capable(int cap) check, that always
    falls back to CAP_SYS_ADMIN if requested capability is missing.
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarYafang Shao <laoar.shao@gmail.com>
    Link: https://lore.kernel.org/bpf/20240124022127.2379740-2-andrii@kernel.org
    ed1ad5a7
syscall.c 142 KB