Re: [PATCH] libsepol: support for permissive types

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

 



On Tue, 2008-03-11 at 14:28 -0400, Stephen Smalley wrote:
> On Tue, 2008-03-11 at 09:59 -0400, Eric Paris wrote:
> > This patch adds support for permissive types.
> > 
> > In the kernel policy format the permissive types are in a bitmap
> > referenced by the type value.
> > 
> > In the module policy format a new field in the type_datum_t called
> > 'flags' was added.  The only currently defined flag is
> > TYPE_FLAGS_PERMISSIVE.
> > 
> > Checkpolicy can set the permissive flag on the type_datum_t in question
> > and that flag will persist on disk.  It will be OR'd at link time
> > against the type in the base policy.  At expand time we build the bit
> > array the kernel uses.
> > 
> > Signed-off-by: Eric Paris <eparis@xxxxxxxxxx>
> > 
> > ---
> 
> <snip>
> > @@ -112,6 +113,9 @@ static int type_copy_callback(hashtab_ke
> >  		return -1;
> >  	}
> >  
> > +	if (new_type->flags & TYPE_FLAGS_PERMISSIVE)
> > +		ebitmap_set_bit(&state->out->permissive_map, new_type->s.value, 1);
> 
> ebitmap_set_bit() can fail due to memory allocation failure, so you need
> to check for it.

sure.

> 
> Somewhere we also need to clearly document that the permissive map is
> _not_ using zero-based indexing for the types, unlike other ebitmaps in
> policy.

any idea where to document?  Would you prefer I just move all of this to
type-1 to keep consistancy?  Probably some way to use max_type_number+1
for global if I/we ever do it....

> 
> > @@ -492,6 +498,10 @@ static int alias_copy_callback(hashtab_k
> >  	}
> >  
> >  	state->typemap[alias->s.value - 1] = new_alias->s.value;
> > +
> > +	if (new_alias->flags & TYPE_FLAGS_PERMISSIVE)
> > +		ebitmap_set_bit(&state->out->permissive_map, new_alias->s.value, 1);
> 
> Ditto.
> 
> Have you tested the handling of aliases, e.g. declare a type alias to a
> type in one module, then mark that type alias as permissive in another
> module, and confirm proper propagation of the permissive flag?

I tested declare a type in base and then in a module require that base
type, alias to that base type, and then permissive the alias.  Is there
a different between that and actually declaring the type in another
module?


> > diff -Naupr libsepol-2.0.23/src/write.c libsepol-2.0.23.new/src/write.c
> > --- libsepol-2.0.23/src/write.c	2008-03-06 13:31:08.000000000 -0500
> > +++ libsepol-2.0.23.new/src/write.c	2008-03-06 10:08:37.000000000 -0500
> > @@ -959,6 +959,8 @@ static int type_write(hashtab_key_t key,
> >  	buf[items++] = cpu_to_le32(typdatum->primary);
> >  	if (p->policy_type != POLICY_KERN) {
> >  		buf[items++] = cpu_to_le32(typdatum->flavor);
> > +		if (p->policyvers >= MOD_POLICYDB_VERSION_PERMISSIVE)
> > +			buf[items++] = cpu_to_le32(typdatum->flags);
> >  	}
> >  	items2 = put_entry(buf, sizeof(uint32_t), items, fp);
> >  	if (items != items2)
> > @@ -1618,6 +1620,12 @@ int policydb_write(policydb_t * p, struc
> >  			return POLICYDB_ERROR;
> >  	}
> >  
> > +	if (p->policyvers >= POLICYDB_VERSION_PERMISSIVE &&
> > +	    p->policy_type == POLICY_KERN) {
> > +		if (ebitmap_write(&p->permissive_map, fp) == -1)
> > +			return POLICYDB_ERROR;
> > +	}
> > +
> >  	num_syms = info->sym_num;
> >  	for (i = 0; i < num_syms; i++) {
> >  		buf[0] = cpu_to_le32(p->symtab[i].nprim);
> 
> So in the case of automatic policy downgrade by libselinux load policy
> logic, we will silently shed any permissive maps.  Likely need a warning
> if the permissive map has any bits set at all to warn the user that he
> isn't going to get what he expected.

So just some print statements?  I'll look for examples....

-Eric


--
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