Skip to content

Commit

Permalink
Merge tag 'selinux-pr-20181224' of git://git.kernel.org/pub/scm/linux…
Browse files Browse the repository at this point in the history
…/kernel/git/pcmoore/selinux

Pull selinux patches from Paul Moore:
 "I already used my best holiday pull request lines in the audit pull
  request, so this one is going to be a bit more boring, sorry about
  that. To make up for this, we do have a birthday of sorts to
  celebrate: SELinux turns 18 years old this December. Perhaps not the
  most exciting thing in the world for most people, but I think it's
  safe to say that anyone reading this email doesn't exactly fall into
  the "most people" category.

  Back to business and the pull request itself:

  Ondrej has five patches in this pull request and I lump them into
  three categories: one patch to always allow submounts (using similar
  logic to elsewhere in the kernel), one to fix some issues with the
  SELinux policydb, and the others to cleanup and improve the SELinux
  sidtab.

  The other patches from Alexey and Petr and trivial fixes that are
  adequately described in their respective subject lines.

  With this last pull request of the year, I want to thank everyone who
  has contributed patches, testing, and reviews to the SELinux project
  this year, and the past 18 years. Like any good open source effort,
  SELinux is only as good as the community which supports it, and I'm
  very happy that we have the community we do - thank you all!"

* tag 'selinux-pr-20181224' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux:
  selinux: overhaul sidtab to fix bug and improve performance
  selinux: use separate table for initial SID lookup
  selinux: make "selinux_policycap_names[]" const char *
  selinux: always allow mounting submounts
  selinux: refactor sidtab conversion
  Documentation: Update SELinux reference policy URL
  selinux: policydb - fix byte order and alignment issues
  • Loading branch information
torvalds committed Dec 27, 2018
2 parents 047ce6d + ee1a84f commit fb2a624
Show file tree
Hide file tree
Showing 10 changed files with 626 additions and 397 deletions.
2 changes: 1 addition & 1 deletion Documentation/admin-guide/LSM/SELinux.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ If you want to use SELinux, chances are you will want
to use the distro-provided policies, or install the
latest reference policy release from

http://oss.tresys.com/projects/refpolicy
https://github.com/SELinuxProject/refpolicy

However, if you want to install a dummy policy for
testing, you can do using ``mdp`` provided under
Expand Down
2 changes: 1 addition & 1 deletion security/selinux/hooks.c
Original file line number Diff line number Diff line change
Expand Up @@ -2934,7 +2934,7 @@ static int selinux_sb_kern_mount(struct super_block *sb, int flags, void *data)
return rc;

/* Allow all mounts performed by the kernel */
if (flags & MS_KERNMOUNT)
if (flags & (MS_KERNMOUNT | MS_SUBMOUNT))
return 0;

ad.type = LSM_AUDIT_DATA_DENTRY;
Expand Down
2 changes: 1 addition & 1 deletion security/selinux/include/security.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ enum {
};
#define POLICYDB_CAPABILITY_MAX (__POLICYDB_CAPABILITY_MAX - 1)

extern char *selinux_policycap_names[__POLICYDB_CAPABILITY_MAX];
extern const char *selinux_policycap_names[__POLICYDB_CAPABILITY_MAX];

/*
* type_datum properties
Expand Down
24 changes: 11 additions & 13 deletions security/selinux/ss/mls.c
Original file line number Diff line number Diff line change
Expand Up @@ -440,16 +440,17 @@ int mls_setup_user_range(struct policydb *p,

/*
* Convert the MLS fields in the security context
* structure `c' from the values specified in the
* policy `oldp' to the values specified in the policy `newp'.
* structure `oldc' from the values specified in the
* policy `oldp' to the values specified in the policy `newp',
* storing the resulting context in `newc'.
*/
int mls_convert_context(struct policydb *oldp,
struct policydb *newp,
struct context *c)
struct context *oldc,
struct context *newc)
{
struct level_datum *levdatum;
struct cat_datum *catdatum;
struct ebitmap bitmap;
struct ebitmap_node *node;
int l, i;

Expand All @@ -459,28 +460,25 @@ int mls_convert_context(struct policydb *oldp,
for (l = 0; l < 2; l++) {
levdatum = hashtab_search(newp->p_levels.table,
sym_name(oldp, SYM_LEVELS,
c->range.level[l].sens - 1));
oldc->range.level[l].sens - 1));

if (!levdatum)
return -EINVAL;
c->range.level[l].sens = levdatum->level->sens;
newc->range.level[l].sens = levdatum->level->sens;

ebitmap_init(&bitmap);
ebitmap_for_each_positive_bit(&c->range.level[l].cat, node, i) {
ebitmap_for_each_positive_bit(&oldc->range.level[l].cat,
node, i) {
int rc;

catdatum = hashtab_search(newp->p_cats.table,
sym_name(oldp, SYM_CATS, i));
if (!catdatum)
return -EINVAL;
rc = ebitmap_set_bit(&bitmap, catdatum->value - 1, 1);
rc = ebitmap_set_bit(&newc->range.level[l].cat,
catdatum->value - 1, 1);
if (rc)
return rc;

cond_resched();
}
ebitmap_destroy(&c->range.level[l].cat);
c->range.level[l].cat = bitmap;
}

return 0;
Expand Down
3 changes: 2 additions & 1 deletion security/selinux/ss/mls.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ int mls_range_set(struct context *context, struct mls_range *range);

int mls_convert_context(struct policydb *oldp,
struct policydb *newp,
struct context *context);
struct context *oldc,
struct context *newc);

