From: Ihor Solodrai <ihor.solodrai@linux.dev>
To: Alexei Starovoitov <ast@kernel.org>,
Andrii Nakryiko <andrii@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Eduard Zingerman <eddyz87@gmail.com>,
Kumar Kartikeya Dwivedi <memxor@gmail.com>
Cc: Amery Hung <ameryhung@gmail.com>,
Emil Tsalapatis <emil@etsalapatis.com>,
Nicholas Carlini <npc@anthropic.com>,
bpf@vger.kernel.org, linux-kernel@vger.kernel.org,
kernel-team@meta.com
Subject: [PATCH bpf-next v1 0/6] bpf: Scope callback arguments to their frame
Date: Mon, 21 Sep 2026 18:03:27 -0700 [thread overview]
Message-ID: <20260922010333.1226537-1-ihor.solodrai@linux.dev> (raw)
A callback-calling helper or kfunc can pass its callback a pointer
that is only valid for the duration of the call, and the verifier has
no way to express that.
Two helpers need fixing:
* bpf_user_ringbuf_drain() passes a CONST_PTR_TO_DYNPTR over a
sample it releases as soon as the callback returns. When parked in
callback_ctx, that register describes reused kernel stack and
gives the program an arbitrary kernel read and write (bpf-next
only, see patch #2).
* bpf_for_each_map_elem() over an (percpu-) array map passes the
address of a u32 held in bpf_for_each_array_elem()'s own frame,
leaking four bytes of kernel stack.
Neither has a local fix: both arguments point into a helper's own
frame, with nothing longer-lived to anchor them to.
Introduce REF_TYPE_FRAME for this use case: a reference owned by a
callee frame, dropped when the frame is popped. Then use this
mechanism in both bpf_user_ringbuf_drain() and bpf_for_each_map_elem()
callee state setup.
---
The series is composed as follows:
* patch #1 implements REF_TYPE_FRAME and relevant infra code, but
it's not used yet
* patches #2 and #5 use the new mark_frame_scoped_arg() helper
* patch #3 adds relevant diagnostics
* patches #4 and #6 add selftests to cover the changes
---
Ihor Solodrai (6):
bpf: Introduce REF_TYPE_FRAME in the verifier
bpf: Scope the bpf_user_ringbuf_drain() dynptr to its callback frame
bpf: Name the callback in frame-release diagnostics
selftests/bpf: Cover the user ringbuf callback dynptr lifetime
bpf: Scope the bpf_for_each_map_elem() array key to the callback frame
selftests/bpf: Cover callback-frame map key lifetime
include/linux/bpf.h | 1 +
include/linux/bpf_verifier.h | 11 +-
kernel/bpf/arraymap.c | 18 ++-
kernel/bpf/diagnostics.c | 3 +
kernel/bpf/diagnostics.h | 1 +
kernel/bpf/states.c | 4 +
kernel/bpf/verifier.c | 149 +++++++++++++++---
.../selftests/bpf/prog_tests/cb_refs.c | 4 +-
.../selftests/bpf/progs/exceptions_fail.c | 20 +++
.../selftests/bpf/progs/user_ringbuf_fail.c | 143 +++++++++++++++++
.../bpf/progs/verifier_iterating_callbacks.c | 91 +++++++++++
11 files changed, 419 insertions(+), 26 deletions(-)
base-commit: 79dc258c9392051420a26f1504c647bd3d27c66a
--
2.55.0
next reply other threads:[~2026-09-22 1:03 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-22 1:03 Ihor Solodrai [this message]
2026-09-22 1:03 ` [PATCH bpf-next v1 1/6] bpf: Introduce REF_TYPE_FRAME in the verifier Ihor Solodrai
2026-09-22 2:01 ` bot+bpf-ci
2026-09-22 1:03 ` [PATCH bpf-next v1 2/6] bpf: Scope the bpf_user_ringbuf_drain() dynptr to its callback frame Ihor Solodrai
2026-09-22 1:47 ` bot+bpf-ci
2026-09-22 1:03 ` [PATCH bpf-next v1 3/6] bpf: Name the callback in frame-release diagnostics Ihor Solodrai
2026-09-22 1:03 ` [PATCH bpf-next v1 4/6] selftests/bpf: Cover the user ringbuf callback dynptr lifetime Ihor Solodrai
2026-09-22 1:47 ` bot+bpf-ci
2026-09-22 1:03 ` [PATCH bpf-next v1 5/6] bpf: Scope the bpf_for_each_map_elem() array key to the callback frame Ihor Solodrai
2026-09-22 1:03 ` [PATCH bpf-next v1 6/6] selftests/bpf: Cover callback-frame map key lifetime Ihor Solodrai
2026-09-22 1:47 ` bot+bpf-ci
2026-09-22 1:55 ` [PATCH bpf-next v1 0/6] bpf: Scope callback arguments to their frame Alexei Starovoitov
2026-09-22 2:15 ` Kumar Kartikeya Dwivedi
2026-09-22 6:13 ` Ihor Solodrai
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=20260922010333.1226537-1-ihor.solodrai@linux.dev \
--to=ihor.solodrai@linux.dev \
--cc=ameryhung@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=emil@etsalapatis.com \
--cc=kernel-team@meta.com \
--cc=linux-kernel@vger.kernel.org \
--cc=memxor@gmail.com \
--cc=npc@anthropic.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
all inboxes | Powered by JetHome®