|
|
43fe83 |
From 340225143c8f389cb12de610f6208fa643b31fbb Mon Sep 17 00:00:00 2001
|
|
|
43fe83 |
Message-Id: <340225143c8f389cb12de610f6208fa643b31fbb.1383321465.git.jdenemar@redhat.com>
|
|
|
43fe83 |
From: "Daniel P. Berrange" <berrange@redhat.com>
|
|
|
43fe83 |
Date: Wed, 30 Oct 2013 17:01:53 +0000
|
|
|
43fe83 |
Subject: [PATCH] Only allow the UNIX transport in remote driver when setuid
|
|
|
43fe83 |
|
|
|
43fe83 |
For
|
|
|
43fe83 |
|
|
|
43fe83 |
https://bugzilla.redhat.com/show_bug.cgi?id=1015247
|
|
|
43fe83 |
|
|
|
43fe83 |
We don't know enough about quality of external libraries used
|
|
|
43fe83 |
for non-UNIX transports, nor do we want to spawn external
|
|
|
43fe83 |
commands when setuid. Restrict to the bare minimum which is
|
|
|
43fe83 |
UNIX transport for local usage. Users shouldn't need to be
|
|
|
43fe83 |
running setuid if connecting to remote hypervisors in any
|
|
|
43fe83 |
case.
|
|
|
43fe83 |
|
|
|
43fe83 |
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
|
|
|
43fe83 |
(cherry picked from commit e22b0232c7b94aefaef87c52c4d626fa532fcce3)
|
|
|
43fe83 |
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
|
|
43fe83 |
---
|
|
|
43fe83 |
src/libvirt.c | 6 ++++++
|
|
|
43fe83 |
src/remote/remote_driver.c | 14 ++++++++++++++
|
|
|
43fe83 |
2 files changed, 20 insertions(+)
|
|
|
43fe83 |
|
|
|
43fe83 |
diff --git a/src/libvirt.c b/src/libvirt.c
|
|
|
43fe83 |
index 0a024a9..8a3cc42 100644
|
|
|
43fe83 |
--- a/src/libvirt.c
|
|
|
43fe83 |
+++ b/src/libvirt.c
|
|
|
43fe83 |
@@ -1135,6 +1135,12 @@ do_open(const char *name,
|
|
|
43fe83 |
if (name && name[0] == '\0')
|
|
|
43fe83 |
name = NULL;
|
|
|
43fe83 |
|
|
|
43fe83 |
+ if (!name && virIsSUID()) {
|
|
|
43fe83 |
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
43fe83 |
+ _("An explicit URI must be provided when setuid"));
|
|
|
43fe83 |
+ goto failed;
|
|
|
43fe83 |
+ }
|
|
|
43fe83 |
+
|
|
|
43fe83 |
/*
|
|
|
43fe83 |
* If no URI is passed, then check for an environment string if not
|
|
|
43fe83 |
* available probe the compiled in drivers to find a default hypervisor
|
|
|
43fe83 |
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
|
|
|
43fe83 |
index 67daf79..b6b629c 100644
|
|
|
43fe83 |
--- a/src/remote/remote_driver.c
|
|
|
43fe83 |
+++ b/src/remote/remote_driver.c
|
|
|
43fe83 |
@@ -488,6 +488,20 @@ doRemoteOpen(virConnectPtr conn,
|
|
|
43fe83 |
transport = trans_unix;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
+ /*
|
|
|
43fe83 |
+ * We don't want to be executing external programs in setuid mode,
|
|
|
43fe83 |
+ * so this rules out 'ext' and 'ssh' transports. Exclude libssh
|
|
|
43fe83 |
+ * and tls too, since we're not confident the libraries are safe
|
|
|
43fe83 |
+ * for setuid usage. Just allow UNIX sockets, since that does
|
|
|
43fe83 |
+ * not require any external libraries or command execution
|
|
|
43fe83 |
+ */
|
|
|
43fe83 |
+ if (virIsSUID() &&
|
|
|
43fe83 |
+ transport != trans_unix) {
|
|
|
43fe83 |
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
43fe83 |
+ _("Only Unix socket URI transport is allowed in setuid mode"));
|
|
|
43fe83 |
+ return VIR_DRV_OPEN_ERROR;
|
|
|
43fe83 |
+ }
|
|
|
43fe83 |
+
|
|
|
43fe83 |
/* Local variables which we will initialize. These can
|
|
|
43fe83 |
* get freed in the failed: path.
|
|
|
43fe83 |
*/
|
|
|
43fe83 |
--
|
|
|
43fe83 |
1.8.4.2
|
|
|
43fe83 |
|