All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paul Moore <paul@paul-moore.com>
To: "Mickaël Salaün" <mic@digikod.net>
Cc: Casey Schaufler <casey@schaufler-ca.com>,
	linux-security-module@vger.kernel.org, jmorris@namei.org,
	serge@hallyn.com, keescook@chromium.org,
	john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp,
	stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org,
	linux-api@vger.kernel.org
Subject: Re: [PATCH v15 04/11] LSM: syscalls for current process attributes
Date: Thu, 5 Oct 2023 21:04:34 -0400	[thread overview]
Message-ID: <CAHC9VhT_ijmqo9ap-EokWHuALsMAqome2qcWgst3eRP6m+vbRA@mail.gmail.com> (raw)
In-Reply-To: <20231003.kooghohS2Aiz@digikod.net>

On Tue, Oct 3, 2023 at 10:09 AM Mickaël Salaün <mic@digikod.net> wrote:
> On Tue, Sep 12, 2023 at 01:56:49PM -0700, Casey Schaufler wrote:
> > Create a system call lsm_get_self_attr() to provide the security
> > module maintained attributes of the current process.
> > Create a system call lsm_set_self_attr() to set a security
> > module maintained attribute of the current process.
> > Historically these attributes have been exposed to user space via
> > entries in procfs under /proc/self/attr.
> >
> > The attribute value is provided in a lsm_ctx structure. The structure
> > identifies the size of the attribute, and the attribute value. The format
> > of the attribute value is defined by the security module. A flags field
> > is included for LSM specific information. It is currently unused and must
> > be 0. The total size of the data, including the lsm_ctx structure and any
> > padding, is maintained as well.
> >
> > struct lsm_ctx {
> >         __u64 id;
> >         __u64 flags;
> >         __u64 len;
> >         __u64 ctx_len;
> >         __u8 ctx[];
> > };
> >
> > Two new LSM hooks are used to interface with the LSMs.
> > security_getselfattr() collects the lsm_ctx values from the
> > LSMs that support the hook, accounting for space requirements.
> > security_setselfattr() identifies which LSM the attribute is
> > intended for and passes it along.
> >
> > Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
> > Reviewed-by: Kees Cook <keescook@chromium.org>
> > Reviewed-by: Serge Hallyn <serge@hallyn.com>
> > Reviewed-by: John Johansen <john.johansen@canonical.com>
> > ---
> >  Documentation/userspace-api/lsm.rst |  70 +++++++++++++
> >  include/linux/lsm_hook_defs.h       |   4 +
> >  include/linux/lsm_hooks.h           |   1 +
> >  include/linux/security.h            |  19 ++++
> >  include/linux/syscalls.h            |   5 +
> >  include/uapi/linux/lsm.h            |  36 +++++++
> >  kernel/sys_ni.c                     |   2 +
> >  security/Makefile                   |   1 +
> >  security/lsm_syscalls.c             |  57 +++++++++++
> >  security/security.c                 | 152 ++++++++++++++++++++++++++++
> >  10 files changed, 347 insertions(+)
> >  create mode 100644 Documentation/userspace-api/lsm.rst
> >  create mode 100644 security/lsm_syscalls.c

...

> > diff --git a/security/security.c b/security/security.c
> > index a3489c04b783..0d179750d964 100644
> > --- a/security/security.c
> > +++ b/security/security.c
> > @@ -3837,6 +3837,158 @@ void security_d_instantiate(struct dentry *dentry, struct inode *inode)
> >  }
> >  EXPORT_SYMBOL(security_d_instantiate);
> >
> > +/*
> > + * Please keep this in sync with it's counterpart in security/lsm_syscalls.c
> > + */
> > +
> > +/**
> > + * security_getselfattr - Read an LSM attribute of the current process.
> > + * @attr: which attribute to return
> > + * @uctx: the user-space destination for the information, or NULL
> > + * @size: pointer to the size of space available to receive the data
> > + * @flags: special handling options. LSM_FLAG_SINGLE indicates that only
> > + * attributes associated with the LSM identified in the passed @ctx be
> > + * reported.
> > + *
> > + * A NULL value for @uctx can be used to get both the number of attributes
> > + * and the size of the data.
> > + *
> > + * Returns the number of attributes found on success, negative value
> > + * on error. @size is reset to the total size of the data.
> > + * If @size is insufficient to contain the data -E2BIG is returned.
> > + */
> > +int security_getselfattr(unsigned int attr, struct lsm_ctx __user *uctx,
> > +                      size_t __user *size, u32 flags)
> > +{
> > +     struct security_hook_list *hp;
> > +     struct lsm_ctx lctx = { .id = LSM_ID_UNDEF, };
> > +     u8 __user *base = (u8 __user *)uctx;
> > +     size_t total = 0;
> > +     size_t entrysize;
> > +     size_t left;
> > +     bool toobig = false;
> > +     bool single = false;
> > +     int count = 0;
> > +     int rc;
> > +
> > +     if (attr == LSM_ATTR_UNDEF)
> > +             return -EINVAL;
> > +     if (size == NULL)
> > +             return -EINVAL;
> > +     if (get_user(left, size))
> > +             return -EFAULT;
> > +
> > +     if (flags) {
> > +             /*
> > +              * Only flag supported is LSM_FLAG_SINGLE
> > +              */
> > +             if (flags != LSM_FLAG_SINGLE)
> > +                     return -EINVAL;
> > +             if (uctx && copy_from_user(&lctx, uctx, sizeof(lctx)))
>
> I'm not sure if we should return -EINVAL or -EFAULT when uctx == NULL.
> Because uctx is optional (when LSM_FLAG_SINGLE is not set), I guess
> -EINVAL is OK.

That's a good point, we should probably the error codes here: if uctx
is NULL in the LSM_FLAG_SINGLE case we should return -EINVAL, if the
copy_from_user() fails we should return -EFAULT.

> > +                     return -EFAULT;
> > +             /*
> > +              * If the LSM ID isn't specified it is an error.
> > +              */
> > +             if (lctx.id == LSM_ID_UNDEF)
> > +                     return -EINVAL;
> > +             single = true;
> > +     }
> > +
> > +     /*
> > +      * In the usual case gather all the data from the LSMs.
> > +      * In the single case only get the data from the LSM specified.
> > +      */
> > +     hlist_for_each_entry(hp, &security_hook_heads.getselfattr, list) {
> > +             if (single && lctx.id != hp->lsmid->id)
> > +                     continue;
> > +             entrysize = left;
> > +             if (base)
> > +                     uctx = (struct lsm_ctx __user *)(base + total);
> > +             rc = hp->hook.getselfattr(attr, uctx, &entrysize, flags);
> > +             if (rc == -EOPNOTSUPP) {
> > +                     rc = 0;
> > +                     continue;
> > +             }
> > +             if (rc == -E2BIG) {
> > +                     toobig = true;
> > +                     left = 0;
> > +             } else if (rc < 0)
> > +                     return rc;
> > +             else
> > +                     left -= entrysize;
> > +
> > +             total += entrysize;
> > +             count += rc;
>
> There is a bug if rc == -E2BIG

Can you elaborate a bit more on this? Nothing is jumping out at me as
obviously broken... are you talking about @count becoming garbage due
to @rc being equal to -E2BIG?  If that is the case it should be okay
since we explicitly return -E2BIG, not @count, if @toobig is true.

> > +             if (single)
> > +                     break;
> > +     }
> > +     if (put_user(total, size))
> > +             return -EFAULT;
> > +     if (toobig)
> > +             return -E2BIG;
> > +     if (count == 0)
> > +             return LSM_RET_DEFAULT(getselfattr);
> > +     return count;
> > +}

