Messages in this thread | | | Subject | Re: [RFC PATCH] smack: fix access permissions for keyring | From | Casey Schaufler <> | Date | Tue, 27 Nov 2018 12:18:54 -0800 |
| |
On 10/17/2018 4:25 PM, Zoran Markovic wrote: > Function smack_key_permission() only issues smack requests for the > following operations: > - KEY_NEED_READ (issues MAY_READ) > - KEY_NEED_WRITE (issues MAY_WRITE) > - KEY_NEED_LINK (issues MAY_WRITE) > - KEY_NEED_SETATTR (issues MAY_WRITE) > A blank smack request is issued in all other cases, resulting in > smack access being granted if there is any rule defined between > subject and object, or denied with -EACCES otherwise. > > Request MAY_READ access for KEY_NEED_SEARCH and KEY_NEED_VIEW. > Fix the logic in the unlikely case when both MAY_READ and > MAY_WRITE are needed. Validate access permission field for valid > contents.
Do you have any test cases for this?
> Signed-off-by: Zoran Markovic <zmarkovic@sierrawireless.com> > Cc: Casey Schaufler <casey@schaufler-ca.com> > Cc: James Morris <jmorris@namei.org> > Cc: "Serge E. Hallyn" <serge@hallyn.com> > --- > security/smack/smack_lsm.c | 12 +++++++++--- > 1 file changed, 9 insertions(+), 3 deletions(-) > > diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c > index 340fc30..77e405f 100644 > --- a/security/smack/smack_lsm.c > +++ b/security/smack/smack_lsm.c > @@ -4326,6 +4326,12 @@ static int smack_key_permission(key_ref_t key_ref, > int request = 0; > int rc; > > + /* > + * Validate requested permissions > + */ > + if (perm & ~KEY_NEED_ALL) > + return -EINVAL; > + > keyp = key_ref_to_ptr(key_ref); > if (keyp == NULL) > return -EINVAL; > @@ -4349,10 +4355,10 @@ static int smack_key_permission(key_ref_t key_ref, > ad.a.u.key_struct.key = keyp->serial; > ad.a.u.key_struct.key_desc = keyp->description; > #endif > - if (perm & KEY_NEED_READ) > - request = MAY_READ; > + if (perm & (KEY_NEED_READ | KEY_NEED_SEARCH | KEY_NEED_VIEW)) > + request |= MAY_READ; > if (perm & (KEY_NEED_WRITE | KEY_NEED_LINK | KEY_NEED_SETATTR)) > - request = MAY_WRITE; > + request |= MAY_WRITE; > rc = smk_access(tkp, keyp->security, request, &ad); > rc = smk_bu_note("key access", tkp, keyp->security, request, rc); > return rc;
| |