From: Kumar Kartikeya Dwivedi <memxor@gmail.com>
To: Joanne Koong <joannelkoong@gmail.com>
Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com>,
bpf@vger.kernel.org, andrii@kernel.org, daniel@iogearbox.net,
ast@kernel.org, kafai@fb.com, kuba@kernel.org,
netdev@vger.kernel.org
Subject: Re: [PATCH bpf-next v4 1/3] bpf: Add skb dynptrs
Date: Fri, 26 Aug 2022 02:18:43 +0200 [thread overview]
Message-ID: <CAP01T74O6ZuH_NPObYTLUjFSADjWjzfHjTsLBf8b67jgchf6Gw@mail.gmail.com> (raw)
In-Reply-To: <CAJnrk1Y0r3++RLpT2jvp4st-79x3dUYk3uP-4tfnAeL5_kgM0Q@mail.gmail.com>
On Thu, 25 Aug 2022 at 23:02, Joanne Koong <joannelkoong@gmail.com> wrote:
> [...]
> >
> > Related question, it seems we know statically if dynptr is read only
> > or not, so why even do all this hidden parameter passing and instead
> > just reject writes directly? You only need to be able to set
> > MEM_RDONLY on dynptr_data returned PTR_TO_PACKETs, and reject
> > dynptr_write when dynptr type is xdp/skb (and ctx is only one). That
> > seems simpler than checking it at runtime. Verifier already handles
> > MEM_RDONLY generically, you only need to add the guard for
> > check_packet_acces (and check_helper_mem_access for meta->raw_mode
> > under pkt case), and rejecting dynptr_write seems like a if condition.
>
> There will be other helper functions that do writes (eg memcpy to
> dynptrs, strncpy to dynptrs, probe read user to dynptrs, hashing
> dynptrs, ...) so it's more scalable if we reject these at runtime
> rather than enforce these at the verifier level. I also think it's
> cleaner to keep the verifier logic as simple as possible and do the
> checking in the helper.
I won't be pushing this further, since you know what you plan to add
in the future better, but I still disagree.
I'm guessing there might be dynptrs where this read only property is
set dynamically at runtime, which is why you want to go this route?
I.e. you might not know statically whether dynptr is read only or not?
My main confusion is the inconsistency here.
Right now the patch implicitly relies on may_access_direct_pkt_data to
protect slices returned from dynptr_data, instead of setting
MEM_RDONLY on the returned PTR_TO_PACKET. Which is fine, it's not
needed. So indirectly, you are relying on knowing statically whether
the dynptr is read only or not. But then you also set this bit at
runtime.
So you reject some cases at load time, and the rest of them only at
runtime. Direct writes to dynptr slice fails load, writes through
helper does not (only fails at runtime).
Also, dynptr_data needs to know whether dynptr is read only
statically, to protect writes to its returned pointer, unless you
decide to introduce another helper for the dynamic rdonly bit case
(like dynptr_data_rdonly). Then you have a mismatch, where dynptr_data
works for some rdonly dynptrs (known to be rdonly statically, like
this skb one), but not for others.
I also don't agree about the complexity or scalability part, all the
infra and precedence is already there. We already have similar checks
for meta->raw_mode where we reject writes to read only pointers in
check_helper_mem_access.
next prev parent reply other threads:[~2022-08-26 0:19 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-22 23:56 [PATCH bpf-next v4 0/3] Add skb + xdp dynptrs Joanne Koong
2022-08-22 23:56 ` [PATCH bpf-next v4 1/3] bpf: Add skb dynptrs Joanne Koong
2022-08-23 23:22 ` kernel test robot
2022-08-23 23:53 ` kernel test robot
2022-08-24 18:27 ` Andrii Nakryiko
2022-08-24 23:25 ` Kumar Kartikeya Dwivedi
2022-08-25 21:02 ` Joanne Koong
2022-08-26 0:18 ` Kumar Kartikeya Dwivedi [this message]
2022-08-26 18:44 ` Joanne Koong
2022-08-26 18:51 ` Kumar Kartikeya Dwivedi
2022-08-26 19:49 ` Joanne Koong
2022-08-26 20:54 ` Kumar Kartikeya Dwivedi
2022-08-27 5:36 ` Andrii Nakryiko
2022-08-27 7:11 ` Kumar Kartikeya Dwivedi
2022-08-27 17:21 ` Andrii Nakryiko
2022-08-27 18:32 ` Kumar Kartikeya Dwivedi
2022-08-27 19:16 ` Kumar Kartikeya Dwivedi
2022-08-27 23:03 ` Andrii Nakryiko
2022-08-27 23:47 ` Kumar Kartikeya Dwivedi
2022-08-22 23:56 ` [PATCH bpf-next v4 2/3] bpf: Add xdp dynptrs Joanne Koong
2022-08-23 2:30 ` Kumar Kartikeya Dwivedi
2022-08-23 22:26 ` Joanne Koong
2022-08-24 10:39 ` Toke Høiland-Jørgensen
2022-08-24 18:10 ` Joanne Koong
2022-08-24 23:04 ` Kumar Kartikeya Dwivedi
2022-08-25 20:14 ` Joanne Koong
2022-08-25 21:53 ` Andrii Nakryiko
2022-08-26 6:37 ` Martin KaFai Lau
2022-08-26 6:50 ` Martin KaFai Lau
2022-08-26 19:09 ` Kumar Kartikeya Dwivedi
2022-08-26 20:47 ` Joanne Koong
2022-08-24 21:10 ` Kumar Kartikeya Dwivedi
2022-08-25 20:39 ` Joanne Koong
2022-08-25 23:18 ` Kumar Kartikeya Dwivedi
2022-08-26 18:23 ` Joanne Koong
2022-08-26 18:31 ` Kumar Kartikeya Dwivedi
2022-08-24 1:15 ` kernel test robot
2022-08-22 23:56 ` [PATCH bpf-next v4 3/3] selftests/bpf: tests for using dynptrs to parse skb and xdp buffers Joanne Koong
2022-08-24 18:47 ` Andrii Nakryiko
2022-08-23 2:31 ` [PATCH bpf-next v4 0/3] Add skb + xdp dynptrs Kumar Kartikeya Dwivedi
2022-08-23 18:52 ` Joanne Koong
2022-08-24 18:01 ` Andrii Nakryiko
2022-08-24 23:18 ` Kumar Kartikeya Dwivedi
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=CAP01T74O6ZuH_NPObYTLUjFSADjWjzfHjTsLBf8b67jgchf6Gw@mail.gmail.com \
--to=memxor@gmail.com \
--cc=andrii.nakryiko@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=joannelkoong@gmail.com \
--cc=kafai@fb.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
/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).