Daniele Di Proietto <diproiet...@ovn.org> writes:

> Hi Aaron, apologies for the delay,
>
> I took another look at the series, and I'm not convinced this is the right 
> solution to the problem.
>
> This obviously has nothing to do with the quality of the code.
>
> While the hardness amplification might help against symlinks, it doesn't 
> protect against some
> type of race conditions.
>
> There's still a window between 'rte_vhost_driver_register()' and 
> 'vhost_set_permissions()' that
> can be exploited to change permissions of other sockets in the ovs rundir 
> (which is the default
> vhostuser socket directory).  ovs_kchown() doesn't guarantee that the socket 
> is the one we
> intended.  By introducing a sleep between 'rte_vhost_driver_register()' and
> 'vhost_set_permissions()' (and restarting some daemons in between) I was able 
> to trick
> ovs-vswitchd into changing the permissions of the ovn nb database socket.  I 
> suspect someone
> more expert than me could find similar and more dangerous exploits.

Okay.  

> Alternative approaches:
>
> 1) vhostuser client mode.  It prevents this (and other) problem(s) and it is 
> IMHO the best way to
> deploy vhostuser in production. I know that it requires a recent version of 
> QEMU, but this whole
> stack is still pretty new, I don't see many ways around this.
> 2) Do we want to do chmod/chown in the lower layers of the software stack? 
> Then we need
> some support in DPDK. Using fchmod() and fchown() in DPDK seems better to me, 
> because it's
> possible to do it without any race conditions.  The same thing is not 
> possible in OVS (it would be
> possible if DPDK gave us access to the fd before binding).
> 3) If it's not possible to do it in the lower layers without any races,  I 
> think it's best not to hide the
> hack, but to do it in outside of Open vSwitch, where there might be more 
> context about the
> other running daemons, or the vhost-sock-dir.  As mentioned before, a manual 
> intervention will
> not survive an ovs-vswitchd restart, but an ovs restart will also break the 
> connection to the
> existing VM (that's why I think client mode is a much better approach).

Agreed.  Let's drop this effort.

> Again, this is just my opinion, but I'm really not comfortable maintaining 
> this.
>
> Daniele
>
> 2016-08-19 16:48 GMT-07:00 Aaron Conole <acon...@redhat.com>:
>
>  Currently, when using Open vSwitch with DPDK and qemu guests, the recommended
>  method for joining the guests is via the dpdkvhostuser interface. This
>  interface uses Unix Domain sockets to communicate. When these sockets are
>  created, they inherit the permissions and ownership from the vswitchd 
> process.
>  This can lead to an undesirable state where the QEMU process cannot use the
>  socket file until manual intervention is performed (via `chown` and/or 
> `chmod`
>  calls).
>
>  This patchset gives the ability to set the permissions and ownership of all
>  dpdkvhostuser sockets from the database, avoiding the manual intervention
>  required to connect QEMU and OVS via DPDK.
>
>  The first patch adds chmod and chown calls to lib, with unit tests.  The
>  second patch adds a hardness amplification version as described in the
>  paper "Portably Solving File TOCTTOU Races with Hardness Amplification"
>  found at
>  
> https://www.usenix.org/legacy/event/fast08/tech/full_papers/tsafrir/tsafrir_html/index.html,
>  while the third patch hooks those calls into the
>  netdev_dpdk_vhost_user_construct function, after the socket is created.
>
>  Changes from v3:
>  * Replaced patch 2/3 with hardness amplification version.  Retested on RHEL7
>    and validated the travis builds.
>
>  Changes from v2:
>  * Added a new 2nd patch to series for chmod/chown on already opened files.
>    There exist known implementations for other systems, including FreeBSD, but
>    only linux is implemented.  ENOTSUP is set when these calls fail on 
> non-linux
>    systems.
>
>  Aaron Conole (3):
>    chutil: introduce a new change-utils lib
>    chutil: Add hardness amplification versions of chmod/chown
>    netdev-dpdk: Support user-defined socket attribs
>
>   INSTALL.DPDK.md      |   8 +
>   configure.ac         |   2 +-
>   lib/automake.mk      |   2 +
>   lib/chutil-unix.c    | 652
>  +++++++++++++++++++++++++++++++++++++++++++++++++++
>   lib/chutil.h         |  36 +++
>   lib/daemon-unix.c    | 149 +-----------
>   lib/netdev-dpdk.c    |  37 +++
>   tests/automake.mk    |   2 +
>   tests/library.at     |   5 +
>   tests/test-chutil.c  | 297 +++++++++++++++++++++++
>   vswitchd/vswitch.xml |  23 ++
>   11 files changed, 1068 insertions(+), 145 deletions(-)
>   create mode 100644 lib/chutil-unix.c
>   create mode 100644 lib/chutil.h
>   create mode 100644 tests/test-chutil.c
>
>  --
>  2.5.5
>
>  _______________________________________________
>  dev mailing list
>  dev@openvswitch.org
>  http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to