From: George Dunlap <george.dunlap@citrix.com>
To: xen-devel@lists.xenproject.org
Cc: Anthony Perard <anthony.perard@citrix.com>,
Ian Jackson <ian.jackson@citrix.com>,
Wei Liu <wei.liu2@citrix.com>,
George Dunlap <george.dunlap@citrix.com>
Subject: [PATCH v2 4/6] tools/dm_restrict: Unshare mount and IPC namespaces on Linux
Date: Fri, 21 Sep 2018 18:04:26 +0100 [thread overview]
Message-ID: <20180921170428.13771-4-george.dunlap@citrix.com> (raw)
In-Reply-To: <20180921170428.13771-1-george.dunlap@citrix.com>
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.
Also add checks to depriv-process-checker.sh to verify that dm is
running in a new namespace (or at least, a different one than the
caller).
Suggested-by: Ross Lagerwall <ross.lagerwall@citrix.com>
Signed-off-by: George Dunlap <george.dunlap@citrix.com>
---
CC: Ian Jackson <ian.jackson@citrix.com>
CC: Wei Liu <wei.liu2@citrix.com>
CC: Anthony Perard <anthony.perard@citrix.com>
---
docs/designs/qemu-deprivilege.md | 12 ++++++------
tools/libxl/libxl_dm.c | 2 ++
tools/libxl/libxl_freebsd.c | 5 +++++
tools/libxl/libxl_internal.h | 7 +++++++
tools/libxl/libxl_linux.c | 14 ++++++++++++++
tools/libxl/libxl_netbsd.c | 5 +++++
tools/tests/depriv/depriv-process-checker.sh | 18 ++++++++++++++++++
7 files changed, 57 insertions(+), 6 deletions(-)
diff --git a/docs/designs/qemu-deprivilege.md b/docs/designs/qemu-deprivilege.md
index df5bb07d7c..58d5df6072 100644
--- a/docs/designs/qemu-deprivilege.md
+++ b/docs/designs/qemu-deprivilege.md
@@ -75,12 +75,6 @@ Then adds the following to the qemu command-line:
'''Tested''': Not tested
-## Restrictions / improvements still to do
-
-This lists potential restrictions still to do. It is meant to be
-listed in order of ease of implementation, with low-hanging fruit
-first.
-
## Namespaces for unused functionality (Linux only)
'''Description''': Enter QEMU into its own mount & IPC namespaces.
@@ -102,6 +96,12 @@ call:
'''Tested''': Not tested
+# Restrictions / improvements still to do
+
+This lists potential restrictions still to do. It is meant to be
+listed in order of ease of implementation, with low-hanging fruit
+first.
+
### Basic RLIMITs
'''Description''': A number of limits on the resources that a given
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index df6fb64bee..6733514370 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -2391,6 +2391,8 @@ retry_transaction:
goto out_close;
if (!rc) { /* inner child */
setsid();
+ if (libxl_defbool_val(b_info->dm_restrict))
+ libxl__local_dm_preexec_restrict(gc, logfile_w);
libxl__exec(gc, null, logfile_w, logfile_w, dm, args, envs);
}
diff --git a/tools/libxl/libxl_freebsd.c b/tools/libxl/libxl_freebsd.c
index 6442ccec72..aed2a2b115 100644
--- a/tools/libxl/libxl_freebsd.c
+++ b/tools/libxl/libxl_freebsd.c
@@ -245,3 +245,8 @@ int libxl__pci_topology_init(libxl__gc *gc,
{
return ERROR_NI;
}
+
+void libxl__local_dm_preexec_restrict(libxl__gc *gc, int stderrfd)
+{
+ return;
+}
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 802382c704..6e5ff977a6 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -3782,6 +3782,13 @@ struct libxl__dm_spawn_state {
_hidden void libxl__spawn_local_dm(libxl__egc *egc, libxl__dm_spawn_state*);
+/*
+ * Called after forking but before executing the local devicemodel.
+ * Must call _exit(-1) on failure, printing an error message to
+ * stderrfd if available.
+ */
+_hidden void libxl__local_dm_preexec_restrict(libxl__gc *gc, int stderrfd);
+
/* Stubdom device models. */
typedef struct {
diff --git a/tools/libxl/libxl_linux.c b/tools/libxl/libxl_linux.c
index 6ef0abc693..2eeac8df9a 100644
--- a/tools/libxl/libxl_linux.c
+++ b/tools/libxl/libxl_linux.c
@@ -307,6 +307,20 @@ int libxl__pci_topology_init(libxl__gc *gc,
return err;
}
+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);
+ if (rc < 0) {
+ char *msg = GCSPRINTF("libxl: Mount and IPC namespace unfailed with error %d\n",
+ errno);
+ write(stderrfd, msg, strlen(msg));
+ _exit(-1);
+ }
+}
+
/*
* Local variables:
* mode: C
diff --git a/tools/libxl/libxl_netbsd.c b/tools/libxl/libxl_netbsd.c
index 2edfb00641..dce3f1fdce 100644
--- a/tools/libxl/libxl_netbsd.c
+++ b/tools/libxl/libxl_netbsd.c
@@ -124,3 +124,8 @@ int libxl__pci_topology_init(libxl__gc *gc,
{
return ERROR_NI;
}
+
+void libxl__local_dm_preexec_restrict(libxl__gc *gc, int stderrfd)
+{
+ return;
+}
diff --git a/tools/tests/depriv/depriv-process-checker.sh b/tools/tests/depriv/depriv-process-checker.sh
index cb240fd0ed..7dc2573799 100755
--- a/tools/tests/depriv/depriv-process-checker.sh
+++ b/tools/tests/depriv/depriv-process-checker.sh
@@ -81,6 +81,24 @@ else
echo "SKIPPED (XEN_RUN_DIR undefined)"
fi
+# 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
+
+
if $failed ; then
exit 1
else
--
2.18.0
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2018-09-21 17:04 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-21 17:04 [PATCH v2 1/6] docs/qemu-deprivilege: Revise and update with status and future plans George Dunlap
2018-09-21 17:04 ` [PATCH v2 2/6] test/depriv: Add a tool to check process-level depriv George Dunlap
2018-09-24 10:57 ` Ian Jackson
2018-09-24 14:45 ` George Dunlap
2018-09-24 11:14 ` Anthony PERARD
2018-09-21 17:04 ` [PATCH v2 3/6] tools/dm_restrict: Ask QEMU to chroot George Dunlap
2018-09-24 8:20 ` Paul Durrant
2018-09-24 9:50 ` George Dunlap
2018-09-24 9:52 ` Paul Durrant
2018-09-24 10:31 ` Ian Jackson
2018-09-21 17:04 ` George Dunlap [this message]
2018-09-24 8:24 ` [PATCH v2 4/6] tools/dm_restrict: Unshare mount and IPC namespaces on Linux Paul Durrant
2018-09-24 10:40 ` Ian Jackson
2018-09-24 14:22 ` George Dunlap
2018-09-25 10:55 ` Ian Jackson
2018-09-21 17:04 ` [PATCH v2 5/6] tools/dm_depriv: Add first cut RLIMITs George Dunlap
2018-09-24 8:34 ` Paul Durrant
[not found] ` <CAFLBxZanne777R0WfJLuGqTv3dx=A+W0Z5UsW9B0i4MFMWWKXw@mail.gmail.com>
2018-10-05 15:18 ` George Dunlap
2018-09-24 10:48 ` Ian Jackson
2018-09-24 14:41 ` George Dunlap
2018-09-25 11:03 ` Ian Jackson
2018-09-21 17:04 ` [PATCH v2 6/6] RFC: tools/dm_restrict: Enable QEMU sandboxing George Dunlap
2018-09-24 10:49 ` Ian Jackson
2018-09-24 11:16 ` George Dunlap
2018-09-24 13:04 ` Ian Jackson
2018-09-24 13:43 ` George Dunlap
2018-09-25 10:46 ` Ian Jackson
2018-09-24 11:21 ` Ian Jackson
2018-09-24 14:28 ` George Dunlap
2018-09-25 11:02 ` Ian Jackson
2018-09-25 14:24 ` George Dunlap
2018-09-26 10:57 ` Ian Jackson
2018-09-24 8:14 ` [PATCH v2 1/6] docs/qemu-deprivilege: Revise and update with status and future plans Paul Durrant
2018-09-24 10:23 ` Ian Jackson
2018-09-24 13:08 ` George Dunlap
2018-09-25 10:44 ` Ian Jackson
2018-09-25 11:20 ` Anthony PERARD
2018-09-28 11:37 ` George Dunlap
2018-09-28 12:59 ` Anthony PERARD
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180921170428.13771-4-george.dunlap@citrix.com \
--to=george.dunlap@citrix.com \
--cc=anthony.perard@citrix.com \
--cc=ian.jackson@citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.