Re: [PATCH bpf-next v1 4/8] bpf: attribute __arg_untrusted for global function parameters

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 4 Jul 2025 at 20:33, Eduard Zingerman <eddyz87@xxxxxxxxx> wrote:
>
> On Fri, 2025-07-04 at 11:28 -0700, Eduard Zingerman wrote:
> > On Fri, 2025-07-04 at 20:03 +0200, Kumar Kartikeya Dwivedi wrote:
> >
> > [...]
> >
> > > > @@ -7818,6 +7821,22 @@ int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog)
> > > >                         sub->args[i].btf_id = kern_type_id;
> > > >                         continue;
> > > >                 }
> > > > +               if (tags & ARG_TAG_UNTRUSTED) {
> > > > +                       int kern_type_id;
> > > > +
> > > > +                       if (tags & ~ARG_TAG_UNTRUSTED) {
> > > > +                               bpf_log(log, "arg#%d untrusted cannot be combined with any other tags\n", i);
> > > > +                               return -EINVAL;
> > > > +                       }
> > > > +
> > > > +                       kern_type_id = btf_get_ptr_to_btf_id(log, i, btf, t);
> > >
> > > So while this makes sense for trusted, I think for untrusted, we
> > > should allow types in program BTF as well.
> > > This is one of the things I think lacks in bpf_rdonly_cast as well, to
> > > be able to cast to types in program BTF.
> > > Say you want to reinterpret some kernel memory into your own type and
> > > access it using a struct in the program which is a different type.
> > > I think it makes sense to make this work.
> >
> > Hi Kumar,
> >
> > Thank you for the review.
> > Allowing local program BTF makes sense to me.
> > I assume we should first search in kernel BTF and fallback to program
> > BTF if nothing found. This way verifier might catch a program
> > accessing kernel data structure but having wrong assumptions about
> > field offsets (not using CO-RE). On the other hand, this might get
> > confusing if there is an accidental conflict between kernel data
> > structure name and program local data structure name.
>
> Maybe just add __arg_untrusted_local and avoid ambiguity?

That might be less ambiguous, sure. But I don't see why the fallback
would be confusing.
It might be nice if we can support it without asking users to learn
about the difference between the two tags, but if it's too ugly we can
go with explicit local tag.
A user can have a struct without preserve_access_index now and having
the same name as the kernel struct, and the program will load things
at potentially wrong offsets.
If the same type exists, the program would fail compilation in C due
to duplicate types.
Are there any other cases where it might be a footgun that you anticipate?

>
> > Supporting bpf_core_cast for both prog BTF and kernel BTF types is not
> > trivial because we cannot disambiguate local vs kernel types.
> > IIRC module BTF types probably don't work either but that's a different story.

> I can add bpf_rdonly_cast_local() as a followup, do you remember
> context in which you needed this?

Adding Matt.

Not long ago we were discussing iterating over the bpf linked list
since support doesn't exist in the kernel and it was safe in the
specific context to iterate over the list.
Ofcourse, we could add iteration support in the kernel, but another
approach would be the ability to subtract offset from node to arrive
at an untrusted pointer to type in prog BTF (that was allocated using
bpf_obj_new).
But bpf_core_cast didn't work there, so we ended up discarding that approach.
Not to get hung up on this specific example, but I think it would be
useful in general.




[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux