dbus and Linux Containers

Simon McVittie simon.mcvittie at collabora.co.uk
Tue Apr 7 07:10:14 PDT 2015

On 07/04/15 07:44, Kyungmin Park wrote:
>> I want the container to share the "outer" system bus also.

I'm not sure whether this can be secure in traditional D-Bus. It's
probably something kdbus can do securely.

As a general rule I think the current D-Bus policy language in
/etc/dbus-1/system.{conf,d/} is already too complicated, leading to
third-party applications accidentally making each other insecure
(CVE-2014-8148, CVE-2014-8156), and I am very wary about things that
would make it *more* complicated. This is not a definite "no", but
proposals for adding to that policy language do need to think about how
their ongoing maintenance cost can be minimized.

In particular, I am *very* reluctant to add more policy rules without
specific concrete use cases. "A process inside a container and a process
outside" is not a concrete use case; I'm looking for something more like
"a networking GUI inside a container talking to NetworkManager outside".

See also <https://bugs.freedesktop.org/show_bug.cgi?id=19593> and

>> DBus namespace policy can know current namespace by reading /proc/[current PID]/cpuset.

Is this vulnerable to the class of time of check / time of use attack
described in <https://bugs.freedesktop.org/show_bug.cgi?id=83499#c0>?

Linux has all sorts of namespaces which can differ between a container
and the "bare metal": filesystem namespace (chroot), mount namespace,
network namespace, and so on. Which one does this match up with? Or is
it a different one again?

>> This has 3 targets. target means where to apply dbus policies.
>> - private : current namespace only
>> - protected : current namespace + child namespaces + parent namespaces
>> - pulblic : all of namespacess

Is there any particular reason why you've gone for these three specific
models, and not (for instance) something based on assigning a name to
the namespace?

>> <policy namespace="protected">
>>     <allow send_type="method_call"/>
>>     <allow send_type="signal"/>
>>     <allow send_requested_reply="true" send_type="method_return"/>
>>     <allow send_requested_reply="true" send_type="error"/>
>> </policy>

How does this relate to user- and group-based policies? Let's say
user-based policies have boolean result U (true or false = allow or
deny), and namespace-based policies have result N. Is the overall result
U && N, or U || N?

If it's U || N, then it's a major security hole: it allows *any* method
call and *any* signal from inside a container to outside, including some
that really shouldn't be allowed (see also CVE-2014-8148).

Simon McVittie
Collabora Ltd. <http://www.collabora.com/>

More information about the dbus mailing list