From: sashiko-bot@kernel.org
To: "Amery Hung" <ameryhung@gmail.com>
Cc: bpf@vger.kernel.org
Subject: Re: [PATCH bpf-next v2 07/18] bpf: Check fixed-size mem args of helpers and kfuncs the same way
Date: Fri, 24 Jul 2026 19:32:18 +0000 [thread overview]
Message-ID: <20260724193219.226651F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260724190813.1458271-8-ameryhung@gmail.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
Pre-existing issues:
- [Critical] An integer overflow in `check_mem_reg` when calculating the stack access size allows global subprograms to bypass memory bounds checks, leading to out-of-bounds kernel memory accesses.
- [Critical] Global subprograms unconditionally accept literal NULL scalars for non-nullable pointer arguments, potentially leading to a kernel crash due to NULL pointer dereferences.
--
--- Patch [7]: [PATCH bpf-next v2 07/18] bpf: Check fixed-size mem args of helpers and kfuncs the same way ---
commit 7f7a12884bb4c90a70c0a9e694af984eca478eee
Author: Amery Hung <ameryhung@gmail.com>
bpf: Check fixed-size mem args of helpers and kfuncs the same way
Fixed-size memory arguments went through two paths: helpers called
check_helper_mem_access() directly, while kfuncs and global subprogs
used check_mem_reg(). Route the helper MEM_FIXED_SIZE case through
check_mem_reg() too so all three share the same check.
This also fixes a bug in the helper path. When passing a NULL to
PTR_MAYBE_NULL | ARG_PTR_TO_FIXED_SIZE_MEM argument, the program would
be falsely rejected by check_helper_mem_access().
> diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
> index 2e56f726c12a8..4606294e444a8 100644
> --- a/kernel/bpf/verifier.c
> +++ b/kernel/bpf/verifier.c
> @@ -6965,10 +6968,12 @@ static int check_mem_reg(struct bpf_verifier_env *env, struct bpf_reg_state *reg
> mark_ptr_not_null_reg(reg);
> }
>
> - int size = base_type(reg->type) == PTR_TO_STACK ? -(int)mem_size : mem_size;
> + size = (!helper && base_type(reg->type) == PTR_TO_STACK) ? -(int)mem_size : mem_size;
[Severity: Critical]
This is a pre-existing issue, but does the -(int)mem_size cast introduce an
integer overflow risk for global subprograms?
If a user defines a BTF struct with a size close to U32_MAX (e.g. 0xFFFFFFFC),
-(int)mem_size evaluates to a small positive integer like 4.
The verifier would only validate this small 4-byte region on the caller's
stack, while the global subprogram is verified separately with a PTR_TO_MEM
of the original massive size.
Could this allow the subprogram to read and write out-of-bounds kernel memory
beyond the provided stack object?
>
> - err = check_helper_mem_access(env, reg, argno, size, BPF_READ, true, meta);
> - err = err ?: check_helper_mem_access(env, reg, argno, size, BPF_WRITE, true, meta);
> + if (access_type & BPF_READ)
> + err = check_helper_mem_access(env, reg, argno, size, BPF_READ, true, meta);
> + if (!err && (access_type & BPF_WRITE))
> + err = check_helper_mem_access(env, reg, argno, size, BPF_WRITE, true, meta);
[ ... ]
> @@ -9251,7 +9255,7 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env, int subprog,
> ret = check_func_arg_reg_off(env, reg, argno, ARG_DONTCARE);
> if (ret < 0)
> return ret;
> - if (check_mem_reg(env, reg, argno, arg->mem_size, NULL))
> + if (check_mem_reg(env, reg, argno, arg->mem_size, BPF_READ | BPF_WRITE, NULL))
> return -EINVAL;
> if (!(arg->arg_type & PTR_MAYBE_NULL) && (reg->type & PTR_MAYBE_NULL)) {
[Severity: Critical]
This isn't a bug introduced by this patch, but is it possible for global
subprograms to bypass nullability requirements here?
When check_mem_reg() is called just above this line, it returns 0 early for
literal NULL scalars:
kernel/bpf/verifier.c:check_mem_reg() {
if (bpf_register_is_null(reg))
return 0;
...
}
Because of this early return, the nullability check immediately following
check_mem_reg() in btf_check_func_arg_match() fails to catch the NULL.
The check relies on the PTR_MAYBE_NULL flag, which a literal NULL scalar
(SCALAR_VALUE) does not have.
Does this allow global subprograms to accept unvalidated NULL pointers
even for arguments not marked as nullable, leading to potential NULL
pointer dereferences?
> bpf_log(log, "%s is expected to be non-NULL\n",
> reg_arg_name(env, argno));
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260724190813.1458271-1-ameryhung@gmail.com?part=7
next prev parent reply other threads:[~2026-07-24 19:32 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-24 19:07 [PATCH bpf-next v2 00/18] Generate bpf_func_proto for kfunc Amery Hung
2026-07-24 19:07 ` [PATCH bpf-next v2 01/18] bpf: Drop process_timer_func wrappers Amery Hung
2026-07-25 1:39 ` Eduard Zingerman
2026-07-24 19:07 ` [PATCH bpf-next v2 02/18] bpf: Unify const map ptr argument checking for helpers and kfuncs Amery Hung
2026-07-24 19:28 ` sashiko-bot
2026-07-24 20:49 ` Amery Hung
2026-07-24 21:29 ` Kumar Kartikeya Dwivedi
2026-07-25 1:57 ` Eduard Zingerman
2026-07-24 19:07 ` [PATCH bpf-next v2 03/18] bpf: Split kfunc map argument into __const_map and __map Amery Hung
2026-07-24 19:07 ` [PATCH bpf-next v2 04/18] bpf: Pass kfunc meta to mem and mem_size check Amery Hung
2026-07-24 19:07 ` [PATCH bpf-next v2 05/18] bpf: Check helper and kfunc mem+size arguments identically Amery Hung
2026-07-24 19:08 ` [PATCH bpf-next v2 06/18] selftests/bpf: Add tests for helper and kfunc mem+size arguments Amery Hung
2026-07-24 19:25 ` sashiko-bot
2026-07-24 19:08 ` [PATCH bpf-next v2 07/18] bpf: Check fixed-size mem args of helpers and kfuncs the same way Amery Hung
2026-07-24 19:32 ` sashiko-bot [this message]
2026-07-24 20:39 ` Amery Hung
2026-07-24 19:08 ` [PATCH bpf-next v2 08/18] bpf: Express ARG_CONST_SIZE_OR_ZERO as ARG_CONST_SIZE | SCALAR_MAYBE_ZERO Amery Hung
2026-07-24 19:08 ` [PATCH bpf-next v2 09/18] bpf: Rename ARG_CONST_SIZE{,_OR_ZERO} to ARG_MEM_SIZE{,_OR_ZERO} Amery Hung
2026-07-24 19:08 ` [PATCH bpf-next v2 10/18] bpf: Fold __szk const size handling into the scalar arg path Amery Hung
2026-07-24 19:08 ` [PATCH bpf-next v2 11/18] bpf: Classify kfunc mem_size args from BTF without register state Amery Hung
2026-07-24 19:38 ` sashiko-bot
2026-07-24 22:52 ` Amery Hung
2026-07-24 19:08 ` [PATCH bpf-next v2 12/18] bpf: Handle NULL kfunc pointer args without a KF_ARG_PTR_TO_NULL type Amery Hung
2026-07-24 19:08 ` [PATCH bpf-next v2 13/18] bpf: Distinguish fixed- and variable-size kfunc mem args with MEM_FIXED_SIZE Amery Hung
2026-07-24 19:08 ` [PATCH bpf-next v2 14/18] bpf: Check helper mem+size in ARG_PTR_TO_MEM case Amery Hung
2026-07-24 19:47 ` sashiko-bot
2026-07-24 21:10 ` Amery Hung
2026-07-24 19:08 ` [PATCH bpf-next v2 15/18] bpf: Classify kfunc pointer arguments from BTF, resolve type against the register Amery Hung
2026-07-24 19:08 ` [PATCH bpf-next v2 16/18] bpf: Tag nullable kfunc pointer args with PTR_MAYBE_NULL Amery Hung
2026-07-24 19:38 ` sashiko-bot
2026-07-24 19:08 ` [PATCH bpf-next v2 17/18] bpf: Classify scalar kfunc arguments from BTF Amery Hung
2026-07-24 19:08 ` [PATCH bpf-next v2 18/18] bpf: Generate kfunc argument prototype at add-call time Amery Hung
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=20260724193219.226651F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=ameryhung@gmail.com \
--cc=bpf@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/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.