lkml.org 
[lkml]   [2020]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.6 141/606] bpf: Restrict bpf_probe_read{, str}() only to archs where they work
    Date
    From: Daniel Borkmann <daniel@iogearbox.net>

    commit 0ebeea8ca8a4d1d453ad299aef0507dab04f6e8d upstream.

    Given the legacy bpf_probe_read{,str}() BPF helpers are broken on archs
    with overlapping address ranges, we should really take the next step to
    disable them from BPF use there.

    To generally fix the situation, we've recently added new helper variants
    bpf_probe_read_{user,kernel}() and bpf_probe_read_{user,kernel}_str().
    For details on them, see 6ae08ae3dea2 ("bpf: Add probe_read_{user, kernel}
    and probe_read_{user,kernel}_str helpers").

    Given bpf_probe_read{,str}() have been around for ~5 years by now, there
    are plenty of users at least on x86 still relying on them today, so we
    cannot remove them entirely w/o breaking the BPF tracing ecosystem.

    However, their use should be restricted to archs with non-overlapping
    address ranges where they are working in their current form. Therefore,
    move this behind a CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE and
    have x86, arm64, arm select it (other archs supporting it can follow-up
    on it as well).

    For the remaining archs, they can workaround easily by relying on the
    feature probe from bpftool which spills out defines that can be used out
    of BPF C code to implement the drop-in replacement for old/new kernels
    via: bpftool feature probe macro

    Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org>
    Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Link: https://lore.kernel.org/bpf/20200515101118.6508-2-daniel@iogearbox.net
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/arm/Kconfig | 1 +
    arch/arm64/Kconfig | 1 +
    arch/x86/Kconfig | 1 +
    init/Kconfig | 3 +++
    kernel/trace/bpf_trace.c | 6 ++++--
    5 files changed, 10 insertions(+), 2 deletions(-)

    diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
    index 97864aabc2a6..579f7eb6968a 100644
    --- a/arch/arm/Kconfig
    +++ b/arch/arm/Kconfig
    @@ -13,6 +13,7 @@ config ARM
    select ARCH_HAS_KEEPINITRD
    select ARCH_HAS_KCOV
    select ARCH_HAS_MEMBARRIER_SYNC_CORE
    + select ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
    select ARCH_HAS_PTE_SPECIAL if ARM_LPAE
    select ARCH_HAS_PHYS_TO_DMA
    select ARCH_HAS_SETUP_DMA_OPS
    diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
    index 0b30e884e088..84e1f0a43cdb 100644
    --- a/arch/arm64/Kconfig
    +++ b/arch/arm64/Kconfig
    @@ -21,6 +21,7 @@ config ARM64
    select ARCH_HAS_KCOV
    select ARCH_HAS_KEEPINITRD
    select ARCH_HAS_MEMBARRIER_SYNC_CORE
    + select ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
    select ARCH_HAS_PTE_DEVMAP
    select ARCH_HAS_PTE_SPECIAL
    select ARCH_HAS_SETUP_DMA_OPS
    diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
    index beea77046f9b..0bc9a74468be 100644
    --- a/arch/x86/Kconfig
    +++ b/arch/x86/Kconfig
    @@ -70,6 +70,7 @@ config X86
    select ARCH_HAS_KCOV if X86_64
    select ARCH_HAS_MEM_ENCRYPT
    select ARCH_HAS_MEMBARRIER_SYNC_CORE
    + select ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
    select ARCH_HAS_PMEM_API if X86_64
    select ARCH_HAS_PTE_DEVMAP if X86_64
    select ARCH_HAS_PTE_SPECIAL
    diff --git a/init/Kconfig b/init/Kconfig
    index ef59c5c36cdb..59908e87ece2 100644
    --- a/init/Kconfig
    +++ b/init/Kconfig
    @@ -2223,6 +2223,9 @@ config ASN1

    source "kernel/Kconfig.locks"

    +config ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
    + bool
    +
    config ARCH_HAS_SYNC_CORE_BEFORE_USERMODE
    bool

    diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
    index b899a2d7e900..158233a2ab6c 100644
    --- a/kernel/trace/bpf_trace.c
    +++ b/kernel/trace/bpf_trace.c
    @@ -857,14 +857,16 @@ tracing_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
    return &bpf_probe_read_user_proto;
    case BPF_FUNC_probe_read_kernel:
    return &bpf_probe_read_kernel_proto;
    - case BPF_FUNC_probe_read:
    - return &bpf_probe_read_compat_proto;
    case BPF_FUNC_probe_read_user_str:
    return &bpf_probe_read_user_str_proto;
    case BPF_FUNC_probe_read_kernel_str:
    return &bpf_probe_read_kernel_str_proto;
    +#ifdef CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
    + case BPF_FUNC_probe_read:
    + return &bpf_probe_read_compat_proto;
    case BPF_FUNC_probe_read_str:
    return &bpf_probe_read_compat_str_proto;
    +#endif
    #ifdef CONFIG_CGROUPS
    case BPF_FUNC_get_current_cgroup_id:
    return &bpf_get_current_cgroup_id_proto;
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-09 02:33    [W:4.791 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site