lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 202/846] bpf: Disallow BPF_LOG_KERNEL log level for bpf(BPF_BTF_LOAD)
    Date
    From: Hou Tao <houtao1@huawei.com>

    [ Upstream commit 866de407444398bc8140ea70de1dba5f91cc34ac ]

    BPF_LOG_KERNEL is only used internally, so disallow bpf_btf_load()
    to set log level as BPF_LOG_KERNEL. The same checking has already
    been done in bpf_check(), so factor out a helper to check the
    validity of log attributes and use it in both places.

    Fixes: 8580ac9404f6 ("bpf: Process in-kernel BTF")
    Signed-off-by: Hou Tao <houtao1@huawei.com>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Acked-by: Yonghong Song <yhs@fb.com>
    Acked-by: Martin KaFai Lau <kafai@fb.com>
    Link: https://lore.kernel.org/bpf/20211203053001.740945-1-houtao1@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    include/linux/bpf_verifier.h | 7 +++++++
    kernel/bpf/btf.c | 3 +--
    kernel/bpf/verifier.c | 6 +++---
    3 files changed, 11 insertions(+), 5 deletions(-)

    diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h
    index 5424124dbe365..364550dd19c4a 100644
    --- a/include/linux/bpf_verifier.h
    +++ b/include/linux/bpf_verifier.h
    @@ -396,6 +396,13 @@ static inline bool bpf_verifier_log_needed(const struct bpf_verifier_log *log)
    log->level == BPF_LOG_KERNEL);
    }

    +static inline bool
    +bpf_verifier_log_attr_valid(const struct bpf_verifier_log *log)
    +{
    + return log->len_total >= 128 && log->len_total <= UINT_MAX >> 2 &&
    + log->level && log->ubuf && !(log->level & ~BPF_LOG_MASK);
    +}
    +
    #define BPF_MAX_SUBPROGS 256

    struct bpf_subprog_info {
    diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
    index 79c0bcdcab842..b8ed4da63bc8c 100644
    --- a/kernel/bpf/btf.c
    +++ b/kernel/bpf/btf.c
    @@ -4332,8 +4332,7 @@ static struct btf *btf_parse(bpfptr_t btf_data, u32 btf_data_size,
    log->len_total = log_size;

    /* log attributes have to be sane */
    - if (log->len_total < 128 || log->len_total > UINT_MAX >> 2 ||
    - !log->level || !log->ubuf) {
    + if (!bpf_verifier_log_attr_valid(log)) {
    err = -EINVAL;
    goto errout;
    }
    diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
    index b84e63d62b8af..18c75d6d98960 100644
    --- a/kernel/bpf/verifier.c
    +++ b/kernel/bpf/verifier.c
    @@ -13759,11 +13759,11 @@ int bpf_check(struct bpf_prog **prog, union bpf_attr *attr, bpfptr_t uattr)
    log->ubuf = (char __user *) (unsigned long) attr->log_buf;
    log->len_total = attr->log_size;

    - ret = -EINVAL;
    /* log attributes have to be sane */
    - if (log->len_total < 128 || log->len_total > UINT_MAX >> 2 ||
    - !log->level || !log->ubuf || log->level & ~BPF_LOG_MASK)
    + if (!bpf_verifier_log_attr_valid(log)) {
    + ret = -EINVAL;
    goto err_unlock;
    + }
    }

    if (IS_ERR(btf_vmlinux)) {
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-01-24 23:40    [W:4.018 / U:0.352 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site