From: Yonghong Song <yonghong.song@linux.dev>
To: sashiko-reviews@lists.linux.dev
Cc: bpf@vger.kernel.org
Subject: Re: [PATCH bpf-next v4 05/25] bpf: Support stack arguments for bpf functions
Date: Thu, 14 May 2026 09:07:34 -0700 [thread overview]
Message-ID: <9797c09e-432b-4ff6-81a7-9ca44571ff8b@linux.dev> (raw)
In-Reply-To: <20260514104638.BD792C2BCB3@smtp.kernel.org>
On 5/14/26 12:46 PM, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Critical] Bypass of caller stack argument initialization checks allows NULL pointer dereferences and out-of-bounds heap reads, leading to verifier crashes or privilege escalation.
> --
>
> commit 64c850bac22b15ca90af1ba361a4d764104b6ffb
> Author: Yonghong Song <yonghong.song@linux.dev>
>
> bpf: Support stack arguments for bpf functions
>
> This commit allows the compiler to pass additional arguments via a dedicated
> stack area through the BPF_REG_PARAMS (r11) register. It tracks outgoing stack
> arguments and introduces bounds checks for stack arguments in BPF subprograms.
>
>> diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
>> index 3bafb7ad2ba71..69965d2c5fdd5 100644
>> --- a/kernel/bpf/verifier.c
>> +++ b/kernel/bpf/verifier.c
>> @@ -4050,6 +4080,103 @@ static int check_stack_write(struct bpf_verifier_env *env,
>> return err;
>> }
>>
>> +/*
>> + * Read a value from the incoming stack arg area.
>> + * off is a positive offset from r11 (e.g. +8 for arg6, +16 for arg7).
>> + */
>> +static int check_stack_arg_read(struct bpf_verifier_env *env, struct bpf_func_state *state,
>> + int off, int dst_regno)
>> +{
>> + struct bpf_subprog_info *subprog = &env->subprog_info[state->subprogno];
>> + struct bpf_verifier_state *vstate = env->cur_state;
>> + int spi = off / BPF_REG_SIZE - 1;
>> + struct bpf_func_state *caller, *cur;
>> + struct bpf_reg_state *arg;
>> +
>> + if (state->no_stack_arg_load) {
>> + verbose(env, "r11 load must be before any r11 store or call insn\n");
>> + return -EINVAL;
>> + }
>> +
>> + if (spi + 1 > bpf_in_stack_arg_cnt(subprog)) {
>> + verbose(env, "invalid read from stack arg off %d depth %d\n",
>> + off, bpf_in_stack_arg_cnt(subprog) * BPF_REG_SIZE);
>> + return -EACCES;
>> + }
>> +
>> + caller = vstate->frame[vstate->curframe - 1];
>> + arg = &caller->stack_arg_regs[spi];
> Could this lead to an out-of-bounds read or a NULL pointer dereference?
>
> If check_outgoing_stack_args() is skipped (e.g. due to an error in
> btf_prepare_func_args()), caller->stack_arg_regs might be NULL or smaller
> than spi. Since check_func_call() or push_callback_call() can ignore
> btf_check_func_arg_match() failures for static subprograms or callbacks,
> the callee can still execute.
>
> If sub->arg_cnt was updated before the failure, bpf_in_stack_arg_cnt(subprog)
> would be greater than 0, allowing this check to pass and potentially accessing
> unallocated memory.
Yes, it is possible for an out-of-bound read or a NULL pointer dereference.
This can be reproduced with inline asm where the caller does not have
any outgoing stack arguments but callee has incoming stack arguments.
Will fix.
>
> [ ... ]
>
>> @@ -8922,6 +9078,7 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env, int subprog,
>> struct bpf_reg_state *regs)
>> {
>> struct bpf_subprog_info *sub = subprog_info(env, subprog);
>> + struct bpf_func_state *caller = cur_func(env);
>> struct bpf_verifier_log *log = &env->log;
>> u32 i;
>> int ret;
>> @@ -8930,13 +9087,16 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env, int subprog,
>> if (ret)
>> return ret;
>>
>> + ret = check_outgoing_stack_args(env, caller, sub->arg_cnt);
>> + if (ret)
>> + return ret;
>> +
> Is it possible for btf_prepare_func_args() to return an error after modifying
> sub->arg_cnt?
>
> For instance, if a BTF tag is unsupported in a static subprogram,
> btf_prepare_func_args() will return an error after already assigning
> sub->arg_cnt. This skips check_outgoing_stack_args(), which is responsible
> for verifying that the caller actually allocated and initialized
> caller->stack_arg_regs. This could lead to the unverified memory access
> mentioned above.
>
next prev parent reply other threads:[~2026-05-14 16:07 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-13 4:49 [PATCH bpf-next v4 00/25] bpf: Support stack arguments for BPF functions and kfuncs Yonghong Song
2026-05-13 4:49 ` [PATCH bpf-next v4 01/25] bpf: Convert bpf_get_spilled_reg macro to static inline function Yonghong Song
2026-05-13 4:50 ` [PATCH bpf-next v4 02/25] bpf: Remove copy_register_state wrapper function Yonghong Song
2026-05-13 4:50 ` [PATCH bpf-next v4 03/25] bpf: Add helper functions for r11-based stack argument insns Yonghong Song
2026-05-13 4:50 ` [PATCH bpf-next v4 04/25] bpf: Set sub->arg_cnt earlier in btf_prepare_func_args() Yonghong Song
2026-05-13 4:50 ` [PATCH bpf-next v4 05/25] bpf: Support stack arguments for bpf functions Yonghong Song
2026-05-14 10:46 ` sashiko-bot
2026-05-14 16:07 ` Yonghong Song [this message]
2026-05-13 4:50 ` [PATCH bpf-next v4 06/25] bpf: Refactor jmp history to use dedicated spi/frame fields Yonghong Song
2026-05-13 4:50 ` [PATCH bpf-next v4 07/25] bpf: Add precision marking and backtracking for stack argument slots Yonghong Song
2026-05-13 5:44 ` bot+bpf-ci
2026-05-13 4:50 ` [PATCH bpf-next v4 08/25] bpf: Refactor record_call_access() to extract per-arg logic Yonghong Song
2026-05-13 4:50 ` [PATCH bpf-next v4 09/25] bpf: Use arg_is_fp() in has_fp_args() Yonghong Song
2026-05-13 4:50 ` [PATCH bpf-next v4 10/25] bpf: Extend liveness analysis to track stack argument slots Yonghong Song
2026-05-13 5:44 ` bot+bpf-ci
2026-05-13 4:50 ` [PATCH bpf-next v4 11/25] bpf: Reject stack arguments in non-JITed programs Yonghong Song
2026-05-13 5:33 ` bot+bpf-ci
2026-05-13 4:50 ` [PATCH bpf-next v4 12/25] bpf: Prepare architecture JIT support for stack arguments Yonghong Song
2026-05-13 5:33 ` bot+bpf-ci
2026-05-13 4:50 ` [PATCH bpf-next v4 13/25] bpf: Enable r11 based insns Yonghong Song
2026-05-13 4:51 ` [PATCH bpf-next v4 14/25] bpf: Support stack arguments for kfunc calls Yonghong Song
2026-05-13 4:51 ` [PATCH bpf-next v4 15/25] bpf: Reject stack arguments if tail call reachable Yonghong Song
2026-05-13 5:33 ` bot+bpf-ci
2026-05-13 4:51 ` [PATCH bpf-next v4 16/25] bpf: Disable private stack for x86_64 if stack arguments used Yonghong Song
2026-05-13 5:33 ` bot+bpf-ci
2026-05-13 4:51 ` [PATCH bpf-next v4 17/25] bpf,x86: Implement JIT support for stack arguments Yonghong Song
2026-05-13 4:51 ` [PATCH bpf-next v4 18/25] selftests/bpf: Add tests for BPF function " Yonghong Song
2026-05-13 4:51 ` [PATCH bpf-next v4 19/25] selftests/bpf: Add tests for stack argument validation Yonghong Song
2026-05-13 4:51 ` [PATCH bpf-next v4 20/25] selftests/bpf: Add BTF fixup for __naked subprog parameter names Yonghong Song
2026-05-13 4:51 ` [PATCH bpf-next v4 21/25] selftests/bpf: Add verifier tests for stack argument validation Yonghong Song
2026-05-13 4:51 ` [PATCH bpf-next v4 22/25] selftests/bpf: Add precision backtracking test for stack arguments Yonghong Song
2026-05-13 4:51 ` [PATCH bpf-next v4 23/25] bpf, arm64: Map BPF_REG_0 to x8 instead of x7 Yonghong Song
2026-05-13 4:51 ` [PATCH bpf-next v4 24/25] bpf, arm64: Add JIT support for stack arguments Yonghong Song
2026-05-13 4:52 ` [PATCH bpf-next v4 25/25] selftests/bpf: Enable stack argument tests for arm64 Yonghong Song
2026-05-13 16:33 ` [PATCH bpf-next v4 00/25] bpf: Support stack arguments for BPF functions and kfuncs Alexei Starovoitov
2026-05-13 17:41 ` Yonghong Song
2026-05-13 17:51 ` Alexei Starovoitov
2026-05-13 18:11 ` Yonghong Song
2026-05-13 16:40 ` 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=9797c09e-432b-4ff6-81a7-9ca44571ff8b@linux.dev \
--to=yonghong.song@linux.dev \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox