Re: [PATCH] selinux: clean up cred usage and simplify

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

 



On Thu, 2016-12-15 at 16:10 -0500, Paul Moore wrote:
> On Fri, Dec 9, 2016 at 4:21 PM, Stephen Smalley <sds@xxxxxxxxxxxxx>
> wrote:
> > 
> > SELinux was sometimes using the task "objective" credentials when
> > it could/should use the "subjective" credentials.  This was
> > sometimes
> > hidden by the fact that we were unnecessarily passing around
> > pointers
> > to the current task, making it appear as if the task could be
> > something
> > other than current, so eliminate all such passing.  Given that
> > tasks may only alter their own credentials, we likely should move
> > the check from selinux_setprocattr() to security_setprocattr() or
> > even
> > to proc_pid_attr_write() and drop the task argument to the security
> > hook
> > altogether; it can only serve to confuse things.
> > 
> > Signed-off-by: Stephen Smalley <sds@xxxxxxxxxxxxx>
> > ---
> >  security/selinux/hooks.c | 154 +++++++++++++++++++++++----------
> > --------------
> >  1 file changed, 76 insertions(+), 78 deletions(-)
> 
> No substantial objections, just some style nit picks below.
> 
> > 
> > diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
> > index 8a90a0b..3f99480 100644
> > --- a/security/selinux/hooks.c
> > +++ b/security/selinux/hooks.c
> > @@ -1696,23 +1696,27 @@ static int cred_has_perm(const struct cred
> > *actor,
> >  }
> > 
> >  /*
> > - * Check permission between a pair of tasks, e.g. signal checks,
> > - * fork check, ptrace check, etc.
> > - * tsk1 is the actor and tsk2 is the target
> > - * - this uses the default subjective creds of tsk1
> > + * Check permission between a task and the current task.
> >   */
> > -static int task_has_perm(const struct task_struct *tsk1,
> > -                        const struct task_struct *tsk2,
> > -                        u32 perms)
> > +static int task_has_perm_to_current(const struct task_struct *tsk,
> > +                                   u32 perms)
> >  {
> > -       const struct task_security_struct *__tsec1, *__tsec2;
> > -       u32 sid1, sid2;
> > +       u32 ssid, tsid;
> > 
> > -       rcu_read_lock();
> > -       __tsec1 = __task_cred(tsk1)->security;  sid1 = __tsec1-
> > >sid;
> > -       __tsec2 = __task_cred(tsk2)->security;  sid2 = __tsec2-
> > >sid;
> > -       rcu_read_unlock();
> > -       return avc_has_perm(sid1, sid2, SECCLASS_PROCESS, perms,
> > NULL);
> > +       ssid = task_sid(tsk);
> > +       tsid = current_sid();
> > +       return avc_has_perm(ssid, tsid, SECCLASS_PROCESS, perms,
> > NULL);
> > +}
> 
> Why not just get rid of both ssid and tsid and turn this into a one
> line function?
> 
>   avc_has_perm(task_sid(tsk), current_sid(), ...);
> 
> > 
> > +/*
> > + * Check permission between current and itself.
> > + */
> > +static int self_has_perm(u32 perms)
> > +{
> > +       u32 sid;
> > +
> > +       sid = current_sid();
> 
> Nit picky, but if you're respining the patch for the above, why not
> change this too ...
> 
>   u32 sid = current_sid();
> 
> > 
> > +       return avc_has_perm(sid, sid, SECCLASS_PROCESS, perms,
> > NULL);
> >  }
> > 
> >  /*
> > @@ -1772,13 +1776,10 @@ static int cred_has_capability(const struct
> > cred *cred,
> >         return rc;
> >  }
> > 
> > -/* Check whether a task is allowed to use a system operation. */
> > -static int task_has_system(struct task_struct *tsk,
> > -                          u32 perms)
> > +/* Check whether the current task is allowed to use a system
> > operation. */
> > +static int current_has_system(u32 perms)
> 
> We should have a little more naming consistentcy between
> current_has_system() and self_has_perm().  Something like
> current_has_process/current_has_system,
> self_has_process/self_has_system, or something else along the lines
> ... I think you get the idea.

Not sure how to improve upon it in a manner that is concise and clear.
At present, the patch splits the old task_has_perm() into
task_has_perm_to_current() vs self_has_perm() and renames
task_has_system() to current_has_system().  If I rename self_has_perm()
to current_has_process(), then it seems confusingly similar and
inconsistent with the existing current_has_perm(), which is unchanged
by this patch. If I instead rename current_has_system() to
self_has_system(), then that also seems confusing/inconsistent;
self_has_perm() indicates it is a current-self check, whereas
current_has_system() is a current-kernel:system check.  I could do that
but not sure it is an improvement.

The other option would be to inline them all since they are all quite
trivial now.
_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.




[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux