Re: Trying to setup a type bounds from unconfined_t and docekr_t to svirt_lxc_net_t

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

 



On 04/29/2016 04:19 AM, Miroslav Grepl wrote:
> On 04/28/2016 08:36 PM, Stephen Smalley wrote:
>> On 04/28/2016 02:07 PM, Daniel J Walsh wrote:
>>>
>>>
>>> On 04/28/2016 01:59 PM, Stephen Smalley wrote:
>>>> On 04/28/2016 01:35 PM, Daniel J Walsh wrote:
>>>>>
>>>>> On 04/28/2016 01:31 PM, Stephen Smalley wrote:
>>>>>> On 04/28/2016 12:20 PM, Daniel J Walsh wrote:
>>>>>>> On 04/28/2016 11:21 AM, Stephen Smalley wrote:
>>>>>>>> On 04/28/2016 09:15 AM, Daniel J Walsh wrote:
>>>>>>>>>> typebounds unconfined_t docker_t; # docker_t is an unconfined
>>>>>>>>>> domain
>>>>>>>>>>
>>>>>>>>>> typebounds docker_t spc_t;  #spc_t is an unconfined domain
>>>>>>>>>>
>>>>>>>>>> typeboulds docker_t docker_lxc_net_t;
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> docker, rkt, systemd-nspawn, runc are all executing
>>>>>>>>>> setexeccon(svirt_lxc_net_t)
>>>>>>>>>>
>>>>>>>>>> For container domains.
>>>>>>>>>>
>>>>>>>>>> Everything works fine until I turn on expand_check in
>>>>>>>>>> semanage.conf,
>>>>>>>>>> which we have been asked to do in Rawhide.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Attached is the current Rawhide docker policy.  And here is the
>>>>>>>>>> output
>>>>>>>>>> from semodule -i before it crashes, with a segfault.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Had to add this rule to make it a little quieter, which is caused
>>>>>>>>>> by a
>>>>>>>>>> rule in policy that says we allow all daemons to connecto spc_t;
>>>>>>>>>>
>>>>>>>>>> gen_require(`
>>>>>>>>>> type unconfined_t;
>>>>>>>>>> attribute daemon;
>>>>>>>>>> ')
>>>>>>>>>>
>>>>>>>>>> allow daemon unconfined_t:unix_stream_socket  connectto;
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Why does typebounds care about when a domain is the target of an
>>>>>>>>>> access,
>>>>>>>>>> I think it should only remove options when it is the source.
>>>>>>>>>>
>>>>>>>>>> Otherwise we end up having to loosen the policy to make this work.
>>>>>>>>>>
>>>>>>>>>> As long as docker_t does not have any more "allow docker_t" rules
>>>>>>>>>> then
>>>>>>>>>> "allow unconfined_t", shouldn't this be ok?
>>>>>>>>>>
>>>>>>>>>> It seems that some or the optional code blocks are causing
>>>>>>>>>> problems also.
>>>>>>>> I agree that typebounds is not very usable in its current form,
>>>>>>>> but I'm
>>>>>>>> not entirely clear on how to fix it.
>>>>>>>>
>>>>>>>> Dropping the target bounds logic is possible; it was actually
>>>>>>>> implemented a while back by KaiGai (see the archives) but reverted
>>>>>>>> because of a side effect on /proc/pid file access.  Without the
>>>>>>>> target
>>>>>>>> bounds logic, you had to allow the parent domain to access all child
>>>>>>>> domains' /proc/pid files in order for the child to access their own.
>>>>>>>> That however could be worked around in policy, so possibly we could
>>>>>>>> revive those patches.
>>>>>>>>
>>>>>>>> However, I don't think that solves all of the problems.  For example,
>>>>>>>> even with source bounds, I can't allow a child permissions to self
>>>>>>>> or to
>>>>>>>> its entrypoint file type or to its tmp file type without allowing
>>>>>>>> those
>>>>>>>> permissions to the parent, which may unnecessarily escalate the
>>>>>>>> privileges of the parent or expose the parent to risk.
>>>>>>>>
>>>>>>>> We might need more semantics in the policy about inter-type
>>>>>>>> relationships in order to truly evaluate bounds in a manner that
>>>>>>>> permits
>>>>>>>> such usage.  Patches/proposals welcome.
>>>>>>>>
>>>>>>>> The other approach would be to use fork()+setcon()+execve() rather
>>>>>>>> than
>>>>>>>> fork()+setexeccon()+execve() in the callers.  Then you aren't
>>>>>>>> subject to
>>>>>>>> typebounds at all (NNP only restricts exec-based transitions).
>>>>>>> The entrypoints are alot simpler to fix.  I think just eliminating the
>>>>>>> target checks would
>>>>>>> go along way to making this a lot tighter policy.
>>>>>>>
>>>>>>> I have no problem with allowing parent domain access to child domains
>>>>>>> self fields.  I think this
>>>>>>> make some sense.  This seems a lot more secure that allowing any
>>>>>>> domain
>>>>>>> that can communicate
>>>>>>> with the child to be able to communicate with the parent.
>>>>>>>
>>>>>>> With the way it works now, I can not even figure out how to
>>>>>>> increase the
>>>>>>> privs of unconfined_t or
>>>>>>> other confined domains to actually make it work.
>>>>>> Ok, let's assume that we change the libsepol and kernel logic to drop
>>>>>> the target bounds checks.  What else remains to make this work?
>>>>> Looking at the output from the semodule command, I see some other
>>>>> strange errors like this.
>>>>>
>>>>>    (allow docker_t cluster_pid (sock_file (write getattr append open)))
>>>>>
>>>>>
>>>>> I have no idea why it would complain about this.  Other then potentially
>>>>> problems caused by optional policy?
>>>> $ sesearch -A -s docker_t -t cluster_pid -c sock_file
>>>> Found 1 semantic av rules:
>>>>     allow daemon cluster_pid : sock_file { write getattr append open } ;
>>>>
>>>> $ sesearch -A -s unconfined_t -t cluster_pid -c sock_file
>>>> <no output>
>>>>
>>>> So that is a legitimate violation of the bound and would be denied by
>>>> the kernel if it were attempted.  Either you need to allow it to
>>>> unconfined_t or tighten up that rule so that docker_t isn't included
>>>> (why should all daemon domains be allowed to do that?).
>>>>
>>>> _______________________________________________
>>>> Selinux mailing list
>>>> Selinux@xxxxxxxxxxxxx
>>>> To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
>>>> To get help, send an email containing "help" to
>>>> Selinux-request@xxxxxxxxxxxxx.
>>>>
>>>>
>>> allow files_unconfined_type file_type:{ dir lnk_file sock_file fifo_file
>>> blk_file } *;
>>>
>>> So unless cluster_pid refers to something that is not a file_type, then
>>> I think unconfined_t can do it.
>>> No idea why this is allowed.
>>>
>>> seinfo -acluster_pid -x
>>>    cluster_pid
>>>       dlm_controld_var_run_t
>>>       fenced_var_run_t
>>>       foghorn_var_run_t
>>>       gfs_controld_var_run_t
>>>       haproxy_var_run_t
>>>       groupd_var_run_t
>>>       qdiskd_var_run_t
>>>       cluster_var_run_t
>>
>> Hmm...that would appear to be a bug in the libsepol hierarchy checker,
>> and also in setools3 since it didn't find the match.  Just tried
>> setools4 and it did find the matching rules:
>> $ ./sesearch -A -s unconfined_t -t cluster_pid -c sock_file
>> allow domain pidfile:sock_file { write getattr open append };
>> allow files_unconfined_type file_type:sock_file { rename open execute
>> execmod setattr read lock create quotaon getattr mounton write
>> relabelfrom ioctl link relabelto unlink swapon audit_access append };
> 
> Ok so it is a bug in libsepol as you said because it should work
> correctly if we talk about unconfined domains.
> 
> cluster_pid refers only to file_type types.

Yes, see my patch, "libsepol: fix type bounds checking for attributes"
(not yet pushed upstream).
The seg fault Dan is encountering was also fixed earlier by the series
"libsepol/cil: Fixes to neverallow and bounds checking", which was
already committed upstream.

_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.



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

  Powered by Linux