From: Ross Lagerwall <ross.lagerwall@citrix.com>
To: qemu-devel@nongnu.org
Cc: Markus Armbruster <armbru@redhat.com>,
"Daniel P . Berrange" <berrange@redhat.com>,
Ross Lagerwall <ross.lagerwall@citrix.com>
Subject: [Qemu-devel] [PATCH v1] os-posix: Add -unshare option
Date: Thu, 19 Oct 2017 17:04:19 +0100 [thread overview]
Message-ID: <20171019160419.11611-1-ross.lagerwall@citrix.com> (raw)
Add an option to allow calling unshare() just before starting guest
execution. The option allows unsharing one or more of the mount
namespace, the network namespace, and the IPC namespace. This is useful
to restrict the ability of QEMU to cause damage to the system should it
be compromised.
An example of using this would be to have QEMU open a QMP socket at
startup and unshare the network namespace. The instance of QEMU could
still be controlled by the QMP socket since that belongs in the original
namespace, but if QEMU were compromised it wouldn't be able to open any
new connections, even to other processes on the same machine.
Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
---
os-posix.c | 34 ++++++++++++++++++++++++++++++++++
qemu-options.hx | 14 ++++++++++++++
2 files changed, 48 insertions(+)
diff --git a/os-posix.c b/os-posix.c
index b9c2343..cfc5c38 100644
--- a/os-posix.c
+++ b/os-posix.c
@@ -45,6 +45,7 @@ static struct passwd *user_pwd;
static const char *chroot_dir;
static int daemonize;
static int daemon_pipe;
+static int unshare_flags;
void os_setup_early_signal_handling(void)
{
@@ -160,6 +161,28 @@ void os_parse_cmd_args(int index, const char *optarg)
fips_set_state(true);
break;
#endif
+#ifdef CONFIG_SETNS
+ case QEMU_OPTION_unshare:
+ {
+ char *flag;
+ char *opts = g_strdup(optarg);
+
+ while ((flag = qemu_strsep(&opts, ",")) != NULL) {
+ if (!strcmp(flag, "mount")) {
+ unshare_flags |= CLONE_NEWNS;
+ } else if (!strcmp(flag, "net")) {
+ unshare_flags |= CLONE_NEWNET;
+ } else if (!strcmp(flag, "ipc")) {
+ unshare_flags |= CLONE_NEWIPC;
+ } else {
+ fprintf(stderr, "Unknown unshare option: %s\n", flag);
+ exit(1);
+ }
+ }
+ g_free(opts);
+ }
+ break;
+#endif
}
}
@@ -201,6 +224,16 @@ static void change_root(void)
}
+static void unshare_namespaces(void)
+{
+ if (unshare_flags) {
+ if (unshare(unshare_flags) < 0) {
+ perror("could not unshare");
+ exit(1);
+ }
+ }
+}
+
void os_daemonize(void)
{
if (daemonize) {
@@ -266,6 +299,7 @@ void os_setup_post(void)
}
change_root();
+ unshare_namespaces();
change_process_uid();
if (daemonize) {
diff --git a/qemu-options.hx b/qemu-options.hx
index 3728e9b..5cfcc51 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -3972,6 +3972,20 @@ Immediately before starting guest execution, chroot to the specified
directory. Especially useful in combination with -runas.
ETEXI
+#ifdef CONFIG_SETNS
+DEF("unshare", HAS_ARG, QEMU_OPTION_unshare, \
+ "-unshare [mount][,net][,ipc]\n" \
+ " unshare namespaces just before starting the VM\n",
+ QEMU_ARCH_ALL)
+#endif
+STEXI
+@item -unshare @code{[mount][,net][,ipc]}
+@findex -unshare
+Immediately before starting guest execution, unshare the specified namespaces.
+The namespaces that can be unshared are the mount namespace, the network
+namespace and the IPC namespace.
+ETEXI
+
#ifndef _WIN32
DEF("runas", HAS_ARG, QEMU_OPTION_runas, \
"-runas user change to user id user just before starting the VM\n",
--
2.9.5
next reply other threads:[~2017-10-19 16:05 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-19 16:04 Ross Lagerwall [this message]
2017-10-19 16:24 ` [Qemu-devel] [PATCH v1] os-posix: Add -unshare option Daniel P. Berrange
2017-10-23 14:30 ` Ross Lagerwall
2017-10-23 14:50 ` Daniel P. Berrange
2017-10-23 15:01 ` Ross Lagerwall
2017-10-23 15:05 ` Daniel P. Berrange
2017-10-24 12:35 ` Stefan Hajnoczi
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=20171019160419.11611-1-ross.lagerwall@citrix.com \
--to=ross.lagerwall@citrix.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=qemu-devel@nongnu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).