Re: [PATCH v3] add group restriction bitmap

stsp
2024-10-01T15:36:05Z

Вторник, 1 октября 2024 г получено от Oleg Nesterov:
> We can't understand each other. I guess I missed something...
>
> On 10/01, stsp wrote:
> >
> > 01.10.2024 16:02, Oleg Nesterov пишет:
> > >On 10/01, stsp wrote:
> > >>01.10.2024 14:15, Oleg Nesterov пишет:
> > >>>Suppose we change groups_search()
> > >>>
> > >>> --- a/kernel/groups.c
> > >>> +++ b/kernel/groups.c
> > >>> @@ -104,8 +104,11 @@ int groups_search(const struct group_info *group_info, kgid_t grp)
> > >>> left = mid + 1;
> > >>> else if (gid_lt(grp, group_info->gid[mid]))
> > >>> right = mid;
> > >>> - else
> > >>> - return 1;
> > >>> + else {
> > >>> + bool r = mid < BITS_PER_LONG &&
> > >>> + test_bit(mid, &group_info->restrict_bitmap);
> > >>> + return r ? -1 : 1;
> > >>> + }
> > >>> }
> > >>> return 0;
> > >>> }
> > >>>
> > >>>so that it returns, say, -1 if the found grp is restricted.
> > >>>
> > >>>Then everything else can be greatly simplified, afaics...
> > >>This will mean updating all callers
> > >>of groups_search(), in_group_p(),
> > >>in_egroup_p(), vfsxx_in_group_p()
> > >Why? I think with this change you do not need to touch in_group_p/etc at all.
> > >
> > >>if in_group_p() returns -1 for not found
> > >>and 0 for gid,
> > >With the the change above in_group_p() returns 0 if not found, !0 otherwise.
> > >It returns -1 if grp != cred->fsgid and the found grp is restricted.
> >
> > in_group_p() doesn't check if the
> > group is restricted or not.
>
> And it shouldn't. It returns the result of groups_search() if this
> grp is supplementary or "not found".
>
> > acl_permission_check() does, but
> > in your example it doesn't as well.
>
> But it does??? see below...
>
> > I think you mean to move the
> > restrict_bitmap check upwards to
> > in_group_p()?
>
> No, I meant to move the restrict_bitmap check to groups_search(), see the patch
> above.

Ah, I see now!
Sorry.
I didn't expect to move that check
that far, so I thought you mean just
make groups_search() 0-based and
-1 if not found... even if you said
otherwise.

Yes, -1 when found but restricted
is the very interesting simplification!
Will send an update.
Thanks.

>
> > Anyway, suppose you don't mean that.
> > In this case:
> > 1. in_group_p() and in_egroup_p()
> > should be changed:
> > - int retval = 1;
> > + int retval = -1;
>
> Why? -1 means that the grp is supplementary and restricted.
>
> > There are also the callers of groups_search()
> > in kernel/auditsc.c and they should
> > be updated.
>
> Why? I don't think so. audit_filter_rules() uses the result of groups_search()
> as a boolean.
>
> > >So acl_permission_check() can simply do
> > >
> > > if (mask & (mode ^ (mode >> 3))) {
> > > vfsgid_t vfsgid = i_gid_into_vfsgid(idmap, inode);
> > > int xxx = vfsgid_in_group_p(vfsgid);
> > >
> > > if (xxx) {
> > > if (mask & ~(mode >> 3))
> > > return -EACCES;
> > > if (xxx > 0)
> > > return 0;
> > > /* If we hit restrict_bitmap, then check Others. */
> > > }
> > > }
> >
> > Well, in my impl it should check
> > the bitmap right here, but you removed
> > that.
>
> No, I didn't remove the check, this code relies on the change in
> groups_search(). Note the "xxx > 0" check.
>
> I must have missed something :/
>
> Oleg.
>
>