From: KaFai Wan <kafai.wan@linux.dev>
To: Brahmajit Das <listout@listout.xyz>
Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>,
syzbot+d36d5ae81e1b0a53ef58@syzkaller.appspotmail.com,
Andrii Nakryiko <andrii@kernel.org>,
Alexei Starovoitov <ast@kernel.org>, bpf <bpf@vger.kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Eduard <eddyz87@gmail.com>, Hao Luo <haoluo@google.com>,
John Fastabend <john.fastabend@gmail.com>,
Jiri Olsa <jolsa@kernel.org>, KP Singh <kpsingh@kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
Martin KaFai Lau <martin.lau@linux.dev>,
Stanislav Fomichev <sdf@fomichev.me>, Song Liu <song@kernel.org>,
syzkaller-bugs <syzkaller-bugs@googlegroups.com>,
Yonghong Song <yonghong.song@linux.dev>
Subject: Re: [PATCH v2] bpf: fix NULL pointer dereference in print_reg_state()
Date: Fri, 26 Sep 2025 18:36:54 +0800 [thread overview]
Message-ID: <14a30aa593f8d8c018bf54439261a8f05182aa87.camel@linux.dev> (raw)
In-Reply-To: <5fjhzkvgvbpcm2vvqlxhgcobbkiwvo36aalj5lbqrfbznbpynf@jzokg4ba2mwp>
On Fri, 2025-09-26 at 06:34 +0530, Brahmajit Das wrote:
> On 25.09.2025 23:31, KaFai Wan wrote:
> > On Wed, 2025-09-24 at 23:58 +0530, Brahmajit Das wrote:
> > > On 25.09.2025 01:38, KaFai Wan wrote:
> > > > On Wed, 2025-09-24 at 21:10 +0530, Brahmajit Das wrote:
> > > > > On 24.09.2025 09:32, Alexei Starovoitov wrote:
> > > > > > On Wed, Sep 24, 2025 at 1:43 AM Brahmajit Das
> > > > > > <listout@listout.xyz>
> > > > > > wrote:
> > > > > > >
> > > > > > > Syzkaller reported a general protection fault due to a
> > > > > > > NULL
> > > > > > > pointer
> > > > > > > dereference in print_reg_state() when accessing reg-
> > > > > > > >map_ptr
> > > > > > > without
> > > > > > > checking if it is NULL.
> > > > > > >
> ...snip...
> > > >
> > > > Looks like we're getting somewhere.
> > > > It seems the verifier is not clearing reg->type.
> > > > adjust_scalar_min_max_vals() should be called on scalar types
> > > > only.
> > >
> > > Right, there is a check in check_alu_op
> > >
> > > if (is_pointer_value(env, insn->dst_reg)) {
> > > verbose(env, "R%d pointer arithmetic
> > > prohibited\n",
> > > insn->dst_reg);
> > > return -EACCES;
> > > }
> > >
> > > is_pointer_value calls __is_pointer_value which takes bool
> > > allow_ptr_leaks as the first argument. Now for some reason in
> > > this
> > > case
> > > allow_ptr_leaks is being passed as true, as a result
> > > __is_pointer_value
> > > (and in turn is_pointer_value) returns false when even when
> > > register
> > > type is CONST_PTR_TO_MAP.
> > >
> >
> > IIUC, `env->allow_ptr_leaks` set true means privileged mode (
> > CAP_PERFMON or CAP_SYS_ADMIN ), false for unprivileged mode.
> >
> >
> > We can use __is_pointer_value to check if the register type is a
> > pointer. For pointers, we check as before (before checking BPF_NEG
> > separately), and for scalars, it remains unchanged. Perhaps this
> > way we
> > can fix the error.
> >
> > if (opcode == BPF_NEG) {
> > if (__is_pointer_value(false, ®s[insn->dst_reg])) {
> > err = check_reg_arg(env, insn->dst_reg, DST_OP);
> > } else {
> > err = check_reg_arg(env, insn->dst_reg,
> > DST_OP_NO_MARK);
> > err = err ?: adjust_scalar_min_max_vals(env, insn,
> > ®s[insn-
> > >dst_reg],
> > regs[insn-
> > >dst_reg]);
> > }
> > } else {
> >
> >
> > --
> > Thanks,
> > KaFai
>
> Yep, that works.
>
Ok
> --- a/kernel/bpf/verifier.c
> +++ b/kernel/bpf/verifier.c
> @@ -15505,10 +15505,17 @@ static int check_alu_op(struct
> bpf_verifier_env *env, struct bpf_insn *insn)
>
> /* check dest operand */
> if (opcode == BPF_NEG) {
> - err = check_reg_arg(env, insn->dst_reg,
> DST_OP_NO_MARK);
> - err = err ?: adjust_scalar_min_max_vals(env,
> insn,
> - ®s[insn-
> >dst_reg],
> - regs[insn-
> >dst_reg]);
> + if (__is_pointer_value(false, ®s[insn-
> >dst_reg])) {
> + err = check_reg_arg(env, insn-
> >dst_reg, DST_OP);
> + } else {
> + err = check_reg_arg(env, insn-
> >dst_reg,
> + DST_OP_NO_MARK);
> + err = err ?:
> +
> adjust_scalar_min_max_vals(
> + env, insn,
> + ®s[insn-
> >dst_reg],
> + regs[insn-
> >dst_reg]);
> + }
> } else {
> err = check_reg_arg(env, insn->dst_reg,
> DST_OP);
> }
>
We can make code cleaner and change just one line for all.
if (opcode == BPF_NEG && !__is_pointer_value(false, ®s[insn-
>dst_reg])) {
err = check_reg_arg(env, insn->dst_reg, DST_OP_NO_MARK);
err = err ?: adjust_scalar_min_max_vals(env, insn,
®s[insn->dst_reg],
regs[insn->dst_reg]);
} else {
err = check_reg_arg(env, insn->dst_reg, DST_OP);
}
>
> I'll just wait for other developer or Alexei, in case they have any
> feedback before sending a v3.
>
You should add a Fixes label in the commit log and add selftest for it
in V3.
Fixes label is Fixes: aced132599b3 ("bpf: Add range tracking for
BPF_NEG")
For selftest you may check the test in verifier_value_illegal_alu.c and
other files.
The code in your next post would change the behavior of BPF_NEG and
BPF_END, you can run the selftest to check that.
The email I sent last time was rejected by the mail server because it
was in HTML format,sorry for that.
--
Thanks,
KaFai
next prev parent reply other threads:[~2025-09-26 10:37 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-23 9:02 [syzbot] [bpf?] general protection fault in print_reg_state syzbot
2025-09-23 16:41 ` [PATCH 1/1] bpf: fix NULL pointer dereference in print_reg_state() Brahmajit Das
2025-10-01 19:17 ` [PATCH v4 0/2] bpf: Fix verifier crash on BPF_NEG with pointer register Brahmajit Das
2025-10-01 19:17 ` [PATCH v4 1/2] bpf: Skip scalar adjustment for BPF_NEG if dst is a pointer Brahmajit Das
2025-10-01 19:32 ` Eduard Zingerman
2025-10-01 19:17 ` [PATCH v4 2/2] selftests/bpf: Add test for BPF_NEG alu on CONST_PTR_TO_MAP Brahmajit Das
2025-10-01 19:33 ` Eduard Zingerman
2025-10-01 21:10 ` [PATCH v4 0/2] bpf: Fix verifier crash on BPF_NEG with pointer register patchwork-bot+netdevbpf
2025-09-23 16:43 ` [PATCH 1/1] bpf: fix NULL pointer dereference in print_reg_state() Brahmajit Das
2025-09-23 18:52 ` Alexei Starovoitov
2025-09-23 17:10 ` Forwarded: [PATCH] " syzbot
2025-09-23 17:47 ` [PATCH v2] " Brahmajit Das
2025-09-24 7:32 ` Alexei Starovoitov
2025-09-24 9:09 ` Brahmajit Das
2025-09-24 15:40 ` Brahmajit Das
2025-09-24 17:28 ` Alexei Starovoitov
2025-09-24 17:38 ` KaFai Wan
2025-09-24 18:28 ` Brahmajit Das
2025-09-25 15:31 ` KaFai Wan
2025-09-26 1:04 ` Brahmajit Das
2025-09-26 1:56 ` Brahmajit Das
2025-09-26 10:36 ` KaFai Wan [this message]
2025-09-30 18:21 ` Brahmajit Das
2025-10-01 5:08 ` KaFai Wan
2025-09-29 18:23 ` [syzbot] [bpf?] general protection fault in print_reg_state syzbot
2025-10-01 9:56 ` [PATCH v3 0/2] bpf: Fix verifier crash on BPF_NEG with pointer register Brahmajit Das
2025-10-01 9:56 ` [PATCH v3 1/2] bpf: Skip scalar adjustment for BPF_NEG if dst is a pointer Brahmajit Das
2025-10-01 16:55 ` Alexei Starovoitov
2025-10-01 18:29 ` Eduard Zingerman
2025-10-01 18:49 ` Brahmajit Das
2025-10-01 18:54 ` Eduard Zingerman
2025-10-01 9:56 ` [PATCH v3 2/2] selftests/bpf: Add test for BPF_NEG alu on CONST_PTR_TO_MAP Brahmajit Das
2025-10-01 18:37 ` Eduard Zingerman
2025-10-01 18:40 ` [PATCH v3 0/2] bpf: Fix verifier crash on BPF_NEG with pointer register Eduard Zingerman
2025-10-01 19:28 ` [PATCH v4 " Brahmajit Das
2025-10-01 19:28 ` [PATCH v4 1/2] bpf: Skip scalar adjustment for BPF_NEG if dst is a pointer Brahmajit Das
2025-10-01 21:10 ` patchwork-bot+netdevbpf
2025-10-01 19:28 ` [PATCH v4 2/2] selftests/bpf: Add test for BPF_NEG alu on CONST_PTR_TO_MAP Brahmajit Das
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=14a30aa593f8d8c018bf54439261a8f05182aa87.camel@linux.dev \
--to=kafai.wan@linux.dev \
--cc=alexei.starovoitov@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=haoluo@google.com \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=kpsingh@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=listout@listout.xyz \
--cc=martin.lau@linux.dev \
--cc=sdf@fomichev.me \
--cc=song@kernel.org \
--cc=syzbot+d36d5ae81e1b0a53ef58@syzkaller.appspotmail.com \
--cc=syzkaller-bugs@googlegroups.com \
--cc=yonghong.song@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.