int mls_compute_sid(struct policydb *p,
struct context *scontext,
Expand Down
61 changes: 45 additions & 16 deletions security/selinux/ss/policydb.c
Original file line number Diff line number Diff line change
Expand Up @@ -909,13 +909,21 @@ int policydb_load_isids(struct policydb *p, struct sidtab *s)
if (!c->context[0].user) {
pr_err("SELinux: SID %s was never defined.\n",
c->u.name);
sidtab_destroy(s);
goto out;
}
if (c->sid[0] == SECSID_NULL || c->sid[0] > SECINITSID_NUM) {
pr_err("SELinux: Initial SID %s out of range.\n",
c->u.name);
sidtab_destroy(s);
goto out;
}

rc = sidtab_insert(s, c->sid[0], &c->context[0]);
rc = sidtab_set_initial(s, c->sid[0], &c->context[0]);
if (rc) {
pr_err("SELinux: unable to load initial SID %s.\n",
c->u.name);
sidtab_destroy(s);
goto out;
}
}
Expand Down Expand Up @@ -2108,6 +2116,7 @@ static int ocontext_read(struct policydb *p, struct policydb_compat_info *info,
{
int i, j, rc;
u32 nel, len;
__be64 prefixbuf[1];
__le32 buf[3];
struct ocontext *l, *c;
u32 nodebuf[8];
Expand Down Expand Up @@ -2217,29 +2226,41 @@ static int ocontext_read(struct policydb *p, struct policydb_compat_info *info,
goto out;
break;
}
case OCON_IBPKEY:
rc = next_entry(nodebuf, fp, sizeof(u32) * 4);
case OCON_IBPKEY: {
u32 pkey_lo, pkey_hi;

rc = next_entry(prefixbuf, fp, sizeof(u64));
if (rc)
goto out;

/* we need to have subnet_prefix in CPU order */
c->u.ibpkey.subnet_prefix = be64_to_cpu(prefixbuf[0]);

rc = next_entry(buf, fp, sizeof(u32) * 2);
if (rc)
goto out;

c->u.ibpkey.subnet_prefix = be64_to_cpu(*((__be64 *)nodebuf));
pkey_lo = le32_to_cpu(buf[0]);
pkey_hi = le32_to_cpu(buf[1]);

if (nodebuf[2] > 0xffff ||
nodebuf[3] > 0xffff) {
if (pkey_lo > U16_MAX || pkey_hi > U16_MAX) {
rc = -EINVAL;
goto out;
}

c->u.ibpkey.low_pkey = le32_to_cpu(nodebuf[2]);
c->u.ibpkey.high_pkey = le32_to_cpu(nodebuf[3]);
c->u.ibpkey.low_pkey = pkey_lo;
c->u.ibpkey.high_pkey = pkey_hi;

rc = context_read_and_validate(&c->context[0],
p,
fp);
if (rc)
goto out;
break;
case OCON_IBENDPORT:
}
case OCON_IBENDPORT: {
u32 port;

rc = next_entry(buf, fp, sizeof(u32) * 2);
if (rc)
goto out;
Expand All @@ -2249,20 +2270,22 @@ static int ocontext_read(struct policydb *p, struct policydb_compat_info *info,
if (rc)
goto out;

if (buf[1] > 0xff || buf[1] == 0) {
port = le32_to_cpu(buf[1]);
if (port > U8_MAX || port == 0) {
rc = -EINVAL;
goto out;
}

c->u.ibendport.port = le32_to_cpu(buf[1]);
c->u.ibendport.port = port;

rc = context_read_and_validate(&c->context[0],
p,
fp);
if (rc)
goto out;
break;
}
} /* end case */
} /* end switch */
}
}
rc = 0;
Expand Down Expand Up @@ -3105,6 +3128,7 @@ static int ocontext_write(struct policydb *p, struct policydb_compat_info *info,
{
unsigned int i, j, rc;
size_t nel, len;
__be64 prefixbuf[1];
__le32 buf[3];
u32 nodebuf[8];
struct ocontext *c;
Expand Down Expand Up @@ -3192,12 +3216,17 @@ static int ocontext_write(struct policydb *p, struct policydb_compat_info *info,
return rc;
break;
case OCON_IBPKEY:
*((__be64 *)nodebuf) = cpu_to_be64(c->u.ibpkey.subnet_prefix);
/* subnet_prefix is in CPU order */
prefixbuf[0] = cpu_to_be64(c->u.ibpkey.subnet_prefix);

nodebuf[2] = cpu_to_le32(c->u.ibpkey.low_pkey);
nodebuf[3] = cpu_to_le32(c->u.ibpkey.high_pkey);
rc = put_entry(prefixbuf, sizeof(u64), 1, fp);
if (rc)
return rc;

rc = put_entry(nodebuf, sizeof(u32), 4, fp);
buf[0] = cpu_to_le32(c->u.ibpkey.low_pkey);
buf[1] = cpu_to_le32(c->u.ibpkey.high_pkey);

rc = put_entry(buf, sizeof(u32), 2, fp);
if (rc)
return rc;
rc = context_write(p, &c->context[0], fp);
Expand Down
Loading

0 comments on commit fb2a624

Please sign in to comment.