RE: how to implement permissive domains + an old bug

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

 



On Fri, 2008-02-15 at 13:57 -0500, Stephen Smalley wrote:
> On Fri, 2008-02-15 at 13:35 -0500, Joshua Brindle wrote:
> > Stephen Smalley wrote:
> > > On Fri, 2008-02-15 at 12:50 -0500, Eric Paris wrote:
> > >> So after many months of trying to avoid it Dan finally beat me into
> > >> looking at permissive domains.  I'm coming to the list to ask how
> > >> people feel the transfer of knowledge that a domain is permissive
> > >> between the policy and the kernel should be implemented.  (And to
> > >> point out what I think is a bug I found while trolling around the
> > >> code today) 
> > >> 
> > >> Old discussion of permissive domains.
> > >> http://marc.info/?l=selinux&m=118953810913436&w=2
> > >> 
> > >> The basic idea is that we want a domain in which a process can run
> > >> without any permission enforcement and without flooding the audit
> > >> logs. After much discussion I think everyone agreed with (or at least
> > >> stopped arguing against) a couple of things.
> > >> 
> > >> 1) do this in policy (not selinuxfs)
> > >> 2) have it act just like 'setenforce 0'
> > >> 
> > >> My question today is about #1.  How to implement?  Karl suggested
> > >> stealing a bit from the type_datum->primary field to indicate to the
> > >> kernel that a certain type was a permissive domain.  Can I do this? 
> > >> I guess this is a question for the setools group.  Do you make use of
> > >> the actual value stored in 'primary'?  The kernel does not.  Does
> > >> anything make use of the actual value outside of the tool chain? 
> > >> Please say 'no' and make this easier for me. 
> > >> 
> > >> I want to throw away the 'primary' field all together in the final
> > >> binary policy and create a 'new' field called 'flags' in its place.
> > >> After my change flags would make use of 2 bits.
> > >> 
> > >> #define F_PRIMARY		0x00000001
> > >> #define F_PERMISSIVE		0x80000000
> > >> if (type_datum->old_primary)
> > >> 	type_datum->flags = F_PRIMARY;
> > >> if (permissive domain)
> > >>     type_datum->flags |= F_PERMISSIVE
> > >> 
> > >> This only works if noone makes actual use of the value in ->primary.
> > >> If someone makes use of the value in primary I can't really reuse
> > >> that area on disk and I think I'm going to have to bump the policy
> > >> version and add a whole new ->flags field on disk (I don't think
> > >> pmoore's capability stuff really helps).  Maybe the tools could just
> > >> agree to ignore the last bit?  To be honest I'm not personally
> > >> terribly concerned about setools backwards compatibility.  I'm
> > >> really only thinking about function backwards compatibility, so
> > >> maybe the tools people would be ok with me just userping a bit (but
> > >> I'd much rather have a more clear 'flags' than 'primary + one bit
> > >> stolen for some other random crap).  For backwards compatibility I
> > >> might have to bump the policy number even if noone has a problem
> > >> with me redefining the meaning of the ->primary field, not sure yet
> > >> haven't really wrapped my brain around it.  I think there is a
> > >> kernel bug which actually makes it possible to reuse the field in my
> > >> new way and maintain 
> > > backwards kernel compatibility.
> > >> 
> > >> **The Bug**
> > >> In the binary policy on disk ->primary is a uint32_t but in the
> > >> kernel ->primary is an unsigned char.  When we load policy we just
> > >> have 
> > >> 
> > >> typdatum->primary = le32_to_cpu(buf[2]);
> > >> 
> > >> So we are truncating to 8 bits.  I think that means that if the on
> > >> disk ->primary value is greater than 0xFF but the lower 8 bits are
> > >> all 0 we are going to screw this up (maybe this is impossible, but I
> > >> don't see why looking at libsepol quickly).  Thanks to this bug
> > >> though I think I could use the 32nd bit of the on disk
> > >> representation on old kernels and they wouldn't even realize it. 
> > >> New kernels could be made to pay attention to that bit.  Backwards
> > >> compatibility through bugs, I love it. It also means I don't really
> > >> want to fix this bug right now *smile* **End bug**
> > > 
> > > Kernel policy representation only uses ->primary as a boolean
> > > flag (is it a primary name or an alias, with the type index
> > > value in ->value regardless).  Modular policy introduced the
> > > notion of using it to store the primary type index for
> > > aliases (when ->flavor == TYPE_ALIAS).  By the time we reach
> > > kernel policy (after expansion), it should only be a boolean again.

I guess this being done in src/expand.c::type_copy_callback().

All my thought is for nothing though.  Somehow in the language we have
to represent permissive domains.  That in and of itself requires a
version bump doesn't it?  Drat.

So what format do we want to go with?

permissive httpd_t;

anyone got anything better?

So with the policy version bump should I add a new field, ->flags to the
on disk type_datum represenation?  Should I instead just rename
->primary to ->flags and teach libsepol to mask off the flag?  I don't
know the toolchain well enough to know if we ever write more than a
boolean to disk in ->primary.  Guess that's what I'll look for now but
first glance tells me I might as well use another 32 bits on disk since
it seems as though we have such disperate usage of primary for
POLICY_KERNEL vs everything else.

-Eric

-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