|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 4/6] tools/dm_restrict: Unshare mount and IPC namespaces on Linux
George Dunlap writes ("[PATCH v2 4/6] tools/dm_restrict: Unshare mount and IPC
namespaces on Linux"):
> QEMU running under Xen doesn't need mount or IPC functionality.
> Create and enter separate namespaces for each of these before
> executing QEMU, so that in the event that other restrictions fail, the
> process won't be able to even name system mount points or exsting
> non-file-based IPC descriptors to attempt to attack them.
> Unsharing is something a process can only do to itself (it would
> seem); so add an os-specific "dm_preexec_restrict()" hook just before
> we exec() the device model.
...
> +
> +void libxl__local_dm_preexec_restrict(libxl__gc *gc, int stderrfd)
> +{
> + return;
> +}
This patch is the point of divergence between Linux dom0's and FreeBSD
dom0's.
IMO it's not good enough to simply talk about some restrictions as
being Linux-only. Rather, the restrictions are supposed to work
together as a whole, and the whole syscall API available to qemu needs
to be considered. That would need to be done separately for FreeBSD.
I think that this means we should explicitly write down that the qemu
depriv implementation is incomplete on FreeBSD.
> +/*
> + * Called after forking but before executing the local devicemodel.
> + * Must call _exit(-1) on failure, printing an error message to
> + * stderrfd if available.
IMO it would be better if the single call site handled the errors. I
think that can be done in a standard way. So this function should
probably be expected to call a LOG macro and then return ERROR_FAIL,
on failure.
> +void libxl__local_dm_preexec_restrict(libxl__gc *gc, int stderrfd)
> +{
> + int rc;
> +
> + /* Unshare mount and IPC namespaces. These are unused by QEMU. */
> + rc = unshare(CLONE_NEWNS | CLONE_NEWIPC);
Variable name should be r. rc is used for libxl error codes.
See tools/libxl/CODING_STYLE.
> + if (rc < 0) {
> + char *msg = GCSPRINTF("libxl: Mount and IPC namespace unfailed with
> error %d\n",
> + errno);
Please do not print numeric errno values. I think you can use LOG:
| .... The child may not
| * make any further calls to libxl infrastructure, except for memory
| * allocation and logging. ...
(from libxl_internal.h's discussion of libxl__ev_child_fork)
> +# TEST: Namespace unsharing
> +#
> +# Read /proc/<dmpid>/ns/<namespace> and make sure it's not equal to
> +# the current processes' value
> +for nsname in ipc mnt; do
> + echo -n "Unshare namespace $nsname: "
> + dmns=$(readlink /proc/$dmpid/ns/$nsname)
> + myns=$(readlink /proc/self/ns/$nsname)
> +
> + if [[ "$dmns" == "$myns" ]] ; then
> + echo "FAILED"
> + failed="true"
> + else
> + echo "PASSED"
> + fi
> +done
I wonder if maybe this output should be in subunit v1 format.
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |