Re: [PATCH-v4] SELinux: introduce permissive types

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

 



On Thu, 2008-03-20 at 11:21 -0400, Eric Paris wrote:
> I think we all agree that this patch is good as is and we should go
> ahead and apply for the next round.
> 
> Correct?

Yes - for the kernel patch. As I recall, there were a few minor issues
with the libsepol patch.
> 
> -Eric
> 
> On 3/11/08, Stephen Smalley <sds@xxxxxxxxxxxxx> wrote:
> >
> >  On Tue, 2008-03-11 at 14:26 -0400, Eric Paris wrote:
> >  > Introduce the concept of a permissive type.  A new ebitmap is introduced
> >  > to the policy database which indicates if a given type has the
> >  > permissive bit set or not.  This bit is tested for the scontext of any
> >  > denial.  The bit is meaningless on types which only appear as the target
> >  > of a decision and never the source.  A domain running with a permissive
> >  > type will be allowed to perform any action similarly to when the system
> >  > is globally set permissive.
> >
> >
> > So you are ok with the potential false denial scenario I outlined in the
> >  prior set of comments?
> >
> >  If so, then we likely need to document that proper usage is to mark a
> >  type permissive, determine the right set of allow rules, add those allow
> >  rules, and then remove the permissive designation only afterward as a
> >  separate policy transaction.
> >
> >
> >  >
> >  > Signed-off-by: Eric Paris <eparis@xxxxxxxxxx>
> >  >
> >  > ---
> >  >
> >  > Should be applied after the BUG_ON(!requested) patch
> >  >
> >  >  security/selinux/Kconfig            |    2 +-
> >  >  security/selinux/avc.c              |    9 +++++----
> >  >  security/selinux/include/security.h |    5 ++++-
> >  >  security/selinux/ss/policydb.c      |   11 +++++++++++
> >  >  security/selinux/ss/policydb.h      |    2 ++
> >  >  security/selinux/ss/services.c      |   25 +++++++++++++++++++++++++
> >  >  6 files changed, 48 insertions(+), 6 deletions(-)
> >  >
> >  > diff --git a/security/selinux/Kconfig b/security/selinux/Kconfig
> >  > index 2b517d6..a436d1c 100644
> >  > --- a/security/selinux/Kconfig
> >  > +++ b/security/selinux/Kconfig
> >  > @@ -145,7 +145,7 @@ config SECURITY_SELINUX_POLICYDB_VERSION_MAX
> >  >  config SECURITY_SELINUX_POLICYDB_VERSION_MAX_VALUE
> >  >       int "NSA SELinux maximum supported policy format version value"
> >  >       depends on SECURITY_SELINUX_POLICYDB_VERSION_MAX
> >  > -     range 15 22
> >  > +     range 15 23
> >  >       default 19
> >  >       help
> >  >         This option sets the value for the maximum policy format version
> >  > diff --git a/security/selinux/avc.c b/security/selinux/avc.c
> >  > index cb3f0ce..a4fc6e6 100644
> >  > --- a/security/selinux/avc.c
> >  > +++ b/security/selinux/avc.c
> >  > @@ -893,12 +893,13 @@ int avc_has_perm_noaudit(u32 ssid, u32 tsid,
> >  >       denied = requested & ~(p_ae->avd.allowed);
> >  >
> >  >       if (denied) {
> >  > -             if (selinux_enforcing || (flags & AVC_STRICT))
> >  > +             if (flags & AVC_STRICT)
> >  >                       rc = -EACCES;
> >  > +             else if (!selinux_enforcing || security_permissive_sid(ssid))
> >  > +                     avc_update_node(AVC_CALLBACK_GRANT, requested, ssid,
> >  > +                                     tsid, tclass);
> >  >               else
> >  > -                     if (node)
> >  > -                             avc_update_node(AVC_CALLBACK_GRANT,requested,
> >  > -                                             ssid,tsid,tclass);
> >  > +                     rc = -EACCES;
> >  >       }
> >  >
> >  >       rcu_read_unlock();
> >  > diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h
> >  > index f7d2f03..fde8690 100644
> >  > --- a/security/selinux/include/security.h
> >  > +++ b/security/selinux/include/security.h
> >  > @@ -26,13 +26,14 @@
> >  >  #define POLICYDB_VERSION_AVTAB               20
> >  >  #define POLICYDB_VERSION_RANGETRANS  21
> >  >  #define POLICYDB_VERSION_POLCAP              22
> >  > +#define POLICYDB_VERSION_PERMISSIVE  23
> >  >
> >  >  /* Range of policy versions we understand*/
> >  >  #define POLICYDB_VERSION_MIN   POLICYDB_VERSION_BASE
> >  >  #ifdef CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX
> >  >  #define POLICYDB_VERSION_MAX CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX_VALUE
> >  >  #else
> >  > -#define POLICYDB_VERSION_MAX POLICYDB_VERSION_POLCAP
> >  > +#define POLICYDB_VERSION_MAX POLICYDB_VERSION_PERMISSIVE
> >  >  #endif
> >  >
> >  >  #define CONTEXT_MNT  0x01
> >  > @@ -67,6 +68,8 @@ struct av_decision {
> >  >       u32 seqno;
> >  >  };
> >  >
> >  > +int security_permissive_sid(u32 sid);
> >  > +
> >  >  int security_compute_av(u32 ssid, u32 tsid,
> >  >       u16 tclass, u32 requested,
> >  >       struct av_decision *avd);
> >  > diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c
> >  > index bd7d6a0..84dbab9 100644
> >  > --- a/security/selinux/ss/policydb.c
> >  > +++ b/security/selinux/ss/policydb.c
> >  > @@ -111,6 +111,11 @@ static struct policydb_compat_info policydb_compat[] = {
> >  >               .version        = POLICYDB_VERSION_POLCAP,
> >  >               .sym_num        = SYM_NUM,
> >  >               .ocon_num       = OCON_NUM,
> >  > +     },
> >  > +     {
> >  > +             .version        = POLICYDB_VERSION_PERMISSIVE,
> >  > +             .sym_num        = SYM_NUM,
> >  > +             .ocon_num       = OCON_NUM,
> >  >       }
> >  >  };
> >  >
> >  > @@ -194,6 +199,7 @@ static int policydb_init(struct policydb *p)
> >  >               goto out_free_symtab;
> >  >
> >  >       ebitmap_init(&p->policycaps);
> >  > +     ebitmap_init(&p->permissive_map);
> >  >
> >  >  out:
> >  >       return rc;
> >  > @@ -687,6 +693,7 @@ void policydb_destroy(struct policydb *p)
> >  >       kfree(p->type_attr_map);
> >  >       kfree(p->undefined_perms);
> >  >       ebitmap_destroy(&p->policycaps);
> >  > +     ebitmap_destroy(&p->permissive_map);
> >  >
> >  >       return;
> >  >  }
> >  > @@ -1570,6 +1577,10 @@ int policydb_read(struct policydb *p, void *fp)
> >  >           ebitmap_read(&p->policycaps, fp) != 0)
> >  >               goto bad;
> >  >
> >  > +     if (p->policyvers >= POLICYDB_VERSION_PERMISSIVE &&
> >  > +         ebitmap_read(&p->permissive_map, fp) != 0)
> >  > +             goto bad;
> >  > +
> >  >       info = policydb_lookup_compat(p->policyvers);
> >  >       if (!info) {
> >  >               printk(KERN_ERR "security:  unable to find policy compat info "
> >  > diff --git a/security/selinux/ss/policydb.h b/security/selinux/ss/policydb.h
> >  > index c4ce996..ba593a3 100644
> >  > --- a/security/selinux/ss/policydb.h
> >  > +++ b/security/selinux/ss/policydb.h
> >  > @@ -243,6 +243,8 @@ struct policydb {
> >  >
> >  >       struct ebitmap policycaps;
> >  >
> >  > +     struct ebitmap permissive_map;
> >  > +
> >  >       unsigned int policyvers;
> >  >
> >  >       unsigned int reject_unknown : 1;
> >  > diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
> >  > index f374186..4bfbca5 100644
> >  > --- a/security/selinux/ss/services.c
> >  > +++ b/security/selinux/ss/services.c
> >  > @@ -416,6 +416,31 @@ inval_class:
> >  >       return -EINVAL;
> >  >  }
> >  >
> >  > +/*
> >  > + * Given a sid find if the type has the permissive flag set
> >  > + */
> >  > +int security_permissive_sid(u32 sid)
> >  > +{
> >  > +     struct context *context;
> >  > +     u32 type;
> >  > +     int rc;
> >  > +
> >  > +     POLICY_RDLOCK;
> >  > +
> >  > +     context = sidtab_search(&sidtab, sid);
> >  > +     BUG_ON(!context);
> >  > +
> >  > +     type = context->type;
> >  > +     /*
> >  > +      * we are intentionally using type here, not type-1, the 0th bit may
> >  > +      * someday indicate that we are globally setting permissive in policy.
> >  > +      */
> >  > +     rc = ebitmap_get_bit(&policydb.permissive_map, type);
> >  > +
> >  > +     POLICY_RDUNLOCK;
> >  > +     return rc;
> >  > +}
> >  > +
> >  >  static int security_validtrans_handle_fail(struct context *ocontext,
> >  >                                             struct context *ncontext,
> >  >                                             struct context *tcontext,
> >  >
> >  >
> >  >
> >  > --
> >  > This message was distributed to subscribers of the selinux mailing list.
> >  > If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
> >  > the words "unsubscribe selinux" without quotes as the message.
> >
> > --
> >  Stephen Smalley
> >  National Security Agency
> >
> >
> >
> >  --
> >  This message was distributed to subscribers of the selinux mailing list.
> >  If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
> >  the words "unsubscribe selinux" without quotes as the message.
> >
-- 
Stephen Smalley
National Security Agency


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
the words "unsubscribe selinux" without quotes as the message.

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

  Powered by Linux