-- 
paul-moore.com

  reply	other threads:[~2023-10-06  1:04 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20230912205658.3432-1-casey.ref@schaufler-ca.com>
2023-09-12 20:56 ` [PATCH v15 00/11] LSM: Three basic syscalls Casey Schaufler
2023-09-12 20:56   ` [PATCH v15 01/11] LSM: Identify modules by more than name Casey Schaufler
2023-09-15 11:32     ` Tetsuo Handa
2023-09-15 17:53       ` Casey Schaufler
2023-09-16  6:32         ` Tetsuo Handa
2023-09-17 16:38           ` Casey Schaufler
2023-09-20 10:20             ` Tetsuo Handa
2023-09-20 15:08               ` Kees Cook
2023-09-23  4:46                 ` Tetsuo Handa
2023-09-24  1:58                   ` Kees Cook
2023-09-24 11:06                     ` Tetsuo Handa
2023-09-24 19:48                       ` Kees Cook
2023-10-05 12:58     ` Tetsuo Handa
2023-10-20 19:52       ` Casey Schaufler
2023-10-21 12:20         ` Tetsuo Handa
2023-10-21 14:11           ` Casey Schaufler
2023-10-29 10:57             ` Tetsuo Handa
2023-10-29 18:00               ` Casey Schaufler
2023-09-12 20:56   ` [PATCH v15 02/11] LSM: Maintain a table of LSM attribute data Casey Schaufler
2023-09-12 20:56   ` [PATCH v15 03/11] proc: Use lsmids instead of lsm names for attrs Casey Schaufler
2023-09-12 20:56   ` [PATCH v15 04/11] LSM: syscalls for current process attributes Casey Schaufler
2023-10-03 14:09     ` Mickaël Salaün
2023-10-06  1:04       ` Paul Moore [this message]
2023-10-09 15:36         ` Mickaël Salaün
2023-10-09 16:04           ` Paul Moore
2023-10-10  9:14             ` Mickaël Salaün
2023-10-10 13:10               ` Paul Moore
2023-09-12 20:56   ` [PATCH v15 05/11] LSM: Create lsm_list_modules system call Casey Schaufler
2023-10-03 14:27     ` Mickaël Salaün
2024-03-12 10:16     ` Dmitry V. Levin
2024-03-12 13:25       ` Paul Moore
2024-03-12 15:27         ` Casey Schaufler
2024-03-12 17:06           ` Paul Moore
2024-03-12 17:44             ` Casey Schaufler
2024-03-12 18:09               ` Paul Moore
2024-03-12 18:28               ` Dmitry V. Levin
2024-03-12 21:50                 ` Kees Cook
2024-03-12 22:06                   ` Casey Schaufler
2024-03-12 22:06                 ` Paul Moore
2024-03-12 22:17                   ` Casey Schaufler
2024-03-12 23:17                     ` Paul Moore
2023-09-12 20:56   ` [PATCH v15 06/11] LSM: wireup Linux Security Module syscalls Casey Schaufler
2023-10-03 14:27     ` Mickaël Salaün
2023-09-12 20:56   ` [PATCH v15 07/11] LSM: Helpers for attribute names and filling lsm_ctx Casey Schaufler
2023-10-03 14:28     ` Mickaël Salaün
2023-09-12 20:56   ` [PATCH v15 08/11] Smack: implement setselfattr and getselfattr hooks Casey Schaufler
2023-10-03 14:28     ` Mickaël Salaün
2023-10-20 19:40       ` Casey Schaufler
2023-10-20 19:42       ` Casey Schaufler
2023-09-12 20:56   ` [PATCH v15 09/11] AppArmor: Add selfattr hooks Casey Schaufler
2023-09-12 20:56   ` [PATCH v15 10/11] SELinux: " Casey Schaufler
2023-09-12 20:56   ` [PATCH v15 11/11] LSM: selftests for Linux Security Module syscalls Casey Schaufler
2023-10-03 14:28     ` Mickaël Salaün
2023-10-12 22:07   ` [PATCH v15 00/11] LSM: Three basic syscalls Paul Moore
2023-10-13 21:55     ` Paul Moore
2023-10-16 12:04       ` Roberto Sassu
2023-10-16 15:06         ` Paul Moore
2023-10-17  7:01           ` Roberto Sassu
2023-10-17 15:58             ` Paul Moore
2023-10-17 16:07               ` Roberto Sassu
2023-10-18  9:31                 ` Roberto Sassu
2023-10-18 13:09                   ` Mimi Zohar
2023-10-18 14:14                     ` Roberto Sassu
2023-10-18 16:35                       ` Paul Moore
2023-10-18 20:10                         ` Mimi Zohar
2023-10-18 20:40                           ` Paul Moore
2023-10-19  7:45                             ` Roberto Sassu
2023-10-20 16:36                               ` Casey Schaufler
2023-10-19  8:49                       ` Roberto Sassu
2023-11-13  4:03   ` Paul Moore

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=CAHC9VhT_ijmqo9ap-EokWHuALsMAqome2qcWgst3eRP6m+vbRA@mail.gmail.com \
    --to=paul@paul-moore.com \
    --cc=casey@schaufler-ca.com \
    --cc=jmorris@namei.org \
    --cc=john.johansen@canonical.com \
    --cc=keescook@chromium.org \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=mic@digikod.net \
    --cc=penguin-kernel@i-love.sakura.ne.jp \
    --cc=serge@hallyn.com \
    --cc=stephen.smalley.work@gmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.