Re: [PATCH v2] libsepol: Validate string fields used in various labeling rules
Stephen Smalley <[email protected]> Fri, 24 Jul 2026 10:33:39 -0400
| Newsgroups | org.kernel.vger.selinux |
|---|---|
| Message-ID | <CAEjxPJ7V9k8gMvut=wURfbDMUXMw358equJKip_MoJSyMrDO9w@mail.gmail.com> |
On Thu, Jul 23, 2026 at 2:37 PM Stephen Smalley <[email protected]> wrote: > > On Thu, Jul 23, 2026 at 12:54 PM James Carter <[email protected]> wrote: > > > > Filename transitions and the ocontexts fs, netif, fs_use, > > ibendport, Xen devicetree, and genfs use strings in a name or type > > field used to identify what to label. > > > > Check that these strings do not contain any control characters to > > protect against maliciously crafted policies. > > > > Signed-off-by: James Carter <[email protected]> > > Acked-by: Stephen Smalley <[email protected]> Merged. > > > --- > > v2: Added another check in validate_genfs() and a check in > > validate_filename_trans_rules > > > > libsepol/src/policydb_validate.c | 35 +++++++++++++++++++++++++++----- > > 1 file changed, 30 insertions(+), 5 deletions(-) > > > > diff --git a/libsepol/src/policydb_validate.c b/libsepol/src/policydb_validate.c > > index cde0b8d6..e7d79871 100644 > > --- a/libsepol/src/policydb_validate.c > > +++ b/libsepol/src/policydb_validate.c > > @@ -1,4 +1,5 @@ > > > > +#include <ctype.h> > > #include <sepol/policydb/conditional.h> > > #include <sepol/policydb/ebitmap.h> > > #include <sepol/policydb/polcaps.h> > > @@ -129,6 +130,23 @@ bad: > > return -1; > > } > > > > +static int validate_string_field(const char *s) > > +{ > > + if (!s || !*s) > > + goto bad; > > + > > + while (*s) { > > + if (iscntrl((unsigned char)*s)) > > + goto bad; > > + s++; > > + } > > + > > + return 0; > > + > > +bad: > > + return -1; > > +} > > + > > static int validate_ebitmap(const ebitmap_t *map, const validate_t *flavor) > > { > > if (ebitmap_length(map) > 0 && > > @@ -1436,6 +1454,8 @@ static int validate_filename_trans(hashtab_key_t k, hashtab_datum_t d, > > goto bad; > > if (validate_value(ftk->tclass, &flavors[SYM_CLASSES])) > > goto bad; > > + if (validate_string_field(ftk->name)) > > + goto bad; > > if (!ftd) > > goto bad; > > for (; ftd; ftd = ftd->next) { > > @@ -1505,7 +1525,7 @@ static int validate_ocontexts(sepol_handle_t *handle, const policydb_t *p, > > if (validate_context(&octx->context[1], > > flavors, p->mls)) > > goto bad; > > - if (!octx->u.name) > > + if (validate_string_field(octx->u.name)) > > goto bad; > > break; > > case OCON_PORT: > > @@ -1522,7 +1542,7 @@ static int validate_ocontexts(sepol_handle_t *handle, const policydb_t *p, > > default: > > goto bad; > > } > > - if (!octx->u.name) > > + if (validate_string_field(octx->u.name)) > > goto bad; > > break; > > case OCON_IBPKEY: > > @@ -1533,7 +1553,8 @@ static int validate_ocontexts(sepol_handle_t *handle, const policydb_t *p, > > case OCON_IBENDPORT: > > if (octx->u.ibendport.port == 0) > > goto bad; > > - if (!octx->u.ibendport.dev_name) > > + if (validate_string_field( > > + octx->u.ibendport.dev_name)) > > goto bad; > > break; > > } > > @@ -1560,7 +1581,7 @@ static int validate_ocontexts(sepol_handle_t *handle, const policydb_t *p, > > goto bad; > > break; > > case OCON_XEN_DEVICETREE: > > - if (!octx->u.name) > > + if (validate_string_field(octx->u.name)) > > goto bad; > > break; > > } > > @@ -1590,9 +1611,11 @@ static int validate_genfs(sepol_handle_t *handle, const policydb_t *p, > > validate_value(octx->v.sclass, > > &flavors[SYM_CLASSES])) > > goto bad; > > + if (validate_string_field(octx->u.name)) > > + goto bad; > > } > > > > - if (!genfs->fstype) > > + if (validate_string_field(genfs->fstype)) > > goto bad; > > } > > > > @@ -1728,6 +1751,8 @@ validate_filename_trans_rules(sepol_handle_t *handle, > > goto bad; > > if (validate_simpletype(filename_trans->otype, p, flavors)) > > goto bad; > > + if (validate_string_field(filename_trans->name)) > > + goto bad; > > > > /* currently only the RULE_SELF flag can be set */ > > switch (filename_trans->flags) { > > -- > > 2.55.0 > >