From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
To: Greg KH <gregkh@linuxfoundation.org>,
Jiri Kosina <jikos@kernel.org>,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Andrii Nakryiko <andrii@kernel.org>,
Martin KaFai Lau <kafai@fb.com>, Song Liu <songliubraving@fb.com>,
Yonghong Song <yhs@fb.com>,
Kumar Kartikeya Dwivedi <memxor@gmail.com>,
John Fastabend <john.fastabend@gmail.com>,
KP Singh <kpsingh@kernel.org>, Shuah Khan <shuah@kernel.org>,
Dave Marchevsky <davemarchevsky@fb.com>,
Joe Stringer <joe@cilium.io>, Jonathan Corbet <corbet@lwn.net>
Cc: Tero Kristo <tero.kristo@linux.intel.com>,
linux-kernel@vger.kernel.org, linux-input@vger.kernel.org,
netdev@vger.kernel.org, bpf@vger.kernel.org,
linux-kselftest@vger.kernel.org, linux-doc@vger.kernel.org,
Benjamin Tissoires <benjamin.tissoires@redhat.com>
Subject: [PATCH bpf-next v9 01/23] bpf/verifier: allow all functions to read user provided context
Date: Wed, 24 Aug 2022 15:40:31 +0200 [thread overview]
Message-ID: <20220824134055.1328882-2-benjamin.tissoires@redhat.com> (raw)
In-Reply-To: <20220824134055.1328882-1-benjamin.tissoires@redhat.com>
When a function was trying to access data from context in a syscall eBPF
program, the verifier was rejecting the call unless it was accessing the
first element.
This is because the syscall context is not known at compile time, and
so we need to check this when actually accessing it.
Check for the valid memory access if there is no convert_ctx callback,
and allow such situation to happen.
There is a slight hiccup with subprogs. btf_check_subprog_arg_match()
will check that the types are matching, which is a good thing, but to
have an accurate result, it hides the fact that the context register may
be null. This makes env->prog->aux->max_ctx_offset being set to the size
of the context, which is incompatible with a NULL context.
Solve that last problem by storing max_ctx_offset before the type check
and restoring it after.
Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
---
changes in v9:
- rewrote the commit title and description
- made it so all functions can make use of context even if there is
no convert_ctx
- remove the is_kfunc field in bpf_call_arg_meta
changes in v8:
- fixup comment
- return -EACCESS instead of -EINVAL for consistency
changes in v7:
- renamed access_t into atype
- allow zero-byte read
- check_mem_access() to the correct offset/size
new in v6
---
kernel/bpf/btf.c | 11 ++++++++++-
kernel/bpf/verifier.c | 19 +++++++++++++++++++
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
index 903719b89238..386300f52b23 100644
--- a/kernel/bpf/btf.c
+++ b/kernel/bpf/btf.c
@@ -6443,8 +6443,8 @@ int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog,
{
struct bpf_prog *prog = env->prog;
struct btf *btf = prog->aux->btf;
+ u32 btf_id, max_ctx_offset;
bool is_global;
- u32 btf_id;
int err;
if (!prog->aux->func_info)
@@ -6457,9 +6457,18 @@ int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog,
if (prog->aux->func_info_aux[subprog].unreliable)
return -EINVAL;
+ /* subprogs arguments are not actually accessing the data, we need
+ * to check for the types if they match.
+ * Store the max_ctx_offset and restore it after btf_check_func_arg_match()
+ * given that this function will have a side effect of changing it.
+ */
+ max_ctx_offset = env->prog->aux->max_ctx_offset;
+
is_global = prog->aux->func_info_aux[subprog].linkage == BTF_FUNC_GLOBAL;
err = btf_check_func_arg_match(env, btf, btf_id, regs, is_global, 0);
+ env->prog->aux->max_ctx_offset = max_ctx_offset;
+
/* Compiler optimizations can remove arguments from static functions
* or mismatched type can be passed into a global function.
* In such cases mark the function as unreliable from BTF point of view.
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 2c1f8069f7b7..d694f43ab911 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -5229,6 +5229,25 @@ static int check_helper_mem_access(struct bpf_verifier_env *env, int regno,
env,
regno, reg->off, access_size,
zero_size_allowed, ACCESS_HELPER, meta);
+ case PTR_TO_CTX:
+ /* in case the function doesn't know how to access the context,
+ * (because we are in a program of type SYSCALL for example), we
+ * can not statically check its size.
+ * Dynamically check it now.
+ */
+ if (!env->ops->convert_ctx_access) {
+ enum bpf_access_type atype = meta && meta->raw_mode ? BPF_WRITE : BPF_READ;
+ int offset = access_size - 1;
+
+ /* Allow zero-byte read from PTR_TO_CTX */
+ if (access_size == 0)
+ return zero_size_allowed ? 0 : -EACCES;
+
+ return check_mem_access(env, env->insn_idx, regno, offset, BPF_B,
+ atype, -1, false);
+ }
+
+ fallthrough;
default: /* scalar_value or invalid ptr */
/* Allow zero-byte read from NULL, regardless of pointer type */
if (zero_size_allowed && access_size == 0 &&
--
2.36.1
next prev parent reply other threads:[~2022-08-24 13:41 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-24 13:40 [PATCH bpf-next v9 00/23] Introduce eBPF support for HID devices Benjamin Tissoires
2022-08-24 13:40 ` Benjamin Tissoires [this message]
2022-08-26 1:41 ` [PATCH bpf-next v9 01/23] bpf/verifier: allow all functions to read user provided context Alexei Starovoitov
2022-08-26 1:50 ` Kumar Kartikeya Dwivedi
2022-08-30 14:29 ` Benjamin Tissoires
2022-08-31 16:37 ` Alexei Starovoitov
2022-08-31 17:56 ` Benjamin Tissoires
2022-09-01 4:15 ` Alexei Starovoitov
2022-09-01 16:47 ` Benjamin Tissoires
2022-09-02 3:50 ` Kumar Kartikeya Dwivedi
2022-09-02 13:11 ` Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 02/23] bpf/verifier: do not clear meta in check_mem_size Benjamin Tissoires
2022-08-26 1:54 ` Kumar Kartikeya Dwivedi
2022-08-30 13:51 ` Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 03/23] selftests/bpf: add test for accessing ctx from syscall program type Benjamin Tissoires
2022-08-26 2:07 ` Kumar Kartikeya Dwivedi
2022-08-24 13:40 ` [PATCH bpf-next v9 04/23] bpf/verifier: allow kfunc to return an allocated mem Benjamin Tissoires
2022-08-26 1:24 ` Kumar Kartikeya Dwivedi
2022-08-31 5:50 ` Benjamin Tissoires
2022-08-31 11:06 ` Kumar Kartikeya Dwivedi
2022-08-24 13:40 ` [PATCH bpf-next v9 05/23] selftests/bpf: Add tests for kfunc returning a memory pointer Benjamin Tissoires
2022-08-26 2:26 ` Kumar Kartikeya Dwivedi
2022-08-24 13:40 ` [PATCH bpf-next v9 06/23] bpf: prepare for more bpf syscall to be used from kernel and user space Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 07/23] libbpf: add map_get_fd_by_id and map_delete_elem in light skeleton Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 08/23] HID: core: store the unique system identifier in hid_device Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 09/23] HID: export hid_report_type to uapi Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 10/23] HID: convert defines of HID class requests into a proper enum Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 11/23] HID: Kconfig: split HID support and hid-core compilation Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 12/23] HID: initial BPF implementation Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 13/23] selftests/bpf: add tests for the HID-bpf initial implementation Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 14/23] HID: bpf: allocate data memory for device_event BPF programs Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 15/23] selftests/bpf/hid: add test to change the report size Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 16/23] HID: bpf: introduce hid_hw_request() Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 17/23] selftests/bpf: add tests for bpf_hid_hw_request Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 18/23] HID: bpf: allow to change the report descriptor Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 19/23] selftests/bpf: add report descriptor fixup tests Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 20/23] selftests/bpf: Add a test for BPF_F_INSERT_HEAD Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 21/23] samples/bpf: add new hid_mouse example Benjamin Tissoires
2022-08-24 19:30 ` Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 21/23] samples/bpf: HID: " Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 22/23] HID: bpf: add Surface Dial example Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 22/23] samples/bpf: HID: " Benjamin Tissoires
2022-08-24 13:40 ` [PATCH bpf-next v9 23/23] Documentation: add HID-BPF docs Benjamin Tissoires
2022-08-26 2:00 ` [PATCH bpf-next v9 00/23] Introduce eBPF support for HID devices patchwork-bot+netdevbpf
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=20220824134055.1328882-2-benjamin.tissoires@redhat.com \
--to=benjamin.tissoires@redhat.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=corbet@lwn.net \
--cc=daniel@iogearbox.net \
--cc=davemarchevsky@fb.com \
--cc=gregkh@linuxfoundation.org \
--cc=jikos@kernel.org \
--cc=joe@cilium.io \
--cc=john.fastabend@gmail.com \
--cc=kafai@fb.com \
--cc=kpsingh@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=memxor@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=shuah@kernel.org \
--cc=songliubraving@fb.com \
--cc=tero.kristo@linux.intel.com \
--cc=yhs@fb.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).