All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vadim Fedorenko <vadim.fedorenko@linux.dev>
To: Song Liu <song@kernel.org>,
	bpf@vger.kernel.org, fsverity@lists.linux.dev
Cc: ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org,
	martin.lau@kernel.org, kernel-team@meta.com, ebiggers@kernel.org,
	tytso@mit.edu, roberto.sassu@huaweicloud.com, kpsingh@kernel.org,
	vadfed@meta.com
Subject: Re: [PATCH v12 bpf-next 1/9] bpf: Add __bpf_dynptr_data* for in kernel use
Date: Mon, 6 Nov 2023 16:39:46 +0000	[thread overview]
Message-ID: <bc0a0262-31e3-404e-8e45-e1d09ab8ad29@linux.dev> (raw)
In-Reply-To: <20231104001313.3538201-2-song@kernel.org>

On 04/11/2023 00:13, Song Liu wrote:
> Different types of bpf dynptr have different internal data storage.
> Specifically, SKB and XDP type of dynptr may have non-continuous data.
> Therefore, it is not always safe to directly access dynptr->data.
> 
> Add __bpf_dynptr_data and __bpf_dynptr_data_rw to replace direct access to
> dynptr->data.
> 
> Update bpf_verify_pkcs7_signature to use __bpf_dynptr_data instead of
> dynptr->data.
> 
> Signed-off-by: Song Liu <song@kernel.org>
> ---
>   include/linux/bpf.h      |  2 ++
>   kernel/bpf/helpers.c     | 47 ++++++++++++++++++++++++++++++++++++++++
>   kernel/trace/bpf_trace.c | 12 ++++++----
>   3 files changed, 57 insertions(+), 4 deletions(-)
> 
> diff --git a/include/linux/bpf.h b/include/linux/bpf.h
> index b4825d3cdb29..eb84caf133df 100644
> --- a/include/linux/bpf.h
> +++ b/include/linux/bpf.h
> @@ -1222,6 +1222,8 @@ enum bpf_dynptr_type {
>   
>   int bpf_dynptr_check_size(u32 size);
>   u32 __bpf_dynptr_size(const struct bpf_dynptr_kern *ptr);
> +const void *__bpf_dynptr_data(const struct bpf_dynptr_kern *ptr, u32 len);
> +void *__bpf_dynptr_data_rw(const struct bpf_dynptr_kern *ptr, u32 len);
>   
>   #ifdef CONFIG_BPF_JIT
>   int bpf_trampoline_link_prog(struct bpf_tramp_link *link, struct bpf_trampoline *tr);
> diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
> index e46ac288a108..c569c4c43bde 100644
> --- a/kernel/bpf/helpers.c
> +++ b/kernel/bpf/helpers.c
> @@ -2611,3 +2611,50 @@ static int __init kfunc_init(void)
>   }
>   
>   late_initcall(kfunc_init);
> +
> +/* Get a pointer to dynptr data up to len bytes for read only access. If
> + * the dynptr doesn't have continuous data up to len bytes, return NULL.
> + */
> +const void *__bpf_dynptr_data(const struct bpf_dynptr_kern *ptr, u32 len)
> +{
> +	enum bpf_dynptr_type type;
> +	int err;
> +
> +	if (!ptr->data)
> +		return NULL;
> +
> +	err = bpf_dynptr_check_off_len(ptr, 0, len);
> +	if (err)
> +		return NULL;
> +	type = bpf_dynptr_get_type(ptr);
> +
> +	switch (type) {
> +	case BPF_DYNPTR_TYPE_LOCAL:
> +	case BPF_DYNPTR_TYPE_RINGBUF:
> +		return ptr->data + ptr->offset;
> +	case BPF_DYNPTR_TYPE_SKB:
> +		return skb_pointer_if_linear(ptr->data, ptr->offset, len);
> +	case BPF_DYNPTR_TYPE_XDP:
> +	{
> +		void *xdp_ptr = bpf_xdp_pointer(ptr->data, ptr->offset, len);
> +
> +		if (IS_ERR_OR_NULL(xdp_ptr))
> +			return NULL;
> +		return xdp_ptr;
> +	}
> +	default:
> +		WARN_ONCE(true, "unknown dynptr type %d\n", type);
> +		return NULL;
> +	}
> +}
> +
> +/* Get a pointer to dynptr data up to len bytes for read write access. If
> + * the dynptr doesn't have continuous data up to len bytes, or the dynptr
> + * is read only, return NULL.
> + */
> +void *__bpf_dynptr_data_rw(const struct bpf_dynptr_kern *ptr, u32 len)
> +{
> +	if (__bpf_dynptr_is_rdonly(ptr))
> +		return NULL;
> +	return (void *)__bpf_dynptr_data(ptr, len);
> +}
> diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
> index df697c74d519..d525a22b8d56 100644
> --- a/kernel/trace/bpf_trace.c
> +++ b/kernel/trace/bpf_trace.c
> @@ -1378,6 +1378,8 @@ __bpf_kfunc int bpf_verify_pkcs7_signature(struct bpf_dynptr_kern *data_ptr,
>   			       struct bpf_dynptr_kern *sig_ptr,
>   			       struct bpf_key *trusted_keyring)
>   {
> +	const void *data, *sig;
> +	u32 data_len, sig_len;
>   	int ret;
>   
>   	if (trusted_keyring->has_ref) {
> @@ -1394,10 +1396,12 @@ __bpf_kfunc int bpf_verify_pkcs7_signature(struct bpf_dynptr_kern *data_ptr,
>   			return ret;
>   	}
>   
> -	return verify_pkcs7_signature(data_ptr->data,
> -				      __bpf_dynptr_size(data_ptr),
> -				      sig_ptr->data,
> -				      __bpf_dynptr_size(sig_ptr),
> +	data_len = __bpf_dynptr_size(data_ptr);
> +	data = __bpf_dynptr_data(data_ptr, data_len);
> +	sig_len = __bpf_dynptr_size(sig_ptr);
> +	sig = __bpf_dynptr_data(sig_ptr, sig_len);
> +
> +	return verify_pkcs7_signature(data, data_len, sig, sig_len,
>   				      trusted_keyring->key,
>   				      VERIFYING_UNSPECIFIED_SIGNATURE, NULL,
>   				      NULL);

Acked-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>

  reply	other threads:[~2023-11-06 16:39 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-04  0:13 [PATCH v12 bpf-next 0/9] bpf: File verification with LSM and fsverity Song Liu
2023-11-04  0:13 ` [PATCH v12 bpf-next 1/9] bpf: Add __bpf_dynptr_data* for in kernel use Song Liu
2023-11-06 16:39   ` Vadim Fedorenko [this message]
2023-11-06 21:07   ` Andrii Nakryiko
2023-11-06 22:00     ` Song Liu
2023-11-06 22:40       ` Andrii Nakryiko
2023-11-04  0:13 ` [PATCH v12 bpf-next 2/9] bpf: Factor out helper check_reg_const_str() Song Liu
2023-11-06 16:40   ` Vadim Fedorenko
2023-11-04  0:13 ` [PATCH v12 bpf-next 3/9] bpf: Introduce KF_ARG_PTR_TO_CONST_STR Song Liu
2023-11-06 16:43   ` Vadim Fedorenko
2023-11-04  0:13 ` [PATCH v12 bpf-next 4/9] bpf: Add kfunc bpf_get_file_xattr Song Liu
2023-11-04  9:11   ` Alexei Starovoitov
2023-11-04 14:20     ` Song Liu
2023-11-04  0:13 ` [PATCH v12 bpf-next 5/9] bpf, fsverity: Add kfunc bpf_get_fsverity_digest Song Liu
2023-11-04  0:13 ` [PATCH v12 bpf-next 6/9] Documentation/bpf: Add documentation for filesystem kfuncs Song Liu
2023-11-04  0:13 ` [PATCH v12 bpf-next 7/9] selftests/bpf: Sort config in alphabetic order Song Liu
2023-11-04  0:13 ` [PATCH v12 bpf-next 8/9] selftests/bpf: Add tests for filesystem kfuncs Song Liu
2023-11-04  0:13 ` [PATCH v12 bpf-next 9/9] selftests/bpf: Add test that uses fsverity and xattr to sign a file Song Liu
     [not found] ` <CAADnVQLZ7RkH2ykEohFdDLJkjhmizHUuBakoevjEwvxOFMFjBw@mail.gmail.com>
2023-11-04 14:05   ` [PATCH v12 bpf-next 0/9] bpf: File verification with LSM and fsverity Song Liu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bc0a0262-31e3-404e-8e45-e1d09ab8ad29@linux.dev \
    --to=vadim.fedorenko@linux.dev \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=ebiggers@kernel.org \
    --cc=fsverity@lists.linux.dev \
    --cc=kernel-team@meta.com \
    --cc=kpsingh@kernel.org \
    --cc=martin.lau@kernel.org \
    --cc=roberto.sassu@huaweicloud.com \
    --cc=song@kernel.org \
    --cc=tytso@mit.edu \
    --cc=vadfed@meta.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.